编译原理——构造预测分析表(判断某字符串是否是文法G(E)的句子)

进入今天的学习前,若不理解LL(1)文法中的首符号集,后跟符号集和选择符号集,可看:

http://t.csdnimg.cn/BjSHv

构造预测分析表的步骤:

步骤1:对文法的每个规则U->u,执行步骤2与3

步骤2:对于每个终结符a\varepsilonFirst(u),让A[U,a]='U->u';

步骤3:如果\varepsilon(空串)\epsilonFirst(u),则对Follow(U)中的每个终结符号b或#,让A[U,b]='U->u'或

A[U,#]='U->u';

步骤4:把A的每个未定义元素置为ERROR(用空白表示)

设有以下文法:

构造预测分析表之前需要列首符号集:

 注:当首符号集中出现\varepsilon(空串),那么就需要将“->”左边的Follow集计算出来

编译原理——构造预测分析表(判断某字符串是否是文法G(E)的句子)_第1张图片

第一步:输入的一行表示文法中的终结符号,

编译原理——构造预测分析表(判断某字符串是否是文法G(E)的句子)_第2张图片

第二步:

对于First(TE')={ ( , i }

编译原理——构造预测分析表(判断某字符串是否是文法G(E)的句子)_第3张图片

 以此类推可得,剩余空格都为ERROR

编译原理——构造预测分析表(判断某字符串是否是文法G(E)的句子)_第4张图片

示例:输入字符串:i+i*i,该字符串是否为文法G[E]产生的句子

步骤一:

对于第一个要处理的字符” i “,弹出E,放入TE'

注:左边是栈底,右边是栈顶

输入 输出
#E i+i*i# 第一步,没有输出
#E'T i+i*i# E->TE'(第一步输入的输出)

从第二步开始就一定要从上一步输入的输出来写栈,例如:

上一步输入的输出为:E->TE',E'先入栈,T再入栈,反序入栈 

编译原理——构造预测分析表(判断某字符串是否是文法G(E)的句子)_第5张图片

步骤二:

接下来还是输入”i“,遇到的是栈顶T,结合分析表得到T->FT',再加上先弹出的”E“,得到栈#E'T'F,

接下来将”F“弹出来,对上输入的”i“,得到"F->i"

输入 输出
#E'T'F “i+i*i#” T->FT'
#E'Ti “i+i*i#” F->i

此时看到指针指向的输入“i”与栈顶”i“相同,就可以将两者弹出,得到

输入 输出
#E'T “+i*i#”

以此类推

输入 输出
#E "+i*i#" T'->ε
#E'T+ "+i*i#" E'->+TE'
#E'T "i*i#"
#E'T'F "i*i#" T->FT'
#E'T'i i*i#” F->i
#E'T'i *i#”
#E'T'F* "*i#" T'->*FT'
#E'T'F "i#"
#E'T'i "i#" F->i
#E'T' "#"
#E' "#" T'->ε
# "#" E'->ε

至此,可以判断此字符串是文法G(E)的句子

你可能感兴趣的:(学习日常(考研向),文法,编译原理,follow集,first集,预测分析表)