最近从本科时候的资料中翻到了编译原理的资料,翻到了部分lex与yacc学习的资料和部分程序,后来又模仿老师给我们的例子程序写了一个简单的计算器,供初学者参考,也作为自己的一个学习笔记。
关于lex现在常用的是GNU的Flex,主页是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。使得栈中的存储类型为int。yacc中数据分为类型与数值,例如
{numbers} {
sscanf(yytext, "%d", &yylval);
return INTEGER;
}
中表示当前的数值类型为INTEGER,值则存储在yylval中。由此可见lex与yacc之间的数值主要通过提前约定的全局函数实现。
关于lex与yacc就介绍到这里,文中纰漏甚多,敬请海涵。
这篇博客介绍了如何使用Flex和Yacc构建一个简单的计算器,实现带括号的整数加减乘除运算。首先讲解了Flex(lex的现代版本)作为词法分析器如何通过正则表达式生成token,接着解释了Yacc作为语法分析器如何结合Flex完成更复杂的功能。文章提供了一份简单的源代码示例,并阐述了它们的工作原理。
695

被折叠的 条评论
为什么被折叠?



