编译原理——构造预测分析表(判断某字符串是否是文法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集计算出来

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

第二步:

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

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

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

步骤一:

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

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

输入输出
#Ei+i*i#第一步,没有输出
#E'Ti+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'ii*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)的句子

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值