8

是否可以在使用递归下降解析器检查数据是否匹配语法的同时生成解析树?

如果是这样,当我递归下降时,我将使用什么方法来构建一棵树?

谢谢,博达赛多。

注意:我是解析新手。(已经问了几个关于 SO 的问题,我正在变得更好。)

4

1 回答 1

7

是的,这是可能的。如何做到这一点将取决于您想要的实现。这是一个可能对您有用的示例:

首先,定义你的节点:

class ParseTreeNode {
  private final String name;
  private final List<ParseTreeNode> children = /* new */;
  public ParseTreeNode(String name) {
    this.name = name;
  }
  public void addChild(ParseTreeNode child) {
    children.add(child);
}

接下来,您需要将其集成到您的递归下降函数中:

class RDParser {
  ParseTreeNode parse(Input input) {
    ParseTreeNode root = createParseTreeNodeNamed("Root")
    switch (input.nextToken()) {
      case OPT1:
        root.addChild(createParseTreeNodeNamed("Opt1"));
        break;
      case OPT2:
        while (/*someCondition*/) {
          root.addChild(createParseTreeNodeNamed("Opt2-sibling" + /* i */));
        }
      case SUBTREE:
        ParseTreeNode subtree = createParseTreeNodeNamed("Subtree");
        root.addChild(subtree);
        parseSubtree(subtree, input);
        break;
      default:
        error("Input %s was not in the expected first/follow sets", input.nextToken());
    }
  }
  void parseSubtree(ParseTreeNode node, Input input) {
    node.addChild(createParseTreeNodeNamed("subtree-child"));
    /* ... */
  }

  /* and other functions do similarly */
  ParseTreeNode createParseTreeNodeNamed(String name) {
    return new ParseTreeNode(name);
  }
}

当您向下分析树时,您可能想要发送任何新的“根”节点,以便可以将子节点添加到其中。或者,parseSubtree可以创建并返回一个节点,然后将其添加到根节点。

您可以使用上述过程构建解析树或简单的抽象树。由于 parse 函数返回根节点,它将引用任何和所有子节点,因此您将在解析后完全访问解析树。

无论您使用异构分析树还是同构分析树,都需要一种方法来存储足够的信息以使其有用。

于 2010-03-10T20:01:54.517 回答