编译实验语法分析.docx

上传人:b****6 文档编号:6389413 上传时间:2023-01-06 格式:DOCX 页数:27 大小:252.90KB
下载 相关 举报
编译实验语法分析.docx_第1页
第1页 / 共27页
编译实验语法分析.docx_第2页
第2页 / 共27页
编译实验语法分析.docx_第3页
第3页 / 共27页
编译实验语法分析.docx_第4页
第4页 / 共27页
编译实验语法分析.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

编译实验语法分析.docx

《编译实验语法分析.docx》由会员分享,可在线阅读,更多相关《编译实验语法分析.docx(27页珍藏版)》请在冰豆网上搜索。

编译实验语法分析.docx

编译实验语法分析

 

语法分析器实验报告

 

院系:

专业:

小组成员:

学号:

日期:

 

一、实验目的

根据给出的文法编制LR

(1)分析程序,以便对任意输入的符号串进行分析。

本次实验的目的主要是加深对LR

(1)分析法的理解。

二、实验内容

对已给语言文法,构造LR

(1)分析表,编制语法分析程序,要求将错误信息输出到语法错误文件中,并输出分析句子的过程(显示栈的内容)

LR

(1)分析法的功能:

LR

(1)分析法的功能是利用LR

(1)分析表,对输入符号串自下而上的分析过程。

LR

(1)分析表的构造及分析过程。

三.实验文法

:

:

=.

:

:

=

:

:

=const;|ε

:

:

==

|,=

:

:

=var;|ε

:

:

=|,

:

:

=procedure;;|ε

:

:

=:

=

|call

|beginend

|ifthen

|whiledo

:

:

=|;

:

:

=odd|

:

:

==|<>|<|>|<=|>=

:

:

=|

|

:

:

=+|-

:

:

=|

:

:

=*|/

:

:

