语义分析器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
重庆大学课程设计报告课程设计题目:简单编译器的设计与实现
学院:计算机学院
专业班级:计算机科学与技术2班
年级:2010级
姓名:唐允恒,张楠
学号:20105208,20105333
完成时间:2013 年 6 月12 日成绩:
指导教师:张敏
重庆大学教务处制
指导教师评定成绩:
指导教师签名:年月日
指导教师评定成绩:
指导教师签名:年月日
重庆大学本科学生课程设计任务书
简单编译器设计与实现
目录
(一)目录 (1)
(二)简单编译器分析与设计 (2)
(1)简单编译器需求分析 (3)
(2)词法分析器的设计 (3)
1.词法表设计 (3)
2.token串取法简单流程图 (3)
(3)语法分析器的设计 (4)
1.算符优先文法设计 (4)
2.符号优先表 (6)
(4)语义分析器的设计 (6)
1.简单四元式分析 (6)
2.简单四元式的实现 (6)
(三)关键代码以及算法 (7)
(1)词法分析器的关键算法 (7)
(2)语法分析器的关键算法 (7)
(3)四元产生式的关键算法 (8)
(四)系统测试 (9)
(1)用例测试 (9)
(2)差错处理 (10)
(3)设计自我评价 (10)
(五)运行效果 (11)
(六)总结 (13)
简单编译器分析与设计
简单编译器需求分析
编写目的
《编译原理》是一门实践性较强的软件基础课程,为了学好这门课程,必须在掌握理论知识的同时,加强上机实践。本课程设计的目的就是要达到理论与实际应用相结合,使同学们能够根据编译程序的一般原理和基本方法,通过具体语言的编译程序的编写,掌握编译程序的主要实现技术,并养成良好的程序设计技能。
设计背景
此项目是开发一个C++语言编辑器,完成编辑C++语言源程序,对C++语言源程序进行高亮显示、错误处理、代码重排版、显示当前文件的函数列表和跳转、成对括号、语句块标识的功能,同时描述了编译器执行每个步骤流程。
在词法分析,语法分析和语义分析等方面加深对课程基本内容的理解。同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。
对一个c++语言的子集编制一个编译程序,主要包括以下步骤:
词法分析
设计、编制并调试简单的C++语言的词法分析程序
语法分析
编制一个语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析。
语义分析
采用语法制导翻译原理,将语法分析所识别的语法成分变换成四元式形式的中间代码序列。
词法分析器的设计
词法表设计
以对程序进行简单分析,容易得到需要提取的token串,对token串进行简单分类,可以得到相应词法表,该词法表在代码中的实现采用数组的形式,共分为标识符,常量,关键字,符号几大类,关键字和符号具体分类如下:
char *key[6]={"break","continue","return","cout","endl","cin"};//关键字
char *def[3]={"int","char","string"};//定义关键字
char *proc[4]={"while","if","for","else"};//过程关键字
char *logic[2]={"&&","||"};逻辑运算符
char *comp[6]={"<=",">=","==","<",">","!="};//比较符
char *assi[6]={"+=","-=","*=","/=","%=","="};//赋值运算符
char *bd[7]={";","(",")","{","}","\"","'"};//标点
char *sym[6]={"$","&","_","#",">>","<<"};//特殊符号
char *mathtic[6]={"%","+","-","*","^","/"};//运算符
char *selfgrow[2]={"++","--"}; //自增符
token串取法简单流程图
语法分析器的设计
算符优先文法设计
对于c++程序,很多功能的实现复杂,操作繁琐,所以我们精简c++语言的语法分析,该语法分析器主要针int,char,string类型的操作符进行定义,赋值,表达式,逻辑运算式以及输入输出语句进行识别和分析,而程序体则可以识别while,if else 和for语句。基本涵盖了面向过程程序能够用到的循环判断和选择过程。
步骤1:Token串取法进行了细分和削减(只对需要识别的Token串词法分析)将词法分析器完善,将标识符以及其对应的类型分别存入数组中以方便识别,对token 串命名,把token串后的名字作为终结符进行语法分析。
对应终结符
<标识符>
<字符常量>(‘s’,’&’……)
<字符串常量>
<数字常量>(12,0.231……)
<比较符>(==,!=,<=,>=,<,>)
<赋值符号>(+=,-=,=)
<运算符>(+,-,*,/,%,^)//不区分优先级
<逻辑运算符>(||,&&)
<自增符号>(++,--)
<标点符号以及输入输出符号> 保留cout,cin,; ( ) { } << >> <过程关键字> 保留for,while,if,else
由于cout,cin,for,while,if,else,return搭配固定,把这几个关键字的Token也看作终结符。
步骤2:定义一般文法:(根据一般C++语言描述,非算符优先文法)
<程序>(P)::= <定义语句>(D); <程序>(P)|<赋值语句>;<程序>(P)|<输入输出语句>(IO);<程序>(P)|<过程关键字>{程序(P)}
<定义语句>(D)::=<定义符号>【<标识符>| <赋值语句>】
<赋值语句>(S)::=<标识符><赋值符><表达式>(E)|<标识符><赋值符>
<表达式>(E)::=<算术表达式>(M1)|<字符串常量>|<字符常量>
<算术表达式>(M1)::=<算术表达式><运算符><算术表达式>|M2
M2::=( <算术表达式>)|<标识符>|<数字常量>
<输入输出语句>::=cin>><标识符>|cout<<<表达式>【<
<过程>::=<过程关键字><程序>
<过程关键字>::=for(<赋值语句>;<判定语句>;<赋值语句>)|If(<判定语句>)|E lse if(<判定语句>)|E lse|W hile(<判定语句>)//循环for,while,选择判断if,else