Monday, April 6, 2009

source code

CALCI.l

%{
Include
#include “y.tab.h”
int c;
extern int yylval;
%}

%%
“ “;
[a-z]{
c=yytext[0];
yylval=c-‘a’;
return(LETTER);
}
[0-9]{
c=yytext[0];
yylval=c-‘0’;
return(DIGIT);
}
[^a-z0-9\b]{
c==yytext[0];
return(c);
}


CALCI.y

%{
#include
int regs[26];
int base;
%}
%start list
%token DIGIT LETTER
%left ‘|’
%left’&’
%left’+’’-‘
%left ‘*’’/’’%’
%left UMINUS /*supplies precedence for unary minus */
%% /*beginning of rules section */
list: /*empty*/
|
list stat ‘\n’
|
list error ‘\n’
{
yyerrok;
}
;
stat: expr
{
printf(“%d\n”,$1);
}
|
LETTER ‘=’expr
{
regs[$1]=$3;
}
;
expr: ‘(‘expr’)’
{
$$=$2;
}
|
expr ‘*’expr
{
$$=S1*$3;
}
|
expr’/’expr
{
$$=$1/$3;
}
|
expr’%’expr
{

$$=$1%$3;
}
|
expr’+’expr
{
$$=$1+$3;
}
|
expr’-‘expr
{
$$=$1-$3;
}
|
expr’&’expr
{
$$=$1&$3;
}
|
expr’|’expr
{
$$=$1|$3;
}
|
‘-‘expr%prec UMINUS
{
$$=-$2;
}
|
LETTER
{
$$=regs[$1];
}
|
number
;
number: DIGIT
{
$$=$1;
base=($1==0)?8:10;
}|
number DIGIT
{
$$=base*$1+$2;
}
;
%%
main()
{
return(yyparse());
}
yyerror(S)
char *s;
{
fprintf(stderr,”%s\n”,s);
}
yywrap()
{
return(1);
}

OUTPUT:

[root@pbce tcse]# lex calci.l
[root@pbce tcse]#yacc –d calci.y
[root@pbce tcse]#cc y.tab.c lex.yy.c
[root@pbce tcse]# ./a.out
2+2
4
M=4
2*m+(m/m)
9
8*2
16
6/2
3