2010-03-10 73 views

回答

6

是的,这是可能的。如何做到这一点取决于你想要的实现。下面是可能会为你工作的例子:

首先,定义您的节点:

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可以创建并返回节点,然后将其添加到根节点。

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

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

+1

优秀的答案,Kaleb。它让我立即开始了,我想我现在可以自己写下它!但是,请您澄清一下“解析树”和“抽象树”,“异构”和“同质”解析树之间的区别吗? (我不知道其中的差别,但我很想知道!) – bodacydo 2010-03-10 20:05:24

+1

homogeneous - 同种类型节点组成的树。异构 - 由不同类型的节点组成的树。分析树表示输入数据的结构,通常包含不必要的语法。抽象语法树是维护基本结构和信息的语法树,但是消除了不必要的结构或语法。我修改了我的帖子,以显示树如何变得更深 - 我希望澄清。 – 2010-03-10 20:09:39

+0

感谢您的解释!我已经在实施。 :)我会问,如果我卡住了。我的树将是抽象的,异构的树。 :) – bodacydo 2010-03-10 20:13:15

相关问题