张瑞编译原理实验报告Word下载.docx

上传人:b****1 文档编号:12993341 上传时间:2022-10-01 格式:DOCX 页数:25 大小:269.94KB
下载 相关 举报
张瑞编译原理实验报告Word下载.docx_第1页
第1页 / 共25页
张瑞编译原理实验报告Word下载.docx_第2页
第2页 / 共25页
张瑞编译原理实验报告Word下载.docx_第3页
第3页 / 共25页
张瑞编译原理实验报告Word下载.docx_第4页
第4页 / 共25页
张瑞编译原理实验报告Word下载.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

张瑞编译原理实验报告Word下载.docx

《张瑞编译原理实验报告Word下载.docx》由会员分享,可在线阅读,更多相关《张瑞编译原理实验报告Word下载.docx(25页珍藏版)》请在冰豆网上搜索。

张瑞编译原理实验报告Word下载.docx

是指在基本硬件和数字软件的基础上,为支持系统软件和应用软件的工程化开发和维护儿使用的一组软件,简称SDE。

它有软件工具和环境继承机制构成,前者用以支持软件开发的相关过程、活动和人物,后者为工具集成和软件的开发、维护及管理提供统一的支持。

1.支持开发完备模型2.灵活控制

二、基本理论阐述、当前理论或实践应用现状

《编译原理》理论和实践并重,叙述严谨、简明,富有启发性,且内容深入浅出,便于自学。

《编译原理》不仅可以作为高等院校相关专业的教材,也可以作为计算机专业人员的参考用书。

编译器的构造工具是根据用户输入的语言的文法,编译器的构造工具可以生成程序来处理以用户输入的文法书写的文本。

随着计算机应用范围的扩大,在软件自动生成,文档处理,特定专业的语言等领域,编译器的构造工具这一技术显得越来越重要.

在分析语法成分时比较方便直观,更便于操作。

运行程序的同时不断修正改进程序,直至的到最优源程序。

3、小型编译器系统架构

它是一个编译器的架构.通俗的来说,它实现了一个库,在这个库上,可以很容易的实现不同的编译相关的程序,当然,编译器自然是其中最重要的一个.当然其他像编译时间的代码分析也是很容易实现的。

构造识别符号串的自动机、词法分析程序的构造、语法分析程序的构造、中间语言的生成程序、编译程序的代码生成。

四、小型编译器主要功能模块与实现

(1)功能介绍

1. 

词法分析功能:

对代码进行分词操作,分出以下5类单词:

关键字、标识符、常量、运算符、分隔符。

2. 

算术表达式、关系表达式和逻辑表达式的分析与化简:

提取代码中的所有算术表达式,可用LL

(1)分析或算符优先分析算术表达式。

关系表达式和逻辑表达式也可用算术表达式的程序进行分析。

分析成功后进行化简操作,方便语法分析程序分析。

3. 

LL

(1)语法分析:

自己写的简单C语言的方法,支持赋值语句、判断语句、循环语句,

用自顶向下的分析方法,对化简之后的单词流进行分析。

4.四元式生成与后缀式。

对词法分析分词后的单词流生成中间代码。

其中算术表达式先生成后缀式。

然后再根据后缀式的结果生成四元式。

对多条逻辑表达式采用先计算再跳转的操作。

对if语句判断跳转,if中的表达式支持多条逻辑表达式,但不支持嵌套。

while和if相同。

5.汇编语言生成:

根据四元式生成汇编语言。

(2)相关理论

1>

.词法分析(英语:

lexical 

analysis)是计算机科学中将字符序列转换为单词(Token)序列的过程。

进行词法分析的程序或者函数叫作词法分析器,也叫扫描器(Scanner)。

词法分析器一般以函数的形式存在,供语法分析器调用。

词法分析阶段是编译过程的第一个阶段,是编译的基础。

这个阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构词规则识别单词(也称单词符号或符号)。

词法分析程序实现这个任务。

词法分析程序可以使用Lex等工具自动生成。

2>

.LL

(1)文法:

对文法G的句子进行确定的自顶向下语法分析的充分必要条件是,G的任意两个具有相同左部的产生式A—>

α|β 

满足下列条件:

(1)如果α、β均不能推导出ε,则 

FIRST(α) 

∩ 

FIRST(β) 

Φ。

(2)α 

和 

β 

至多有一个能推导出 

ε。

(3)如果 

*═>

ε,则 

FOLLOW(A) 

将满足上述条件的文法称为LL

(1)文法。

第一个L代表从左向右扫描输入符号串,第二个L代表产生最左推导,1代表在分析过程中执行每一步推导都要向前查看一个输入符号——当前正在处理的输入符号。

LL

(1)文法既不是二义性的,也不含左递归,对LL

