重庆大学课程设计报告课程设计题目:简单编译器的设计与实现学院:计算机学院专业班级:计算机科学与技术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串后的名字作为终结符进行语法分析。
对应终结符<标识符> <TYPE.sym>(TYPE=int,char,string)<定义符号>保留string char int<字符常量>(‘s’,’&’……)<constCHR><字符串常量><constSTR><数字常量>(12,0.231……)<constNUM><比较符>(==,!=,<=,>=,<,>)<compare><赋值符号>(+=,-=,=)<assignment><运算符>(+,-,*,/,%,^)//不区分优先级<mathtic><逻辑运算符>(||,&&) <logical><自增符号>(++,--)<selfgrow><标点符号以及输入输出符号> 保留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)::=<算术表达式><运算符><算术表达式>|M2M2::=( <算术表达式>)|<标识符>|<数字常量><输入输出语句>::=cin>><标识符>|cout<<<表达式>【<<endl|null】|return 【<标识符>|<数字常量>】<判定语句>::=(<表达式><比较符><表达式>)|<逻辑运算符><判定语句><过程>::=<过程关键字><程序><过程关键字>::=for(<赋值语句>;<判定语句>;<赋值语句>)|If(<判定语句>)|E lse if(<判定语句>)|E lse|W hile(<判定语句>)//循环for,while,选择判断if,else步骤3:根据一般文法改写成相应的算符优先文法P::=D; |S;|IO; |J; |I; |PP*|<while>(J)* P|<if> (J) P|<if> (J) P <else> P|<for>(S;J;I) P*D::=D<assignment>Es|<string><stringsym>|D<assignment>En|<int><intsym>|D<assignment>Ec|<char><charsym>Es::=(Es) |Es<mathtic>Es |<stringsym> |<constSTR>En::=(En) |En<mathtic>En |<intsym> |<constNUM>Ec::=(Ec)* |Ec<mathtic>Ec |<charsym> |<constCHR>I::= <intsym><selfgrow>S::= Es<assignment>Es |En<assignment>En |Ec<assignment>EcJ::=J<logical>Cs|Cs |J<logical>Cn |Cn |J<logical>Cc|CcCs::= <stringsym><compare>Es |EsCn::= <int-sym> <compare>En |EnCc::= <char-sym><compare>Ec |EcIO::=<cin> >> <stringsym>|<cin> >> <intsym>|<cin> >> <charsym> <cout> << Es|<cout> << En|<cout> << Ec|IO << <endl>|IO << <endl>|IO << <endl>*注:该文法定义同类型符号之间才能进行各项操作。