
一个关于Lex/Yacc的完整实例(支持C++)
5星
- 浏览量: 0
- 大小:None
- 文件类型:None
简介:
本实例详细介绍如何使用Lex和Yacc工具实现解析器,并提供了一个完整的C++兼容示例,帮助读者理解和应用这些技术。
作者:胡彦本框架是一个使用lex/yacc的完整示例程序,旨在帮助学习者了解如何在Linux/Cygwin环境下搭建一个基本的Lex/Yacc项目,并通过简单的命令(如make)进行编译与执行。
此示例虽小但涵盖了Lex/Yacc编程中的一些关键特性:
- Lex和Yacc文件的基本格式及结构。
- 如何将C++和STL库集成到Lex/Yacc程序中,包括使用`extern C`声明生成的函数(如yylex(), yywrap() 和yyerror())以确保正确链接。
- 重定义YYSTYPE/yylval为复杂数据类型的方法。
- 使用%token<>来声明Yacc标记以及用%type<>来指定非终结符的数据类型。
- 在Lex中定义和识别正则表达式的技巧,包括如何使用yylval向Yacc传递属性值。
- 如何在嵌入C代码的动作块内正确引用记号(如$1, $2等)的属性以及非终结符的属性($$)。
- 重定向yyin/yyout以改变默认输入输出流的目标。
- 开始(yyparse函数)和结束或继续解析(yywrap函数)的方法。
本示例程序的功能是读取当前目录下的file.txt文件,并从中识别出标识符、数字和其他符号,然后将这些信息显示在屏幕上。此项目是在Ubuntu 10.04环境下调试完成的,它为用户提供了一个良好的起点去扩展成为一个计算器或者用于《编译原理》课程设计的基础框架。
该项目包含以下主要文件:
- lex.l: Lex程序源代码。
- yacc.y: Yacc程序源代码。
- main.hpp: 共用头文件。
- Makefile: 构建脚本。
- file.txt: 示例文本输入文件,供解析使用。
使用说明如下:
1. 将lex_yacc_example.rar解压至Linux/Cygwin目录下;
2. 进入该目录;
3. 输入make命令执行以下自动操作:
1) 调用flex编译.l文件生成lex.yy.c。
2) 使用bison处理.y文件,产生yacc.tab.c和yacc.tab.h两个源代码文件。
3) 利用g++进行编译链接,最终创建可执行程序main。
4) 运行该程序以解析file.txt内容并输出结果。
以上步骤完成后,您将看到如下输出:
```
id: abcd
int: 123
op: !
...
```
全部评论 (0)