(1)文法的所有句子均可进行确定的自顶向下语法分析。

并不是所有的语言都可以用LL

(1)文法来描述,而且不存在判定某种语言是否是LL

(1)文法的算法。

也就是说,确定的自顶向下分析只能实现一部分上下文无关语言的分析,这就是LL

(1)文法所产生的语言。

另外,在上述LL

(1)文法的条件中,要求:

ε 

∈ 

FIRST(α1),ε 

FIRST(α2),…ε 

FIRST(αn) 

中至多有一个成立。

3>

.语法分析是编译过程的一个逻辑阶段。

语法分析的任务是在词法分析的基础上将单词序列组合成各类语法短语,如“程序”,“语句”,“表达式”等等.语法分析程序判断源程序在结构上是否正确.源程序的结构由上下文无关文法描述.语法分析程序可以用YACC等工具自动生成。

4>

.后缀式:

即逆波兰式。

逆波兰式是波兰逻辑学家卢卡西维奇(Lukasiewicz)发明的一种表示表达式的方法。

这种表示方式把运算符写在运算对象的后面,例如,把a+b写成ab+,所以也称为后缀式。

这种表示法的优点是根据运算对象和算符的出现次序进行计算,不需要使用括号,也便于用械实现求值。

对于表达式x:

=(a+b)*(c+d),其后缀式为xab+cd+*:

=。

原表达式:

a*(b*(c+de)-f)# 

为表达式结束符号*后缀式:

abcde+*f-*# 

5>

.四元式:

四元式是一种更接近目标代码的中间代码形式。

由于这种形式的中间代码便于优化处理,因此,在目前许多编译程序中得到了广泛的应用。

四元式实际上是一种“三地址语句”的等价表示。

它的一般形式为:

(op,arg1,arg2,result)其中, 

op为一个二元 

(也可是一元或零元)运算符;

arg1,arg2分别为它的两个运算 

(或操作)对象,它们可以是变量、常数或系统定义的临时变量名;

运算的结果将放入result中。

四元式还可写为类似于PASCAL语言赋值语句的形式:

result 

∶= 

arg1 

op 

arg2 

每个四元式只能有一个运算符,所以,一个复杂的表达式须由多个四元式构成的序列来表示。

例如,表达式A+B*C可写为序列T1∶=B*C,T2∶=A+T1其中,T1,T2是编译系统所产生的临时变量名。

当op为一元、零元运算符 

(如无条件转移)时,arg2甚至arg1应缺省,即result∶=op 

arg1或 

对应的一般形式为:

(op,arg1,arg2,result).

(3)算法描述

1>

.词法分析器

1.Designtheregulargrammar.

2.Designtheregularexpression.

3.ConstructtheDFA.

4.Writetheprogram.

数据结构

typedefstruct

{

inttype;

chartoken[size];

}symbol;

Char*keywords[keywordsnum]={"

auto"

"

break"

case"

char"

const"

continue"

default"

do"

"

double"

else"

enum"

extern"

float"

for"

goto"

if"

int"

long"

register"

return"

short"

signed"

sizeof"

static"

struct"

switch"

typedef"

"

printf"

union"

unsigned"

void"

volatile"

while"

main"

include"

using"

namespace"

std"

bool"

cin"

cout"

iostream"

endl"

};

char*operators[operatorsnum]={"

+"

-"

*"

"

++"

--"

%"

char*jiefu[jiefunum]={"

;

."

("

)"

{"

}"

["

]"

|"

char*luoji[luojinum]={"

<

>

="

=="

!

&

||"

char*teshu[teshunum]={"

@"

#"

$"

^"

~"

char*zhushi[zhushinum]={"

char*str[8]={"

关键字"

操作符"

界符"

逻辑运算符"

特殊符"

注释符"

常量"

标识符"

*通过读文件的形式一个字符一个字符读入进行分析

*下面是词法分析的主要函数

voidlex(char*filename)

interror=0;

intflag=0;

charch;

fp.open(filename);

intlinenum=1;

inti,j;

i=0;

intx=0;

ch=fp.get();

while(!

fp.eof())

{

if(ch=='

'

||ch=='

\t'

{

x=0;

ch=fp.get();

}

elseif(ch=='

\n'

linenum++;

elseif(isalpha(ch)==1)

table[i].token[x]=ch;

if(isalpha(ch)==0&

isdigit(ch)==0&

ch!

='

_'

{

table[i].token[++x]='

\0'

i++;

flag=0;

x=0;

}

elseif(isdigit(ch)==1||isalpha(ch)==1||ch=='

x++;

elseif(isdigit(ch)==1)

if(isdigit(ch)==1)

elseif(ch=='

.'

&

flag==0)

table[i].token[++x]=ch;

flag=1;

ch=fp.get();

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1