编译原理报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计报告课程名称:编译原理
专业班级:信息安全 1302 班
学号:
姓名:
指导教师:
报告日期: 2015年11月10日
计算机科学与技术学院
目录
目录 (1)
实验一词法分析 (2)
1.1 实验目的 (2)
1.2 实验要求 (2)
1.3 实验原理 (3)
1.4 算法实现 (5)
1.5 实验结果 (5)
实验二语法分析 (7)
2.1 实验目的 (7)
2.2 实验要求 (7)
2.3 实验原理 (7)
2.4 算法实现 (11)
2.5 实验结果 (12)
总结和体会 (14)
附录 (15)
实验一词法分析
1.1 实验目的
设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。
1.2 实验要求
1. 待分析的简单语言的词法
(1)关键字
begin if then while do end
所有的关键字都是小写。
(2)运算符和界符:
:= + - * / < <= <> > >= = ;( ) #
(3)其他单词是标识符(ID)和整形常数(NUM),通过以下正规式定义:
ID = letter(letter | digit)*
NUM = digit digit*
(4)空格由空白、制表符和换行符组成。空格一般用来分隔ID、NUM、运算符、
界符和关键字,词法分析阶段通常被忽略。
2. 各种单词符号对应的种别码。
/ 16 # 0
3. 词法分析程序的功能
输入:所给文法的源程序字符串。
输出:二元组(syn, token 或sum)构成的序列
其中:syn为单词种别码;
token为存放的单词自身字符串;
sum为整形常数。
例如:对源程序
begin x:=9; if x>0 then x:= 2 * x + 1 / 3 ; end #
的源文件,经词法分析后输出如下序列:
(1,begin)(10,’x’)(18,:=)(11,9)(26,;)(2,if)…
1.3 实验原理
算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。
1.3.1 主程序流程
程序从文件中得到相应的代码段,之后对缓存区的数据进行词法分析,此番分析的结构流程图如图3.1所示:
图3.1 主程序流程图
1.3.2 扫描子程序
扫描子程序会对缓存区中的代码根据关键字表进行判定,并未每一个代码生成其对应的二元组。程序结构如图3.2所示:
图3.2 扫描子程序流程图
1.3.3 函数及变量设计
扫描开始之前需要在程序中预设,或者从文件中读取一个关键字表,并根据关键字表对程序进行词法分析,彼此实验关键字表预设在程序开始前定义的一个char型数组中,其定义格式如下:
char *rwtab[]={"begin","if","then","while","do","end",_KEY_WORD_END};
其中KEY_WORD_END为关键字结束标志
生成的二元组存储在一个数据结构中,数据结构定义如下:
typedef struct
{
int typenum; /*种别码*/
char *word;
}WORD;
数据结构内容包括种别码和相应单词。
1.4 算法实现
1.4.1 变量设计
程序中所用主要变量定义形式如下:
typedef struct /*二元组结构*/
{
int typenum; /*种别码*/
char *word;
}WORD;
char input[255]; /*源程序缓字符冲区*/
char token[255]=""; /*单词缓冲区*/
int p_input; /*源程序字符指针*/
int p_token; /*单词缓冲区指针*/
char ch; /*当前读入字符*/
char *rwtab[]={"begin","if","then","while","do","end",_KEY_WORD_END};
/*关键字表*/
1.4.2 函数设计
程序中涉及的函数定义形式如下
char m_getch() /*从输入源读一个字符到CH中*/
void getbc() /*去掉空白字符*/
void concat() /*拼接单词*/
int letter() /*判断是否是单词*/
int digit() /*判断是否是数字*/
int reserve() /*检索关键字表格*/
void retract() /*回退一个字符*/
WORD *scaner() /*词法扫描程序*/
1.4.3 函数代码
函数代码见附录。
1.5 实验结果
测试代码存储在文件中,代码如下:
程序运行结果如下:
实验二语法分析
2.1 实验目的
编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。
2.2 实验要求
利用C语言编制递归下降分析程序,并对简单语言进行语法分析。
1.待分析的简单语言的语法
用扩充的BNF表示如下:
(1)<程序> ::= begin <语句串> end
(2)<语句串> ::= <语句> {; <语句> }
(3)<语句> ::= <赋值语句>
(4)<赋值语句> ::= ID := <表达式>
(5)<表达式> ::= <项> {+<项> | -<项>}
(6)<项> ::= <因子> {*<因子> | /<因子>}
(7)<因子>::= ID | NUM | (<表达式>)
2.实验要求说明
输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,打印“success”,否则输出“error”。
例如:
输入begin a:=9; x:=2*3; b:=a+x end #
输出success
输入x:=a+b*c end #
输出error
2.3 实验原理
语法分析程序以实验一中实现的词法分析程序为基础。能够判断一段代码是否符合语法规则。
2.3.1 主程序流程
程序从文件中得到相应的代码段,之后对缓存区的数据进行分析,分析的结构流程图如图3.1所示: