以下是一个使用Bison解析器生成递归下降解析器的示例,演示了优先级的处理:
首先,创建一个名为parser.y
的Bison源文件,并添加以下内容:
%{
#include
int yylex();
void yyerror(const char *);
%}
%token NUMBER
%left '+' '-'
%left '*' '/'
%%
expr: expr '+' expr
| expr '-' expr
| expr '*' expr
| expr '/' expr
| '-' expr
| '(' expr ')'
| NUMBER
;
%%
void yyerror(const char *msg) {
fprintf(stderr, "Error: %s\n", msg);
}
int main() {
yyparse();
return 0;
}
然后,创建一个名为lexer.l
的Flex源文件,并添加以下内容:
%{
#include "parser.tab.h"
%}
%%
[0-9]+ { yylval = atoi(yytext); return NUMBER; }
[-+\/*\(\)] { return yytext[0]; }
[ \t] ; // 忽略空格和制表符
\n { return 0; } // 终止符
. { yyerror("Invalid character"); }
%%
int main() {
yyparse();
return 0;
}
接下来,使用以下命令生成解析器的C代码:
bison -d parser.y
flex lexer.l
gcc -o parser lex.yy.c parser.tab.c
最后,运行生成的解析器:
./parser
然后,您可以输入表达式进行解析,例如:
1 + 2 * 3
解析器将计算并输出结果。
请注意,此示例仅演示了如何使用Bison和Flex生成递归下降解析器,并处理了运算符的优先级。实际上,还可以通过添加其他规则和动作来处理更复杂的语法和操作。