编译原理实验报告文档格式.docx

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

编译原理实验报告文档格式.docx

《编译原理实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《编译原理实验报告文档格式.docx(22页珍藏版)》请在冰豆网上搜索。

编译原理实验报告文档格式.docx

+

*

**

1

2

3

4

5

6

7

8

9

10

11

12

13

14

$DIM

$IF

$DO

$STOP

$END

$ID

$INT

$ASSIGN

$PLUS

$STAR

$POWER

$COMMA

$LPAR

$RPAR

-

内部字符串

标准二进形式

对于这个小语言,有几点重要的限制:

首先,所有的关键字(如IF﹑WHILE等)都是“保留字”。

所谓的保留字的意思是,用户不得使用它们作为自己定义的标示符。

例如,下面的写法是绝对禁止的:

IF(5)=x

其次,由于把关键字作为保留字,故可以把关键字作为一类特殊标示符来处理。

也就是说,对于关键字不专设对应的转换图。

但把它们(及其种别编码)预先安排在一张表格中(此表叫作保留字表)。

当转换图识别出一个标识符时,就去查对这张表,确定它是否为一个关键字。

再次,如果关键字、标识符和常数之间没有确定的运算符或界符作间隔,则必须至少用一个空白符作间隔(此时,空白符不再是完全没有意义的了)。

例如,一个条件语句应写为

 IFi>

0i=1;

而绝对不要写成

             IFi>

0i=1;

因为对于后者,我们的分析器将无条件地将IFI看成一个标识符。

这个小语言的单词符号的状态转换图,如下图:

语法分析器能识别由加+减-乘*除/乘方^括号()操作数所组成的算术表达式,其文法如下:

E→E+T|E-T|T

T→T*F|T/F|F

F→P^F|P

p→(E)|i

使用的算法可以是:

预测分析法;

递归下降分析法;

算符优先分析法;

LR分析法等。

中间代码生成器产生上述算术表达式的中间代码(四元式序列)

三、实现过程

给出各题目的详细算法描述,数据结构和函数说明,流程图。

1、词法分析器的流程图

2、语法分析器主程序图

3、中间代码生成器流程图:

四、源程序

#include<

string.h>

malloc.h>

iostream>

usingnamespacestd;

typedefstructtable//分析表存储结构

{

charm[100];

}table;

tableM[100][100];

//定义分析表

typedefstructstacknode//定义栈内元素节点(带头结点(为空)的)

chardata;

structstacknode*next;

}stackk;

voidinitlink(stackk*&

s)//初始化新栈

{

s=(stackk*)malloc(sizeof(stackk));

s->

next=NULL;

}

voidpoplink(stackk*&

s)//顶元素出栈

stackk*p;

charv;

if(s->

next!

=NULL)

{

p=s->

next;

v=p->

data;

next=p->

}

free(p);

voidpushlink(stackk*&

s,charx)//新元素入栈

stackk*p;

p=(stackk*)malloc(sizeof(stackk));

p->

data=x;

next=s->

next=p;

voiddisplay(stackk*s)//打印现实显示栈内元素

inti=0,j;

charst[100];

while(p!

=NULL)

st[i++]=p->

p=p->

for(j=i-1;

j>

=0;

j--)

printf("

%c"

st[j]);

for(j=0;

j<

16-i;

j++)//打印对齐格式

'

'

);

chargettop(stackk*s)//返回栈顶元素值

next==NULL)

return0;

else

returns->

next->

intfind(charc,chararray[])//查找函数,

inti;

intflag=0;

for(i=0;

i<

100;

i++)

if(c==array[i])

flag=1;

returnflag;

intlocation(charc,chararray[])//定位函数,指出字符所在位置

returni;

voiderror()//出错函数定义

%15c出错!

\n"

voidanalyse(charVn[],charVt[])

inti,j,m,p,q,length,t,h;

charw,X;

charstr[100];

opt0:

scanf("

%s"

str);

for(i=0;

strlen(str);

{

if(!

find(str[i],Vt))

输入字符串有误!

请重新输入!

"

gotoopt0;

break;

}

stackk*st;

initlink(st);

pushlink(st,'

#'

pushlink(st,Vn[0]);

//#与识别符号入栈

j=0;

h=1;

w=str[0];

步骤%-12c分析栈%-24c剩余输入串%-12c所用产生式\n"

opt1:

%-16d"

h);

//显示步骤

h++;

display(st);

//显示分析栈中内容

X=gettop(st);

//上托栈顶符号放入X

poplink(st);

for(intk=0;

k<

14+j;

k++)//打印对齐格式

for(t=j;

t<

t++)

str[t]);

//显示剩余字符串

if(find(X,Vt)&

&

X!

='

)//分析栈的栈顶元素和剩余输入串的第一个元素相比较

if(X==w)

%15c匹配\n"

X);

j++;

w=str[j];

gotoopt1;

error();

if(X=='

if(X==w)

%8c是该文法的句子!

else

p=location(X,Vn);

q=location(w,Vt);

char*S1="

null"

*S2="

NULL"

;

if(strcmp(M[p][q].m,S1)==0||strcmp(M[p][q].m,S2)==0)//查找产生式

charstr0[100];

strcpy(str0,M[p][q].m);

%15c-->

%s\n"

X,str0);

//显示对应的产生式

if(strcmp(str0,"

$"

)==0)

length=strlen(str0);

//逆序进栈

for(m=length-1;

m>

m--)

pushlink(st,str0[m]);

intmain()

inti,k,n,r;

charVn[100],Vt[100],select;

******************************************************************\n"

对任意输入LL

(1)文法的分析表,判断验证字符串是否为该文法的句子\n"

并能给出分析和演示过程。

\n"

opt2:

请输入各终结符(#号表示结束)Vt[i]:

&

Vt[i]);

if(Vt[i]=='

r=i;

请输入非终结符个数:

%d"

n);

getchar();

for(i=0;

n;

请输入非终结符Vn[%d]:

i);

Vn[i]);

请输入此非终结符对应各终结符的产生式右部(null或NULL表示出错;

$表示空串):

for(k=0;

=r;

k++)

M[i][k].m);

opt3:

请输入要分析的字符串,且以#结束:

analyse(Vn,Vt);

********************请选择***********************\n"

1:

输入字符串\n"

2:

输入新分析表\n"

0:

退出\n"

*************************************************\n"

opt4:

cin>

>

select;

sw

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

当前位置:首页 > PPT模板 > 节日庆典

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

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