2010-03-10 70 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

相關問題