以下是一个使用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生成递归下降解析器,并处理了运算符的优先级。实际上,还可以通过添加其他规则和动作来处理更复杂的语法和操作。