Algorithm 上下文无关文法的算法

Algorithm 上下文无关文法的算法,algorithm,computer-science,context-free-grammar,computation-theory,Algorithm,Computer Science,Context Free Grammar,Computation Theory,我正试图设计一种算法,将CFG G和终端符号a作为输入,如果S(G的起始规则)可以生成以a开头的句子形式,则输出yes。i、 例如,如果(tun)*中有一个字符串α,那么S=>*aα,否则它输出no。例如,如果语法是S->[S]| SS |ε,如果a=],答案是no。我不是在寻找代码,我只是试图理解我应该如何用伪代码处理这个主题。你可以只运行an的预测器,直到它停止预测,并查看它是否生成任何以所讨论的终端开始的规则 或者从下至上,标记所有接受相关终端作为其第一个输入的非终端,然后标记所有接受已标

我正试图设计一种算法,将CFG G和终端符号a作为输入,如果S(G的起始规则)可以生成以a开头的句子形式,则输出yes。i、 例如,如果(tun)*中有一个字符串α,那么S=>*aα,否则它输出no。例如,如果语法是S->[S]| SS |ε,如果a=],答案是no。我不是在寻找代码,我只是试图理解我应该如何用伪代码处理这个主题。

你可以只运行an的预测器,直到它停止预测,并查看它是否生成任何以所讨论的终端开始的规则


或者从下至上,标记所有接受相关终端作为其第一个输入的非终端,然后标记所有接受已标记的非终端作为其第一个输入的非终端,并重复操作,直到完成,并查看S是否在标记的非终结符集中。

有三种方法可以派生以
a
开头的字符串

  • 有一个规则的形式是
    X->a…。
  • 有一条规则的形式是
    X->a..
    a
    派生一个以
    a
    开头的字符串
  • 有一个规则的形式是
    X->ba..
    B
    派生
    ε
    a..
    派生一个以
    a
    开头的字符串
  • 您可以使用这些来构建一个算法,该算法查看所有语法规则,从
    S->…
    格式开始,如果rhs以终端开头,则应用检查1;如果rhs以非终端开头,则同时应用检查2和3。每个检查对应于一个(可能是递归的)返回布尔值的函数

    一个有趣的细节是需要处理语法中的循环,例如单个规则,如
    A->A
    ,但也包括
    A->B..
    B->C..
    C->A..
    。如果不小心,相互递归检查将无限重复。我会告诉你的。想一想深度优先搜索如何避免图形中永远跟随循环

    另一个细节是如何确定给定的非端子B是否导出
    ε
    。您应该能够自己解决这个问题,但如果所有其他方法都失败了,请查找“nullable non-terminal”。您将找到一个众所周知的小算法

    如果任何检查结果为阳性,请返回yes。否则,彻底应用这些规则是没有办法的。报税表号码