编译原理上机报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

编译原理上机报告

组员:

班级:

一、上机题目:

实现一个简单的语言(Core Programming Language,CPL)的编译器(解释器)(或者其他自己想完成的编译器)

二、上机目的

加深编译原理基础知识的理解:词法分析、语法分析、语法制导翻译等

加深相关基础知识的理解:数据结构、操作系统等

提高编程能力

锻炼独立思考和解决问题的能力

三、上机要求

1、功能要求

接收以CPL编写的程序,对其进行词法分析、语法分析、语法制导翻译等,然后能够正确的执行程序

2、验收要求

条件:

1.完成CPL词法分析器;

2.完成CPL语法分析器;

3.完成CPL语法制导翻译;

方法:

1.演示程序的功能;

2.解释程序的源代码;

四,基本步骤

1.分别配置Parser Generator、Visual C++;

2.使用Parser Generator创建一个工程number

编写l文件mylexer.l;

编译mylexer.l,生成mylexer.h与mylexer.c;

3.安装Parser Generator、Visual C++;

4.使用VC++创建Win32 Console Application工程number

配置该项目;

加入mylexer.h与mylexer.c,编译工程;

执行标识符数字识别器;

注意:每次修改l文件后,需要重新编译l文件,再重新编译VC工程五、工具:

编译器:Visual C++,Eclipse

Lex与Yacc:Parser Generator(支持C/C++/Java,带实例)

或者其他自己擅长的语言和环境

六、相关介绍

1、Core Programming Language(CPL)

数据类型:整型变量(常量),布尔变量(常量)

取值范围{…, -2, -1, 0, 1, 2, …}, {true, false}

运算表达式:简单的代数运算,布尔运算

程序语句:赋值表达式,顺序语句,if-else语句,while语句

语言特点:简单、易处理如果加入浮点数及相应的除操作,那么该语言的表达能力相当于C, C++,

JAVA 等

便于关注语言实现的本质,而不受繁冗细节的干扰

基本框架:

CPL 程序

CPL

Complier

执行结果

词法分析器 语法分析器 语义子程序

C/C++/Java 编译器

CPL Compiler

(1) 手工编写

(2)工具生成

词法l 文件

C/C++编译器

CPL C

语法y 文件

2、词法分析器生成器Lex

Lex 是一个词法分析器生成器,接受正规式表示的词法规则,生成识别正规式所描述语言的源程序,不同版本的Lex 支持不同的高级语言,如C 、C++、Java 等。

利用Lex 构造词法分析器:实质为如何设计正规式和语义动作 Lex 源程序*.l(三段式): [定义

C 声明

辅助定义正规式

*.l

]

%%

lex.yy.c

EXE

规则

词法规则正规式

输入字符序列记号流

词法分析器

人工编写

Lex 转化

语义动作(C 代码)

[%%

用户子程序 C 源程序 ]

Lex 源程序*.l(三段式): [定义 C 声明

辅助定义正规式

] %% 规则

语义动作(C [%%

用户子程序

C 源程序

]

mylexer.l 源代码: //声明部分 %{

#define ID 0 #define NUMBER 1 %} char [a-zA-Z] digit [0-9] digits {digit}+

optional_fraction (.{digits})?

optional_exponent (E[+-]?{digits})?

%% {char}({char}|{digit})*

{ printf("识别标识符%s :长度为%d\n", yytext, yyleng); return ID;

}

{digits}{optional_fraction}{optional_exponent} {printf(“识别数字%s :长度为%d\n", yytext, yyleng);

return NUMBER;

注意:不同版本的Lex 生成的文件不同

lex.yy.c 结构:

(1)声明的C 语言部分

(2)词法分析表

(3)词法分析驱动器(yylex())

(4)用户定义子程序

//C 声明:记号类别

将来在Y acc 中使用下列语句代替:

%Token ID NUMBER

//辅助定义正规式

//词法规则正规式 //语义动作:C 代码

} %%

int main(void) { printf("词法分析成功,返回记号类别为%d\n", yylex());

}

实验结果:每次输入一个字符串,输出识别结果

注意:将来Y acc 自动调用yylex()返回一个记号

3、语法分析器生成器Y acc

Y acc 是一个语法分析器生成器,接受产生式表示的语法规则,生成识别产生式所描述语言的源程序,不同版本的Y acc 支持不同的高级语言,如C 、C++、Java 等。

yytext ,yyleng :全局变量,用来存放识别出的输入序列,由词法分析器自动填写

//C 源程序

yylex():词法分析驱动器,根据语法规则返回记号的类别,如ID 、NUMBER 等。

语法分析器

输入记号流

人工编写

Y acc 转化

相关文档
最新文档