显示有效的LR(0)项目

时间:2011-03-13 08:16:27

标签: c++ compiler-theory lr

我必须创建一个C ++程序来在编译器设计中显示SLR解析中的有效LR(0)项。直到现在我能够将语法作为用户的输入并找到它的闭包。但是我无法继续进行SLR中的goto实现。任何人都可以提供关于如何显示语法的有效LR(0)项的链接或代码 - 提前谢谢

1 个答案:

答案 0 :(得分:2)

你能够结束语法吗?从技术上讲,闭包功能是在多组项目上定义的(这些项目是与每个产品相关联的位置的产品组合)。

现在,您要求如何显示语法的有效LR(0)项。您可以表示显示上面段落中定义的所有项目,或显示LR(0)自动机的所有状态。第一个是微不足道的,因为所有可能的项都是有效的,所以我猜你想要所有的状态。这就是你所做的(直接来自龙书)。

SetOfItems getValidStates(Grammar G) {
    // S' -> S is the "first" production of G (which must be augmented)
    SetOfItems C = {[S' -> *S]};
    do {
      bool added = false;
      for (Item I : C) {
        for (Symbol X : G) {
          L = GOTO(I, X);
          if (L.size() > 0 && !C.contains(L)) {
            added = true;
            C.add(L);
          }
        }
      }
    } while (added);
    return C;
}

唯一的问题是如何实现GOTO(SetOfItems,Symbol)。

所以,

SetOfItems GOTO(SetOfItems S, Symbol X) {
  SetOfItems ret = {}
  for (Item I : S)
    if (I.nextSymbol().equals(X))
      ret.add(I.moveDotByOne())
  return closure(ret);
}

集合中的每个项目都具有[A - >; a * Yb],其中A是某个生产的头部,aXb是生产的主体(a和b只是一串语法符号,Y是单个符号)。 '*'只是我提到的位置 - 它不在语法中,[A-> a * Yb] .nextSymbol()是Y.基本上,Item.nextSymbol()只返回右边的任何符号点。 [A-> a * Yb] .moveDotByOne()返回[A-> aY * b]。

现在,我刚刚完成编译器书中的解析章节,我对我的理解并不完全满意,所以要小心我所写的内容。

至于实际代码的链接:http://ftp.gnu.org/gnu/bison/是你可以找到bison源的地方,但那是一个LALR解析器生成器,我不认为它实现了LR(0)。