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文件中是语法分析文件
posted @   jisa  阅读(197)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· 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
点击右上角即可分享
微信分享提示