=||(

注意:

(1)"ε"表示空串。

.

(2)分别表示标识符和数。

简化

0P'—>P

1P—>B

2B—>VS

3V—>aL;

4V—>@

5L—>i

6L—>L,i

7S—>i_E

8S—>bTe

9S—>fDtS

10S—>wDdS

11S—>@

12T—>S

13T—>T;S

14D—>ERE

15R—><

16E—>i

17E—>n

18E—>(E)

P—>

B—>

V—>

S—>

E—>

L

T—>

-nt-list>

D—>

R—>

a—>var

b—>begin

e—>end

_—>:

=

I—>

F—>if

T—>then

W—>while

d—>do

n—>

空串—>@

的文法:

实验环境:

MicrosoftWindows7

MicrosoftVisualStudio2010

实验原理:

构造LR

(1)项集族的方法

SetofltemsCLOSURE(I)

{

repeat

for(I中的每个项[A—>α·Bβ,a]

for(G中的每个产生式B—>γ)

for(FIRST(βa)中的每个终结符号b)

将[B—>·γ,b]加入到集合I中;

Until不能向I中加入更多的项;

returnI

}

SetofltemsGOTO(I,X){

将J初始化为空集;

for(I中的每一个项[A—>α·Xβ,a])

将项[A—>α·Xβ,a]加入到集合J中;

returnCLOSURE(J):

}

Voiditems(G)

{

将C初始化为{CLOSURE}({[S’—>·S,$]});

repeat

for(C中的每一个项集I)

for(每一个文法符号X)

if(GOTO(I,X)非空且不在C中)

将GOTO(I,X)加入C中;

until不再有新的项集加入到C中;

}

语法分析表:

实验流程图:

实验结果:

输入:

begin

whilea

=c

end.

输出:

输入:

begin

whilea

=c

end.

输出:

心得体会:

完成本次实验,我们首先要根据题目中给出的文法,构造LR

(1)项集族,之后构造LR

(1)语法分析表。

题目中给出的是pascal语言版的文法,实验开始时我们也稍微学习了一下pascal语言的风格和定义方法。

开发的C程序,把构造好的LR

(1)语法分析表存入,用数组模拟栈的功能。

对词法分析输出的语句,语法分析中,模拟字符的入栈,之后匹配语法分析表匹配出相应的ACTION动作,分析是移入操作还是归约操作。

当为移入操作时需要更新栈中栈顶符号和栈顶状态号;当为归约操作时,要根据相应的产生式,把产生式右边的字符弹出栈,出栈字符的个数要根据产生式的长度来判断,状态号的出栈个数也要匹配出栈字符的个数。

同时归约之后,要把产生式左边的终结符入栈,终结符入栈之后还要进行GOTO跳转。

所谓的入栈操作就是数组的个数增加操作,出栈操作就是数组的减法操作。

当时栈操作是从栈顶开始的,所以每一个数组的最后一位(栈顶)要十分明确的处理好,以免发生模拟入栈、出栈错误。

关键代码:

classactions

{

public:

charaction;//记录s或r等

intnum;//记录下标

}act[80][30];

voidfenxibiao()

{

inti=0,j;

//先全部赋值为e,代表错误

for(i=0;i<=78;i++)

{

for(j=0;j<=24;j++)

act[i][j].action='e';

}

act[0][0].action='s',act[0][0].num=4;

act[0][1].action='r',act[0][1].num=4;

act[0][4].action='r',act[0][4].num=4;

act[0][5].action='r',act[0][5].num=4;

act[0][7].action='r',act[0][7].num=4;

act[0][15].action='r',act[0][15].num=4;

act[0][16].action='',act[0][16].num=1;

act[0][17].action='',act[0][17].num=2;

act[0][18].action='',act[0][18].num=3;

act[1][15].action='a',act[1][15].num=100;//'a'代表接收状态

act[2][15].action='r',act[2][15].num=1;

act[3][1].action='s',act[3][1].num=7;

act[3][4].action='s',act[3][4].num=6;

act[3][5].action='s',act[3][5].num=8;

act[3][7].action='s',act[3][7].num=9;

act[3][15].action='r',act[3][15].num=11;

act[3][19].action='',act[3][19].num=5;

act[4][4].action='s',act[4][4].num=11;

act[4][21].action='',act[4][21].num=10;

act[5][15].action='r',act[5][15].num=2;

act[6][3].action='s',act[6][3].num=12;

act[7][1].action='s',act[7][1].num=16;

act[7][2].action='r',act[7][2].num=11;

act[7][4].action='s',act[7][4].num=15;

act[7][5].action='s',act[7][5].num=17;

act[7][7].action='s',act[7][7].num=18;

act[7][10].action='r',act[7][0].num=11;

act[7][19].action='',act[7][19].num=14;

act[7][22].action='',act[7][22].num=13;

act[8][4].action='s',act[8][4].num=21;

act[8][12].action='s',act[8][12].num=23;

act[8][14].action='s',act[8][14].num=22;

act[8][20].action='',act[8][20].num=20;

act[8][23].action='',act[8][23].num=19;

act[9][4].action='s',act[9][4].num=21;

act[9][12].action='s',act[9][12].num=23;

act[9][14].action='s',act[9][14].num=22;

act[9][20].action='',act[9][20].num=25;

act[9][23].action='',act[9][23].num=24;

act[10][9].action='s',act[10][9].num=27;

act[10][10].action='s',act[10][10].num=26;

act[11][9].action='r',act[11][9].num=5;

act[11][10].action='r',act[11][10].num=5;

act[12][4].action='s',act[12][4].num=29;

act[12][12].action='s',act[12][12].num=31;

act[12][14].action='s',act[12][14].num=30;

act[12][20].action='',act[12][20].num=28;

act[13][2].action='s',act[13][2].num=32;

act[13][10].action='s',act[13][10].num=33;

act[14][2].action='r',act[14][2].num=12;

act[14][10].action='r',act[14][10].num=12;

act[15][3].action='s',act[15][3].num=34;

act[16][1].action='s',act[16][1].num=16;

act[16][2].action='r',act[16][2].num=11;

act[16][4].action='s',act[16][4].num=15;

act[16][5].action='s',act[16][5].num=17;

act[16][7].action='s',act[16][7].num=18;

act[16][10].action='r',act[16][0].num=11;

act[16][19].action='',act[16][19].num=14;

act[16][22].action='',act[16][22].num=35;

act[17][4].action='s',act[17][4].num=21;

act[17][12].action='s',act[17][12].num=23;

act[17][14].action='s',act[17][14].num=22;

act[17][20].action='',act[17][20].num=20;

act[17][23].action='',act[17][23].num=36;

act[18][4].action='s',act[18][4].num=21;

act[18][12].action='s',act[18][12].num=23;

act[18][14].action='s',act[18][14].num=22;

act[18][20].action='',act[18][20].num=25;

act[18][23].action='',act[18][23].num=37;

act[19][6].action='s',act[19][6].num=38;

act[20][11].action='s',act[20][11].num=40;

act[20][24].action='',act[20][24].num=39;

act[21][11].action='r',act[21][11].num=16;

act[22][11].action='r',act[22][11].num=17;

act[23][4].action='s',act[23][4].num=42;

act[23][12].action='s',act[23][12].num=44;

act[23][14].action='s',act[23][14].num=43;

act[23][20].action='',act[23][20].num=41;

act[24][6].action='s',act[24][6].num=45;

act[25][11].action='s',act[25][11].num=40;

act[25][24].action='',act[25][24].num=46;

act[26][1].action='r',act[26][1].num=3;

act[26][4].action='r',act[26][4].num=3;

act[26][5].action='r',act[26][5].num=3;

act[26][7].action='r',act[26][7].num=3;

act[26][15].action='r',act[26][15].num=3;

act[27][4].action='s',act[27][4].num=47;

act[28][15].action='r',act[28][15].num=7;

act[29][15].action='r',act[29][15].num=16;

act[30][15].action='r',act[30][15].num=17;

act[31][4].action='s',act[31][4].num=42;

act[31][12].action='s',act[31][12].num=44;

act[31][14].action='s',act[31][14].num=43;

act[31][20].action='',act[31][20].num=48;

act[32][15].action='r',act[32][15].num=8;

act[33][1].action='s',act[33][1].num=16;

act[33][2].action='r',act[33][2].num=11;

act[33][4].action='s',act[33][4].num=15;

act[33][5].action='s',act[33][5].num=17;

act[33][7].action='s',act[33][7].num=18;

act[33][10].action='r',act[33][0].num=11;

act[33][19].action='',act[33][19].num=49;

act[33][15].action='r',act[33][15].num=28;

act[34][4].action='s',act[34][4].num=51;

act[34][12].action='s',act[34][12].num=53;

act[34][14].action='s',act[34][14].num=52;

act[34][20].action='',act[34][20].num=50;

act[35][2].action='s',act[35][2].num=54;

act[35][10].action='s',act[35][10].num=33;

act[36][6].action='s',act[36][6].num=55;

act[37][8].action='s',act[37][8].num=56;

act[38][1].action='s',act[38][1].num=7;

act[38][4].action='s',act[38][4].num=6;

act[38][5].action='s',act[38][5].num=8;

act[38][7].action='s',act[38][7].num=9;

act[38][15].action='r',act[38][15].num=11;

act[38][19].action='',act[38][19].num=57;

act[39][4].action='s',act[39][4].num=59;

act[39][12].action='s',act[39][12].num=61;

act[39][14].action='s',act[39][14].num=60;

act[39][20].action='',act[39][20].num=58;

act[40][4].action='r',act[40][4].num=15;

act[40][12].action='r',act[40][12].num=15;

act[40][14].action='r',act[40][14].num=15;

act[41][13].action='s',act[41][13].num=62;

act[42][13].action='r',act[42][13].num=16;

act[43][13].action='r',act[43][13].num=17;

act[44][4].action='s',act[44][4].num=42;

act[44][12].action='s',act[44][12].num=44;

act[44][14].action='s',act[44][14].num=43;

act[44][20].action='',act[44][20].num=62;

act[45][1].action='s',act[45][1].num=7;

act[45][4].action='s',act[45][4].num=6;

act[45][5].action='s',act[45][5].num=8;

act[45][7].action='s',act[45][7].num=9;

act[45][15].action='r',act[45][15].num=11;

act[45][19].action='',act[45][19].num=64;

act[46][4

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

当前位置:首页 > 表格模板 > 合同协议

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

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