110 likes | 202 Views
Syntactic Analysis Tools. Natawut Nupairoj, Ph.D. Department of Computer Engineering Chulalongkorn University. Outline. Overview. Yacc Specification Format. Examples. Parser Generator. Yacc Specification. A Yacc source program has three parts: declarations %% translation rules %%
E N D
Syntactic Analysis Tools Natawut Nupairoj, Ph.D. Department of Computer Engineering Chulalongkorn University
Outline • Overview. • Yacc Specification Format. • Examples.
Yacc Specification • A Yacc source program has three parts: declarations %% translation rules %% supporting C-routines
Example: Calculator Program %{ #include <stdio.h> %} %token DIGIT %% line : expr '\n' { printf("%d\n", $1); } ; expr : expr '+' term { $$ = $1 + $3; } | term ; term : term '*' factor { $$ = $1 * $3; } | factor ; factor : '(' expr ')' { $$ = $2; } | DIGIT ; %%
Example: Calculator Program yylex() { int c; c = getchar(); if(c >= '0' && c <= '9') { yylval = c - '0'; return DIGIT; } return c; } yyerror(char* errmsg) { fprintf(stderr, "%s\n", errmsg); } main(int argc, char** argv) { yyparse(); return 0; }
How to use Yacc with Lex • yyparse calls yylex to get the next token automatically. • yylex returns: • token type or 0 (EOF). • yylval - token attribute. • Tokens are defined in yacc definition • Lex definition can get them through “y.tab.h”.
Example: Yacc with Lex (Yacc) %{ #include <stdio.h> %} %token EOL NUMBER %% line : expr EOL { printf("%d\n", $1); } ; expr : expr '+' term { $$ = $1 + $3; } | term ; term : term '*' factor { $$ = $1 * $3; } | factor ; factor : '(' expr ')' { $$ = $2; } | NUMBER ; %%
Example: Yacc with Lex (Yacc) yyerror(char* errmsg) { fprintf(stderr, "%s\n", errmsg); } main(int argc, char** argv) { yyparse(); return 0; }
Example: Yacc with Lex (Lex) %{ /* define constants for C program here */ #include <stdlib.h> #include "y.tab.h" extern int yylval; %} /* regular definitions */ delim [ \t] ws {delim}+ eol \n number [0-9]+ symbol [\+\*\(\)] %% {ws} {/* no action and no return */} {eol} { return EOL; } {number} { yylval = atoi(yytext); return(NUMBER); } {symbol} { return yytext[0]; } %%
Compile Yacc and Lex byacc –d calc.y flex calc.l gcc –o calc y.tab.c lex.yy.c -lfl