• 编译原理——构造预测分析表(判断某字符串是否是文法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)的句子

  • 相关阅读:
    【SpringBoot实战系列】阿里云OSS接入上传图片实战
    如何创建rpm包
    C# 中 i++ 和 ++i的区别
    网络编程之:TCP服务器的简单实现
    Spring三级缓存解决循环依赖
    SpringBoot入门教程:数据库恢复(mysqldump和mysqlbinlog)
    Hive实战-表创建
    怎么设计一个有创意性物联网系统
    二叉树遍历
    virsh命令使用笔记
  • 原文地址:https://blog.csdn.net/weixin_69884785/article/details/134296756