2009-10-13 50 views
6

ANTLR用法的推薦模式是讓Parser構造一個抽象語法樹,然後構建Tree Walker(AKA樹文法)來處理它們。有沒有人知道在ANTLRWorks中調試樹文法的方法

我想弄清楚爲什麼我的樹語法不工作,並希望使用ANTLRWorks的調試器,就像我用它作爲解析器本身一樣。解析器的輸入是「源代碼」,但樹解析器的輸入是解析器的AST結果。我沒有看到如何使它作爲輸入來測試樹語法。

目前還不清楚在ANTLRWorks中是否有測試樹語法的方法。如果可以做到的話,一個正確的方向指針將真正讚賞。

回答

6

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.jarantlr.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。所有這些都很全面,有很多例子可以幫助你入門。

+0

我以爲我已經很徹底地搜索了FAQ,但是錯過了這個頁面。我現在讀了它,並認爲我非常接近。但仍然沒有工作。當你說「你需要使用帶有」-debug「標誌的ANTLR代碼生成工具(我正在使用Java目標)時,那麼,在你創建樹解析器實例的地方,」我認爲這就是我迷失的地方。您是否使用命令行ANTLR生成代碼?我不確定我在哪裏創建此代碼,以及非樹分析器的代碼如何運行。 – 2009-10-25 22:29:12

0

如果您確定您正在構建的AST是正確的(使用ANTLRWORKS調試器),則樹狀漫步測試與測試任何其他應用程序沒有區別。例如,如果您正在發佈Java代碼,請使用Eclipse的調試器進行測試,或使用普通的日誌消息...

+0

呀,我已經開始使用這種方法。 ANTLRWorks非常方便,所以我希望找到一種方法來測試我的樹語法而不用離開ANTLRWorks。這不是一個表演阻止者,但是如何使其工作起來會更好。 – 2009-10-25 22:30:43

2

還有就是用AntlrWorks道:

  1. 寫AntlrWorks你的語法
  2. 生成的代碼(這是一樣的從命令行運行ANTLR的W/O調試)
  3. 寫自己類似於建議在Debugging with AntlrWorks faq
  4. 存根寫您的語法樹
  5. 選擇調試Antlrworks(這是與從命令行與去運行ANTLR的錯誤標誌。
  6. 運行存根程序。該計劃將阻塞,直到antlrworks連接,這樣你就可以調試樹語法
  7. 回到antlrworks有你的樹文法開放和調試遠程
  8. 解決問題.... :)
相關問題