ANTLR用法的推薦模式是讓Parser構造一個抽象語法樹,然後構建Tree Walker(AKA樹文法)來處理它們。有沒有人知道在ANTLRWorks中調試樹文法的方法
我想弄清楚爲什麼我的樹語法不工作,並希望使用ANTLRWorks的調試器,就像我用它作爲解析器本身一樣。解析器的輸入是「源代碼」,但樹解析器的輸入是解析器的AST結果。我沒有看到如何使它作爲輸入來測試樹語法。
目前還不清楚在ANTLRWorks中是否有測試樹語法的方法。如果可以做到的話,一個正確的方向指針將真正讚賞。
ANTLR用法的推薦模式是讓Parser構造一個抽象語法樹,然後構建Tree Walker(AKA樹文法)來處理它們。有沒有人知道在ANTLRWorks中調試樹文法的方法
我想弄清楚爲什麼我的樹語法不工作,並希望使用ANTLRWorks的調試器,就像我用它作爲解析器本身一樣。解析器的輸入是「源代碼」,但樹解析器的輸入是解析器的AST結果。我沒有看到如何使它作爲輸入來測試樹語法。
目前還不清楚在ANTLRWorks中是否有測試樹語法的方法。如果可以做到的話,一個正確的方向指針將真正讚賞。
ANTLRWorks調試器應該可以正常使用您的樹語法。如果我沒有記錯,您需要使用帶有「-debug」標誌的ANTLR代碼生成工具(我正在使用Java目標),然後,在創建樹分析器實例的地方,使用將端口作爲一個論點。在我的情況下,默認端口不工作,所以我任意挑選35505.
啓動ANTLRWorks,打開你的樹語法,點擊「運行」 - >「調試遠程...」,將端口設置爲樹分析器的構造函數中使用相同的值,並且您應該能夠將調試器連接到正在運行的應用程序。有關詳細信息,請參閱ANTLR 3 Debugging FAQ。
[更新]假設你正在使用Java對象(讓我們知道這是不是這樣),這裏是入門的更詳細的信息:
當你測試你的非樹分析器在ANTLRWorks中,有一個幕後過程從您的語法文件生成Java代碼,然後使用該代碼來解析您的輸入。當您在自己的應用程序中使用解析器時,必須使用ANTLR(具體而言,類org.antlr.Tool
)來生成Java代碼,然後可以將其包含在您的應用程序中。 ANTLRWorks爲此提供了一個菜單選項,這會讓你開始。就我而言,我在我的ant構建文件中有一個目標,它從我的語法生成Java代碼,並將這些Java源文件放在其他應用程序可以找到它們的位置。我的Ant目標看起來是這樣的:
<java classpath="${antlr.tool.classpath}" classname="org.antlr.Tool" failonerror="true">
<arg value="-o" />
<arg value="${antlr.out.dir}" />
<arg value="${grammar.dir}/GrammarName.g" />
</java>
antlr.tool.classpath
需要包含stringtemplate.jar
和antlr.jar
,並antlr.out.dir
需要指向哪裏你想要生成的源代碼去的目錄屬性(例如,build/antlr/src/org/myorg/antlr/parser
,如果你的解析器語法指定包org.myorg.antlr.parser
)。
然後,當您編譯應用程序的其餘部分,你可以使用類似:與生成的ANTLR代碼一起
<javac destdir="${build.classes.dir}" debug="on" optimize="on" deprecation="${javac.deprecation}" source="${javac.source}" target="${javac.target}">
<classpath refid="stdclasspath"/>
<src path="${src.dir}" />
<src path="${antlr.src.dir}" />
</javac>
在這裏,我們編譯我們的應用程序源代碼(在src.dir
)(在antlr.src.dir
,其中在這個例子中將是build/antlr/src
)。
只要在您的應用程序中使用生成的代碼(即,外ANTLRWorks),你需要做的是這樣:
String sourceText = "a + b = foo";
ANTLRStringStream inStream = new ANTLRStringStream(sourceText);
// your generated lexer class
MyLexer lexer = new MyLexer(inStream);
CommonTokenStream tokens = new CommonTokenStream(lexer);
// your generated parser class
MyParser parser = new MyParser(tokens);
// run the toplevel rule (in this case, `program`)
MyParser.program_return prog = parser.program();
// get the resulting AST (a CommonTree instance, in this case)
CommonTree tree = (CommonTree) prog.getTree();
// run a tree parser rule on the AST
MyTreeParser treeParser = new MyTreeParser(new CommonTreeNodeStream(tree));
treeParser.program();
我強烈建議得到的The Definitive ANTLR Reference副本,如果你將要使用ANTLR。所有這些都很全面,有很多例子可以幫助你入門。
如果您確定您正在構建的AST是正確的(使用ANTLRWORKS調試器),則樹狀漫步測試與測試任何其他應用程序沒有區別。例如,如果您正在發佈Java代碼,請使用Eclipse的調試器進行測試,或使用普通的日誌消息...
呀,我已經開始使用這種方法。 ANTLRWorks非常方便,所以我希望找到一種方法來測試我的樹語法而不用離開ANTLRWorks。這不是一個表演阻止者,但是如何使其工作起來會更好。 – 2009-10-25 22:30:43
還有就是用AntlrWorks道:
我以爲我已經很徹底地搜索了FAQ,但是錯過了這個頁面。我現在讀了它,並認爲我非常接近。但仍然沒有工作。當你說「你需要使用帶有」-debug「標誌的ANTLR代碼生成工具(我正在使用Java目標)時,那麼,在你創建樹解析器實例的地方,」我認爲這就是我迷失的地方。您是否使用命令行ANTLR生成代碼?我不確定我在哪裏創建此代碼,以及非樹分析器的代碼如何運行。 – 2009-10-25 22:29:12