Parsing 自上而下的解析-先计算,后计算

Parsing 自上而下的解析-先计算,后计算,parsing,context-free-grammar,ll,Parsing,Context Free Grammar,Ll,鉴于以下语法: S->S+S | S |(S)| S*| a S->S+S*a 就我的一生而言,我似乎不知道如何计算上述语法的第一个和第二个。S的递归非终结符使我困惑。这是否意味着在计算第一个集之前,我必须首先考虑语法,然后再进行计算?计算不带ε乘积的CFGs中的第一个集的一般规则如下: 按如下方式初始化第一个(A):对于每个生产A→ tω,其中t是终端,将t加到第一个(a)上 重复应用以下内容,直到没有任何变化:对于表格A的每次生成→ Bω,其中B是非终结符,集FIRST(a)=FIRST(

鉴于以下语法:

S->S+S | S |(S)| S*| a

S->S+S*a


就我的一生而言,我似乎不知道如何计算上述语法的第一个和第二个。S的递归非终结符使我困惑。这是否意味着在计算第一个集之前,我必须首先考虑语法,然后再进行计算?

计算不带ε乘积的CFGs中的第一个集的一般规则如下:

  • 按如下方式初始化第一个(A):对于每个生产A→ tω,其中t是终端,将t加到第一个(a)上
  • 重复应用以下内容,直到没有任何变化:对于表格A的每次生成→ Bω,其中B是非终结符,集FIRST(a)=FIRST(a)∪ 第一(B)

我们可以按照上面写的规则来做,但是这里有一些有趣的事情我们可以注意到。您的语法只有一个非终结符,因此第二个规则(将元素从第一个非终结符集导入到另一个非终结符的第一个非终结符集中)实际上不会做任何事情。换句话说,我们可以通过应用初始规则来计算第一个集合。这也不算太糟糕-我们只看所有以终端开头的产品,得到第一个(s)={a,(}。

如果这两行构成语法,那么它可能是不明确的。我怀疑每一行都是单独的语法。事实上,即使第一行本身也是不明确的(例如,推导aa*的两种不同方式).您确定已正确复制问题吗?