=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