flex和bison学习-简易计算器
flex中的文件 flex1-1.l
%{ #include "z.tab.h" int yylval; %} %% [0-9]+ { yylval = atoi(yytext); return NUMBER; } "+" { return ADD; } "-" { return MIN; } "*" { return MUL; } "/" { return DIV; } [ \t]+ { } \n { return EOL; } . { printf("Error = %c\n", *yytext); } %%
bison中的文件 bison1-1.y
%{ #include <stdio.h> int main(int argc, char **argv); int yylex(); void yyerror(const char *s); %} %token NUMBER; %token ADD; %token MIN; %token MUL; %token DIV; %token EOL; %% calculater: | calculater exp EOL { $$ = $2; printf("计算结果= %8d\n", $$); } ; exp: factor | exp ADD factor { $$ = $1 + $3; } | exp MIN factor { $$ = $1 - $3; } ; factor: term | factor MUL term { $$ = $1 * $3; } | factor DIV nozero { $$ = $1 / $3; } ; term: NUMBER ; nozero: NUMBER { $$ = $1 != 0 ? $1 : 1; } ; %% int main(int argc, char **argv) { yyparse(); return 0; } void yyerror(const char *s) { fprintf(stderr, "error = %s\n", s); }
执行命令:
bison -d bison1-1.y /* 会生成 bison1-1.tab.h bison1-1.tab.c */
flex flex1-1.l /* 会生成 lex.yy.c */
cc $@ bison1-1.tab.c lex.yy.c -ll -o cal /* $@目标文件 -o要输出的文件 即生成可执行文件 cal */
./cal
注意:
- flex文件中不需要main函数。
- flex文件中的yylval要声明,否则会报错
- bison文件中,flex文件中设计的变量要用%token声明下
- bison文件中,要对设计到的函数进行声明
- flex文件是词法分析文件, bison文件中是语法分析文件
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix