最近这一周的临时任务实在是重,好几个晚上都很晚才回去。
自己的Javacc开发任务也有所耽搁,下个周也不轻松。所以只好抽晚上程序跑数的时间来更新一下。
Lex是词法解析程序,擅长用正则表达式去匹配词组;而Yacc擅长于对复杂语法的分析,两者结合起来能使代码高效且维护更简单。
下面我们用lex与Yacc写一个计算器的例子,这个例子很经典,到处都可以找到,我的例子来自于《lex与yacc 第二版》第三章的第一个例子ch03-01.l和ch03-01.y。
yc03.y
%token NUMBER //终结符标记。
%type exp term //非终结符标记,多个标记之间使用空格分开
%%
command : exp { printf("=%d\n",$1); }
;
exp : exp '+' term {$$ = $1 + $3;} //$N表示第N个表达式的值;$$表示冒号:左边的表达式
| exp '-' term {$$ = $1 - $3;} //$N所代表的引用值,为yylval的值,该值默认为int类型。
| term {$$ = $1;}
;
term : term '*' factor {$$ = $1 * $3;}
| term '/' factor
{
if($3==0)
yyerror("divide by zero");
else
$$ = $1/$3;
}
| factor {$$ = $1;}
;
factor : NUMBER {$$ = $1; printf("NUMBER \n");}
| '(' exp ')' {$$ = $2;}
;
使用下面的命令来编译yacc程序:
yacc -oyc03.c -d yc03.y 【这里使用:-d参数,是为了方便生成.h文件,以便flex程序引用】
gcc -c ./yc03.c 【编译.c文件】
%{
#include "yc03.h" //这里引用yacc生成的.h文件
extern int yylval; //使用yacc中的yylval变量,将lex中得到的值传递给yacc
%}
%%
[0-9]+ { yylval = atoi(yytext); return NUMBER; } //yytext为满足当前表达式的字符串,return NUMBER表示向Yacc返回NUMBER终结符标记
[ \t] ;
\n return 0; /* logical EOF */
. { return yytext[0]; }
%%
int main(){
yylex();
return(0);
}
使用下面的命令来编译flex程序:
flex -ofl03.c fl03.l
gcc -c ./fl03.c
使用下面的命令来连接flex和yacc生成的.o文件
gcc -o fl03 fl03.o yc03.o -ly -lfl
上面的例子只是讲述了lex与Yacc的结合,能简单解决部分算术运算,且只支持整数。要想支持整数,则需要将yylval的类型重新定义为double类型。而且,上面的例子还没有考虑到带符号的表达式和乘方等,后者可以引入C的math.c进行计算。
分享到:
相关推荐
A Compact Guide to Lex & Yacc 的源代码
从lex&yacc说到编译器(二)flex的使用
介绍flex-bison的使用,用简单的例子做示例,快速掌握两者的使用,其中有大量的例子进行解析
Lex与Yacc第二版高清版,扫描版,有目录
本例子虽小却演示了lex/yacc程序最常见和重要的特征: * lex/yacc文件格式、程序结构。 * 如何在lex/yacc中使用C++和STL库,用extern "C"声明那些lex/yacc生成的、要链接的C函数,如yylex(), yywrap(), yyerror()。 ...
详细实用的lex工具书:lex_yacc工具说明
flex.exe和bison.exe是UnxUtils包中的文件,已经将许多Unix/Linux平台的程序都移植到了Windows平台,解压缩之后在系统的PATH环境变量中增加UnxUtils所有的exe文件所在的目录,使 得DOS命令行可以直接搜索到flex.exe...
内有lex和yacc第二版及程序源代码、flex与bison第二版以及其他相关书籍
2.lexyacc-simple.tgz,一个简单的simple语言的编译器,可以解释执行,也可编译为栈机器的汇编语言。 3.cc-ansi99-parser_20130313_082654.tgz,一个ansi99标准的C语言的编译器,只进行词法和语法分析,不生成目标...
Yacc Lex 资料集 包括: Flex&Bison中 英文版 pdf lex与yacc中 英文版 pdf calc 计算器实例源代码 Windows下的flex bison 工具 及其他应用论文 资料等
Windows平台下学习Lex与Yacc的必备工具,flex-2.5.4a-1.exe 和 bison-2.4.1-setup.exe 以及 cygwin2.738 的安装文件
压缩包包含两个程序: bison-2.4.1-setup.exe\flex-2.5.4a-1...绝对可用,本人亲试,如果编译不成功的可能是你写的lex\yacc文件有问题,用一个好的示例文件进行编译就知道这可以用了(血泪教训啊,当初还以为不能用呢)
非常好用的windows下的yacc 和 flex工具 非常好用的windows下的yacc 和 flex工具 非常好用的windows下的yacc 和 flex工具 说三遍哟
lexyacc-计算器这个解释器包括 2 个文件来运行一个 flex 文件和一个 yacc 文件。 打开终端并转到这些文件所在的文件夹编写命令 lex bc.l 来编译 lex 文件然后写yacc term1.y编译yacc文件,这会生成y.tab.c 然后用c...
学习编译原理的好资料,清晰版,只有前5章,入门已经够用了