进入今天的学习前,若不理解LL(1)文法中的首符号集,后跟符号集和选择符号集,可看:
http://t.csdnimg.cn/BjSHv
构造预测分析表的步骤:
步骤1:对文法的每个规则U->u,执行步骤2与3
步骤2:对于每个终结符aFirst(u),让A[U,a]='U->u';
步骤3:如果(空串)First(u),则对Follow(U)中的每个终结符号b或#,让A[U,b]='U->u'或
A[U,#]='U->u';
步骤4:把A的每个未定义元素置为ERROR(用空白表示)
设有以下文法:
构造预测分析表之前需要列首符号集:
注:当首符号集中出现(空串),那么就需要将“->”左边的Follow集计算出来
第一步:输入的一行表示文法中的终结符号,
第二步:
对于First(TE')={ ( , i }
以此类推可得,剩余空格都为ERROR:
示例:输入字符串:i+i*i,该字符串是否为文法G[E]产生的句子
步骤一:
对于第一个要处理的字符” i “,弹出E,放入TE'
注:左边是栈底,右边是栈顶
栈 | 输入 | 输出 |
#E | i+i*i# | 第一步,没有输出 |
#E'T | i+i*i# | E->TE'(第一步输入的输出) |
从第二步开始就一定要从上一步输入的输出来写栈,例如:
上一步输入的输出为:E->TE',E'先入栈,T再入栈,反序入栈
步骤二:
接下来还是输入”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)的句子