一、基本使用
1.lex的使用
flex test.l //会生成C文件lex.yy.c
gcc lex.yy.c //编译生成可执行文件
2.lex和yacc联合使用
bison -d test.y //会生成test.tab.h test.tab.c
flex test.1 //会生成C文件lex.yy.c
gcc lex.yy.c test.tab.c //编译生成可执行文件
二、新手框架
单独使用lex的新手框架
%{
%}
%%
%%
int main(int argc, char **argv)
{
yylex()
return 0;
}
int yywrap()
{
return 1;
}
联合使用时lex的新手框架
%{
#include "y.tab.h"
void yyerror(char *);
%}
%%
%%
联合使用时yacc的新手框架
%{
int yylex(void);
void yyerror(char *);
%}
%token
%%
%%
void yyerror(char *str){
fprintf(stderr,"error:%s\n",str);
}
int yywrap(){
return 1;
}
int main()
{
yyparse();
}
三、优先级
1.词法定义中,先定义的token优先级 > 后定义的token优先级
2.在Yacc/Bison中使用 %left 指令时,后定义的运算符会具有更高的优先级,这是因为Yacc/Bison解析器根据指令出现的顺序来确定运算符的优先级。
具体来说,当我们定义 %left '+' '-' 时,加法和减法的优先级相同且较低。然后,当我们定义 %left '*' '/' 时,乘法和除法的优先级比加法和减法高。这意味着在解析表达式时,乘法和除法的优先级更高,会先被处理。
如果我们反过来定义 %left '*' '/' 和 %left '+' '-',那么加法和减法的优先级将会比乘法和除法高。所以,定义 %left 指令时,后定义的运算符具有更高的优先级