lex和yacc快速入门
联合使用lex和yacc来生成一个四则运算器,源代码如下:
1,lex源文件calc.l:
Lex & Yacc Tutorial
%{ #include <stdlib.h> void yyerror(char *); #include "calc.tab.h" %} %% [0-9]+ { yylval = atoi(yytext); return INTEGER; } [-+*/\n] return *yytext; [\n\t]* ;/* 去除空格 */ . yyerror("无效字符"); %% int yywrap(void) { return 1; }2,yacc源文件calc.y:
%{ #include <stdio.h> #include <stdlib.h> int yylex(void); void yyerror(char *); %} %token INTEGER %left '+' '-' %left '*' '/' %% line: line expr '\n' { printf("%d\n", $2);} |; expr: INTEGER { $$ = $1; } | expr '*' expr { $$ = $1 * $3; } | expr '/' expr { $$ = $1 / $3; } | expr '+' expr { $$ = $1 + $3; } | expr '-' expr { $$ = $1 - $3; } ; %% void yyerror(char *s) { printf("%s\n", s); } int main(void) { yyparse(); return 0; }3,makefile文件:
yacc=bison lex=lex all: $(yacc) -d calc.y $(lex) calc.l gcc -o bc *.c clean: rm -rf *.c bc *.h4,更多参考:
Lex & Yacc Tutorial