使用lex与yacc构建简单计算器

这篇博客介绍了如何使用Flex和Yacc构建一个简单的计算器,实现带括号的整数加减乘除运算。首先讲解了Flex(lex的现代版本)作为词法分析器如何通过正则表达式生成token,接着解释了Yacc作为语法分析器如何结合Flex完成更复杂的功能。文章提供了一份简单的源代码示例,并阐述了它们的工作原理。

 

 

 

最近从本科时候的资料中翻到了编译原理的资料,翻到了部分lexyacc学习的资料和部分程序,后来又模仿老师给我们的例子程序写了一个简单的计算器,供初学者参考,也作为自己的一个学习笔记。

关于lex现在常用的是GNUFlex,主页是http://flex.sourceforge.net/,其中有相关文档,以及程序源代码。在 Windows下一版可以直接下载Flex.exe,lex主要是一个词法分析器他只要通过正则对字符串进行分析,生成一系列逻辑单元,通常被称为记号 (token)lex的主要工作就是将字符串分解为token串,每个token代表特定的意义。

Yacc是一个LALR(1)的语法分析器,通过与lex相结合,就可以完成比较复杂的功能。

已实现的功能:带括号的整数加减乘除运算。

代码 scan.l

 

 

Calcs.y


 

 

 

编译

 


 

 

其中lex yacc 程序需要放在环境变量中的PATH下,gcc 可以换成其他的编译器,按照以上操作,一个简单的计算器就完成了。

 

工作原理介绍:

经典的lex文件格式为

scan.l的定义中在%%。。。%%中定义了一系列的模式以及行为,例如 

每当词法分析遇到满足numbers的字符串时,就会执行大括号中的函数。其中的行为都封装在 int yylex()函数中,每次调用yylex时,就会执行当前遇到的token对应的代码。

       YACC 则通过调用yylex函数获得词法分析结果。

calc.y

#define YYSTYPE int 重定义YYSTYPE。使得栈中的存储类型为intyacc中数据分为类型与数值,例如

{numbers} {

              sscanf(yytext, "%d", &yylval);

                return INTEGER;

}

中表示当前的数值类型为INTEGER,值则存储在yylval中。由此可见lexyacc之间的数值主要通过提前约定的全局函数实现。

关于lexyacc就介绍到这里,文中纰漏甚多,敬请海涵。

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值