Professional Documents
Culture Documents
Todays goal
3 10 5 16 8 4 2 1
Todays contents
%{
C declarations
%}
Flex declarations
%%
Flex grammar rules
%%
Additional C code
0
4
3
4
0
0
4
0
0
0
0
0
2
%{
#include <stdio.h>
int s[4];
void printstack();
void push(int);
void add();
void sub();
void mul();
%}
DIGIT [09]
%%
\n {printf(result=%d\n,s[0]);}
{DIGIT}+ {push(atoi(yytext)); printstack();}
\+ {add(); printstack();}
{sub(); printstack();}
\ {mul(); printstack();}
%%
void printstack(){
printf(%d %d %d %d\n,s[0],s[1],s[2],s[3]);
}
void push(int x){
s[3]=s[2];
s[2]=s[1];
s[1]=s[0];
s[0]=x;
}
void add(){
s[0]=s[1]+s[0];
s[1]=s[2];
s[2]=s[3];
}
void sub(){
s[0]=s[1]s[0];
s[1]=s[2];
s[2]=s[3];
}
void mul(){
s[0]=s[1]s[0];
s[1]=s[2];
s[2]=s[3];
}
%{
C declarations
%}
Bison declarations
%%
Bison grammar rules
%%
Additional C code
10 0 0 0
1 10 0 0
9 0 0 0
result=9
1 input empty
3
#include <stdio.h>
%}
%token NUMBER
%%
input :
| input expr \n { printf(result=%d\n,$2); }
;
expr : NUMBER
| expr expr + { $$ = $1 + $2; }
| expr expr { $$ = $1 $2; }
| expr expr { $$ = $1 $2; }
;
%%
int yylex(){
int c;
while((c=getchar())!=EOF){
if(isdigit(c)){
ungetc(c,stdin);
scanf(%d,&yylval);
return(NUMBER);
} else if(c==+|c==|c==|c==\n)
return(c);
}
}
int yyerror(char s){printf(%s\n,s);}
int main(){yyparse();}
yylex
yylex
yylex
expr32 +1 \n
exprNUMBER2 +1 \n
exprexpr2 +1 \n
exprexprNUMBER +1 \n
exprexprexpr + 1 \n
exprexpr+1 \n
expr1 \n
exprNUMBER \n
exprexpr\n
emptyexpr\n
inputexpr\n
input
the semantic value of the left side expr. In general, for any integer i, $i is the semantic value of i-th non-terminal/terminal
symbol in the right side, and $$ is the semantic value of the
left side non-terminal symbol.
%{
#include <stdio.h>
%}
%left +
%left
%token NUMBER
%%
input :
| input expr \n { printf(result=%d\n,$2); }
;
expr : NUMBER
| expr + expr { $$ = $1 + $3;}
| expr expr { $$ = $1 $3;}
| expr expr { $$ = $1 $3;}
;
%%
int yylex(){
int c;
while((c=getchar())!=EOF){
if(isdigit(c)){
ungetc(c,stdin);
scanf(%d,&yylval);
return(NUMBER);
} else if(c==+|c==|c==|c==\n)
return(c);
}
}
int yyerror(char s){printf(%s\n,s);}
int main(){yyparse();}
$ flex infix2.l
$ bison -d -y infix2.y
$ gcc -o infix2 lex.yy.c y.tab.c
Flex program generates scanner lex.yy.c. Bison program
generates parser y.tab.c and its header file y.tab.h.
5
%{
#include y.tab.h
%}
%%
[09]+ {yylval=atoi(yytext);return(NUMBER);}
\+||\|\n {return(yytext[0]);}
%%
int yywrap(){return(1);}
%{
#include <stdio.h>
%}
%left +
%left
%token NUMBER
%%
input :
| input expr \n { printf(result=%d\n,$2); }
;
expr : NUMBER
| expr + expr { $$ = $1 + $3;}
| expr expr { $$ = $1 $3;}
| expr expr { $$ = $1 $3;}
;
%%
int yyerror(char s){printf(%s\n,s);}
int main(){yyparse();}
7.1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
;
label : NAME : {printf(%s:\n,$1);}
;
intdef: INT intlist ;
;
intlist: integer
| intlist , integer
;
integer: NAME {printf(%s: 0\n,$1);}
| NAME = NUMBER {printf(%s: %s\n,$1,$3);}
| NAME = NUMBER {printf(%s: %s\n,$1,$4
);}
;
goto: GOTO NAME ; {printf(\tJMP %s\n,$2);}
;
if: IF ( expr ) GOTO NAME ; {printf(\tJNZ %s\n,$6);}
;
unless: UNLESS ( expr ) GOTO NAME ; {printf(\tJZ %s
\n,$6);}
;
halt : HALT ; {printf(\tHALT\n);}
;
out: OUT ( expr ) ; {printf(\tOUT\n);}
;
assign: NAME = expr ; {printf(\tPOP %s\n,$1);}
;
expr: NAME {printf(\tPUSH %s\n,$1);}
| NUMBER {printf(\tPUSHI %s\n,$1);}
| IN {printf(\tIN\n);}
| expr + expr {printf(\tADD\n);}
| expr expr {printf(\tSUB\n);}
| expr expr {printf(\tMUL\n);}
| expr EQ expr {printf(\tEQ\n);}
;
%%
int yyerror(char s){ printf(%s\n,s); }
int main(){ yyparse(); }
3
out(n);
4
unless(n) goto L2;
5
n=n1;
6
goto L1;
7 L2:
8
halt;
9
int n;
IN
POP n
PUSH n
OUT
PUSH n
JZ L2
PUSH n
PUSHI 1
SUB
POP n
JMP L1
HALT
Homework