用C语言编写 要求1用LR分析法实现对某程序语言的子集程序设计语言的语法分析程序;2构造相应的LALR分析表并对源程序的内码流进行分析如为文法定义的句子输出是否则输出否;3算术表达式文法 GE: E’-E E-E+T E-T T-TF T
由于LR分析法包含SLR(1)和LALR(1),因此需要先确定使用哪种分析方法。根据题目给出的SLR(1)分析表,可以发现它是SLR(1)分析法的分析表,而不是LALR(1)分析法的分析表。因此,本题使用SLR(1)分析法进行语法分析。
根据算术表达式文法,可以构造出LR(0)自动机,然后通过进行项目集族的闭包和状态转移,得到SLR(1)分析表。根据上表,构造出对应的SLR(1)分析表如下:
状 ACTION GOTO
态 i + * ( ) # E T F
0 s 5 0 0 s 4 0 0 1 2 3
1 s 6 A 0
2 r 2 s 7 r 2 r 2
3 r 4 r 4 r 4 r 4
4 s 5 s 4 8 2 3
5 r 6 r 6 r 6 r 6
6 s 5 s 4 9 3
7 s 5 s 4 10
8 s 6 s 11
9 r 1 s 7 r 1 r 1
10 r 3 r 3 r 3 r 3
11 r 5 r 5 r 5 r 5
其中,ACTION和GOTO分别表示移进和规约操作、以及状态转移。具体来说,s表示移进操作,后面的数字表示将该符号移入编号为该数字的状态;r表示规约操作,后面的数字表示使用第几个产生式进行规约;A表示接受操作;0表示出错。
接下来,可以根据给定的源程序的内码流,使用SLR(1)分析表进行语法分析。如果分析成功,则输出“是”,否则输出“否”。
以输入i+i*i为例,内码流为“i + i * i #”,初始状态为0,根据SLR(1)分析表进行分析:
-
从状态0开始,读入i,根据表中第一行i列的s5操作,将i移入状态5,此时栈内状态序列为0 5。
-
读入+,根据表中第一行+列的s6操作,将+移入状态6,此时栈内状态序列为0 5 6。
-
读入i,根据表中第一行i列的s5操作,将i移入状态5,此时栈内状态序列为0 5 6 5。
-
读入*,根据表中第一行列的s4操作,将移入状态4,此时栈内状态序列为0 5 6 5 4。
-
读入i,根据表中第一行i列的s5操作,将i移入状态5,此时栈内状态序列为0 5 6 5 4 5。
-
读入#,根据表中第一行#列的r6操作,使用第6个产生式F->i进行规约,弹出栈顶的5,并将F压入栈中,此时状态序列为0 5 6 5 4 3。
-
由于栈顶为状态3,且下一个输入符号为#,根据表中第三行#列的r4操作,使用第4个产生式T->F进行规约,弹出栈顶的F,并将T压入栈中,此时状态序列为0 5 6 2。
-
由于栈顶为状态2,且下一个输入符号为#,根据表中第二行#列的r2操作,使用第2个产生式E->T进行规约,弹出栈顶的T,并将E压入栈中,此时状态序列为0 1。
-
由于栈顶为状态1,且下一个输入符号为#,根据表中第一行#列的A操作,接受该输入符号串,语法分析成功,输出“是”。
因此,对于输入的内码流“i + i * i #”,输出“是”。对于其他输入符号串,可以按照上述步骤进行语法分析,如果分析成功,则输出“是”,否则输出“否”
原文地址: https://www.cveoy.top/t/topic/fJ4e 著作权归作者所有。请勿转载和采集!