-
大小: 52KB文件类型: .rar金币: 2下载: 1 次发布日期: 2021-06-25
- 语言: C/C++
- 标签: Lex_Yacc 编译原理 课程设计 cygwin_C++
资源简介
作者: 胡彦
本框架是一个lex/yacc完整的示例,用于学习lex/yacc程序基本的搭建方法,在linux/cygwin下敲入make就可以编译和执行。
本例子虽小却演示了lex/yacc程序最常见和重要的特征:
* lex/yacc文件格式、程序结构。
* 如何在lex/yacc中使用C++和STL库,用extern "C"声明那些lex/yacc生成的、要链接的C函数,如yylex(), yywrap(), yyerror()。
* 重定义YYSTYPE/yylval为复杂类型。
* 用%token方式声明yacc记号。
* 用%type方式声明非终结符的类型。
* lex里正则表达式的定义、识别方式。
* lex里用yylval向yacc返回属性值。
* 在yacc嵌入的C代码动作里,对记号属性($1, $2等)、和非终结符属性($$)的正确引用方法。
* 对yyin/yyout重赋值,以改变yacc默认的输入/输出目标。
* 如何开始解析(yyparse函数),结束或继续解析(yywrap函数)。
本例子功能是,对当前目录下的file.txt文件,解析出其中的标识符、数字、其它符号,显示在屏幕上。linux调试环境是Ubuntu 10.04。
总之,大部分框架已经搭好了,你只要稍加扩展就可以成为一个计算器之类的程序,用于《编译原理》的课程设计。
文件列表:
lex.l: lex程序文件。
yacc.y: yacc程序文件。
main.hpp: 共同使用的头文件。
Makefile: makefile文件。
file.txt: 给程序解析的文本文件。
使用方法:
1-把lex_yacc_example.rar解压到linux/cygwin下。
2-命令行进入lex_yacc_example目录。
3-敲入make,这时会自动执行以下操作:
(1) 自动调用flex编译.l文件,生成lex.yy.c文件。
(2) 自动调用bison编译.y文件,生成yacc.tab.c和yacc.tab.h文件。
(3) 自动调用g++编译、链接出可执行文件main。
(4) 自动执行main,得到如下结果:。
bison -d yacc.y
g++ -c lex.yy.c
g++ -c yacc.tab.c
g++ lex.yy.o yacc.tab.o -o main
id: abc
id: defghi
int: 123
int: 45678
op: !
op: @
op: #
op: $
AllId: abc defghi
参考资料:《Lex和Yacc从入门到精通(6)-解析C-C++包含文件》, http://blog.csdn.net/pandaxcl/article/details/1321552
其它文章和代码请留意我的blog: http://blog.csdn.net/huyansoft
2013-4-27
代码片段和文件信息
#line 3 “lex.yy.c“
#define YY_INT_ALIGNED short int
/* A lexical scanner generated by flex */
#define FLEX_SCANNER
#define YY_FLEX_MAJOR_VERSION 2
#define YY_FLEX_MINOR_VERSION 5
#define YY_FLEX_SUBMINOR_VERSION 35
#if YY_FLEX_SUBMINOR_VERSION > 0
#define FLEX_BETA
#endif
/* First we deal with platform-specific or compiler-specific issues. */
/* begin standard C headers. */
#include
#include
#include
#include
/* end standard C headers. */
/* flex integer type definitions */
#ifndef FLEXINT_H
#define FLEXINT_H
/* C99 systems have . Non-C99 systems may or may not. */
#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h
* if you want the limit (max/min) macros for int types.
*/
#ifndef __STDC_LIMIT_MACROS
#define __STDC_LIMIT_MACROS 1
#endif
#include
typedef int8_t flex_int8_t;
typedef uint8_t flex_uint8_t;
typedef int16_t flex_int16_t;
typedef uint16_t flex_uint16_t;
typedef int32_t flex_int32_t;
typedef uint32_t flex_uint32_t;
#else
typedef signed char flex_int8_t;
typedef short int flex_int16_t;
typedef int flex_int32_t;
typedef unsigned char flex_uint8_t;
typedef unsigned short int flex_uint16_t;
typedef unsigned int flex_uint32_t;
/* Limits of integral types. */
#ifndef INT8_MIN
#define INT8_MIN (-128)
#endif
#ifndef INT16_MIN
#define INT16_MIN (-32767-1)
#endif
#ifndef INT32_MIN
#define INT32_MIN (-2147483647-1)
#endif
#ifndef INT8_MAX
#define INT8_MAX (127)
#endif
#ifndef INT16_MAX
#define INT16_MAX (32767)
#endif
#ifndef INT32_MAX
#define INT32_MAX (2147483647)
#endif
#ifndef UINT8_MAX
#define UINT8_MAX (255U)
#endif
#ifndef UINT16_MAX
#define UINT16_MAX (65535U)
#endif
#ifndef UINT32_MAX
#define UINT32_MAX (4294967295U)
#endif
#endif /* ! C99 */
#endif /* ! FLEXINT_H */
#ifdef __cplusplus
/* The “const“ storage-class-modifier is valid. */
#define YY_USE_CONST
#else /* ! __cplusplus */
/* C99 requires __STDC__ to be defined as 1. */
#if defined (__STDC__)
#define YY_USE_CONST
#endif /* defined (__STDC__) */
#endif /* ! __cplusplus */
#ifdef YY_USE_CONST
#define yyconst const
#else
#define yyconst
#endif
/* Returned upon end-of-file. */
#define YY_NULL 0
/* Promotes a possibly negative possibly signed char to an unsigned
* integer for use as an array index. If the signed char is negative
* we want to instead treat it as an 8-bit unsigned char hence the
* double cast.
*/
#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
/* Enter a start condition. This macro really ought to take a parameter
* but we do it the disgusting crufty way forced on us by the ()-less
* definition of BEGIN.
*/
#define BEGIN (yy_start) = 1 + 2 *
/* Translate the current start state into a value that can be later handed
* to BEGIN to return to the state. The
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
....... 2022 2013-04-27 17:09 lex_yacc_example\yacc.tab.h
....... 42722 2013-04-27 17:09 lex_yacc_example\yacc.tab.c
文件 606 2013-04-27 15:21 lex_yacc_example\main.hpp
文件 32 2013-04-27 15:56 lex_yacc_example\file.txt
文件 1973 2013-04-27 17:00 lex_yacc_example\lex.l
文件 1783 2013-04-27 17:32 lex_yacc_example\README.txt
文件 35430 2013-04-27 17:09 lex_yacc_example\main
....... 27024 2013-04-27 17:09 lex_yacc_example\lex.yy.o
....... 46235 2013-04-27 17:07 lex_yacc_example\lex.yy.c
文件 3118 2013-04-27 17:09 lex_yacc_example\yacc.y
文件 320 2013-04-27 15:25 lex_yacc_example\Makefile
....... 12464 2013-04-27 17:09 lex_yacc_example\yacc.tab.o
目录 0 2013-04-27 17:32 lex_yacc_example
----------- --------- ---------- ----- ----
173729 13
- 上一篇:c++builder2010 授权文件
- 下一篇:回溯算法实现5皇后问题
相关资源
- 宠物管理系统课程设计(源码+数据库
- 北邮-编译原理-词法分析
- c语言课程设计:客房登记系统源码
- 8位竞赛抢答器的课程设计报告.docx
- 现代编译原理-C语言描述
- VC++MFC课程设计的学生成绩管理系统
- C++实现21点游戏
- c++课程设计学生管理系统浙工大源码
- 课程设计: MFC 学生信息管理系统
- dsp课程设计——语音加密.zip
- 编译原理实验报告+代码+使用说明
- 广东工业大学数据结构课程设计航空
- 数据结构课程设计扑克牌排序
- c++课程设计宾馆客房管理系统
- c语言课程设计-职工信息管理系统-单
- 飞机票订购系统C语言课程设计报告全
- c++ 课程设计_中国象棋
- 编译原理课程设计-C语言子集编译器
- 操作系统课程设计(银行家算法)附
- 用c写的航空订票系统 航班信息改变
- 信息论课程设计——LZW编码
- 人员管理系统 c语言源码 课程设计专
- MFC课程设计学生管理系统
- vc++课程设计 让计算机来猜测用户“暗
- 赋值语句翻译c语言实现四元式
- 职工工作量统计系统.rar
- 扫雷游戏.cpp C++ 课程设计
- 编译原理用C++消除左递归
- 编译原理简易C编译器
- 实现语法分析器-编译原理
评论
共有 条评论