扬大课程设计报告-C语言子集编译器

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

扬州大学编译原理课程设计

题目C语言子集编译器

班级

学号

姓名

成绩

扬州大学信息工程学院

一、课程设计目的

通过编译原理课程设计,加深对课堂中所讲授的内容的理解,设计一个具有词法分析、语法、语义分析、错误处理的综合程序。进一步掌握编译程序常用实现的方法和技术,使学生初步具有研究、设计、编制和调试编译程序的能力。

二、课程设计题目

实现一个简单的编译器

三课程设计要求

1.实现一个C语言子集或Pascal语言子集的编译器,工具任选。

2.要求实现的功能:翻译+,-,*,/四则运算表达式及布尔表达式,翻译包

含if语句,while语句及do-while语句及相互间的嵌套。

四、课程设计语言及选用工具

选用语言:Java

工具Eclipse

五、课程设计方法

1,本课程设计的数据结构

设计过程中用到的栈:

static VectorDataStack=new Vector();输入流栈static VectortargetAnaStack=new Vector();输入备份栈static VectorAnalysStack=new Vector();分析栈static VectorKeyWordStack=new Vector();保留字栈static VectorJiexanStack=new Vector();界限符栈static VectorYunsuanfuStack=new Vector();运算符栈

中间代码的构造:包括标号,符号,第一操作数,第二操作数,和目的操作数

class midCode{

String sign;

String op1;

String op2;

LoopLastLocation p1;

}

class LoopLastLocation{//每一个目的操作数都联系着一个对应的跳转标号String LastLocation;

Int BiaoHao;

}

总体构成:跳转标号(操作符,第一操作数,第二操作数,目的操作数或者跳转标号)

2,器主要分为四个部分:词法分析、语法分析、中间代码生成和目标代码生成。

(1)词法分析程序

主要功能是从文件中读取源程序,经过分析修改格式之后进行次词法分析。分离出相应的字符或者字符串,判断其类型,如果是关键字则压入关键字的栈内,如果是边界符则压入边界符的栈内,如果是标识符则压入标识符的栈内。

不采用对各种符号进行标号处理的方法而采用这种分类的方法的优点是后期进行语法分析和中间代码生成的时候十分的方便,而且又能够保证词法分析的正确性。采用的方法是事先将各种类型的字符或者字符串压入不同的栈内,进行字符或者字符串的匹配的时候只需对各个栈内的内容进行比较,如果在哪个栈内就输出相应的结果表示这一步的词法分析成功,然后进行下一步的分析。

语法分析的Java实现方法是:

以关键字为例进行压栈操作如下:

bianyiqi.KeyWordStack.add("else");

bianyiqi.KeyWordStack.add("int");

bianyiqi.KeyWordStack.add("if");

bianyiqi.KeyWordStack.add("while");

bianyiqi.KeyWordStack.add("char");

bianyiqi.KeyWordStack.add("float");

bianyiqi.KeyWordStack.add("double");

bianyiqi.KeyWordStack.add("main");

bianyiqi.KeyWordStack.add("i");//KeyWordStack压栈

然后调用函数进行词法分析。

语法分析

主要功能是对源程序进行语法分析,本程序采用的是自上而下的LL1文法分析,向后看一个字符立即判断下一步即将进行的动作,LL1文法分析简单,适用于简单编译器的语法分析,相比于LR(0)分析实现更加的容易。

但是LL1本身存在两个问题左递归和回溯,由于时间的限制不再进行左递归的消除和回溯问题的解决,这里我们使用的文法使用符合LL1文法的输入。

文法如下:

P->int main(){QK}

Q->UV

U->int|#

V->iW

W->=E

E->Te|>E|

T->F+t|T||F-t|F*t|F/t|#

F->i|#

k->while(E){K}|if(E){K}|#

对于不同的字符串判断其属于哪一个文法,用case语句调用相应的函数进行语法分析。

例如:

if(isNum(s2))isnum=true;

if(s1.equals("P"))i='P';

if(s1.equals("Q"))i='Q';

if(s1.equals("U"))i='U';

然后

switch(i){

case'P':{//i=0说明最先开头的是P,那么这个就是最开始的地方

if(s2.equals("main")){

ls=(String)AnalysStack.elementAt(0);

AnalysStack.removeElementAt(0);

AnalysStack.add(0,"main");

AnalysStack.add(1,"(");

AnalysStack.add(2,")");

AnalysStack.add(3,"{");

AnalysStack.add(4,"Q");

AnalysStack.add(5,"K"

AnalysStack.add(6,"}");

//遇到main关键字,把栈设为main(){QK}

}else if(s2.equals("int")||s2.equals("void"))

(3)中间代码生成

中间代码生成是整个程序的关键部分,向上承接语法分析的过程,向下开启目标代码的生成。中间代码生成根据读取的字符采取相应的动作。例如读取的是一个“=”则产生的动作就是将“=”后面的第二个字符串作为四元式的符号,其后面第一个字符串作为第一操作数,其后面第三个字符串作为第二操作数,至于目的操作数一般情况下可以直接得到,若遇到跳转标号的话需要等后来找到标号的位置之后才能够确认,但之前要留有相应的位置。

中间代码生成的Java的方法实现举例:碰到“>”“<”“=”时形成四元式的方法是一样的。

if(((String)targetAnaStack.elementAt(i+3)).equals(">") ||((String)targetAnaStack.elementAt(i+3)).equals("<")

相关文档
最新文档