代表性语法

S→e $

E→E + t | t

T→T * f | f

F→(E) |

自上而下的解析

  1. 对于语法中的每个非终结符,我们构造一个布尔函数,其名称就是该非终结符。当且仅当给定的非终结符派生出剩余输入的某个前缀时,该函数返回true。
  2. 当且仅当函数S()返回true时,输入字符串w$是有效的输入。
  3. 此策略有效地对赢博体育派生集执行自顶向下、深度优先的搜索,直到发现输入字符串的派生或确定不存在此类派生。

下面是一个具有代表性的解析函数

保龄球一个(){用于每个产品一个X1X2Xkin G) {n = (i = 1到k)的当前输入位置{if(X是终端)如果(X出现在输入的前面)推进输入过去X其他破坏;else if (!X())休息;} if(i == k + 1)返回true;否则将当前输入位置设置回n}返回false;}

消除左递归

如果语法G包含左递归规则,如

E→E + t

当E()试图调用E()时,这会导致无限递归。

这个问题可以通过用非递归等价物替换赢博体育左递归语法规则来解决。这是一个算法。

按一定顺序排列非终结符一个1一个2、……一个nFor (i = 1 to n) {For (j = 1 to i-1){替换表格的每个产出一个一个j γ由制作一个δ1γ | δ2γ |⋯| δkγ一个jδ1 | δ2 |⋯| δk赢博体育的作品都是为了一个j}消除为的结果之间的直接左递归一个
}

下面是一个如何删除直接左递归的示例。考虑左递归语法规则

A→A α | β

这可以用规则代替

结果仍然是递归的,但它们不是左递归的。自顶向下解析技术可以毫无问题地处理这些结果。

开头所示的语法是左递归的。在赢博体育这个算法之后,我们得到了一个非左递归的等价。

S→e $

F→(E) | id

优化自顶向下解析

上面显示的自顶向下解析函数通常必须执行大量回溯操作。当解析函数A()递归地调用另一个解析函数Xi()并且Xi()失败时,就会发生回溯。我们可以通过拒绝调用Xi()来优化这个过程,只要很明显,非终端Xi不可能派生出一个字符串,其第一个符号是当前在输入前面的符号。这种技术被称为预测解析,它代表了自顶向下解析过程的重要优化。

预测性解析通常实现为使用堆栈的表驱动迭代算法。为了构造解析表,我们使用以下两个函数为每个非终结符构造FIRST和FOLLOW集合。

Set FIRST(X) {if(X是终端)返回{X} I = {};(每件产品)XY1Y2Ykin G) I = I∈FIRST(Y1); 如果(XεI = I∈ε;返回我;} Set FOLLOW(X) {I = {};(每件产品)一个Xαβin G) I = I∈(FIRST(β) - {ε});(每件产品)一个αXin G) I = I∈FOLLOW(一个); 返回我;}

下面的过程构造预测解析表。

  1. 表项的形式为M[A, A],其中A为非终结符,A为终结符。
  2. 对于每个产出,语法中的A→α都是do
    1. 对于FIRST(α)中的每个终端a,将a→α加到M[a,a]中
    2. 如果ε在FIRST(α)中,则对于FOLLOW(A)中的每个末端b,将A→α加到M[A,b]中。如果ε在FIRST(α)中,$在FOLLOW(A)中,则将A→α添加到M[A,$]中。
  3. 赢博体育没有产生结果的表项都被认为是错误项。

如果我们为一个语法构造一个解析器表,并且发现赢博体育非错误条目都包含一个结果,那么我们就说这个语法是LL(1)。LL(1)语法的解析器表允许我们使用输入中的下一个符号来选择一个结果,以便对遇到的每个非终结符进行最新体育赛事资讯、实时赔率分析及在线投注平台探索。这是对原始的自顶向下解析算法的一个相当大的优化,该算法试图最新体育赛事资讯、实时赔率分析及在线投注平台探索它遇到的每个非终端的每种可能的结果。

下面是该算法创建的解析表示例。语法方面

F→(E) | id

我们有

LL(1)解析算法

下面是完整的LL(1)解析算法:

Push $ and年代在堆栈上a =(的第一个符号)w)
X = 年代while(X != $) {if(X == a)弹出堆栈并让a =(下一个符号)w) else if(X是终端)error();else if ((X一个]为空)error();否则{输出生产(X一个弹出X从堆栈推的右手边(X一个} X =(堆栈顶部的符号)}