Debugging Tree Grammars in ANTLRWorks
The current version of ANTLRWorks does not support tree grammar debugging directly. However, there is a way to get it to work using remote debugging. The ANTLR FAQ for debugging has some information on setting up remote debugging but it does not show the remaining steps for tree debugging.
1 import java.io.*;
2 import org.antlr.runtime.*;
3 import org.antlr.runtime.tree.*;
4 import org.antlr.runtime.debug.*;
5
6 /*
7 Sample file that shows how to connect to AntlrWorks
8
9 Remember to change the following to suit your own project
10 - XMLGrammarLexer
11 - XMLGrammarParser
12 - XMLTree
13
14 */
15
16 public class TreeTest {
17
18 public static void main(String args[]) throws Exception {
19 CharStream input = new ANTLRFileStream(args[0]);
20 XMLGrammarLexer lex = new XMLGrammarLexer(input);
21
22 // MODIFY: change document to the root rule
23 ParseTreeBuilder builder = new ParseTreeBuilder("document");
24
25 // create a debug socket proxy to ANTLRWorks
26 // MODIFY: change the name of the grammar file
27 DebugEventSocketProxy AW = new DebugEventSocketProxy("/Users/vazexqi/Antlr/handGeneratedXMLGrammar/XMLTree.g");
28 AW.handshake();
29
30 DebugEventHub hub = new DebugEventHub(builder, AW);
31
32 CommonTokenStream tokens = new CommonTokenStream(lex);
33 XMLGrammarParser parser = new XMLGrammarParser(tokens);
34 XMLGrammarParser.document_return root = parser.document();
35
36 CommonTreeNodeStream nodes = new CommonTreeNodeStream((Tree)root.tree);
37 XMLTree walker = new XMLTree(nodes, hub);
38 try {
39 // MODIFY: change to the rule that you want to follow
40 walker.document();
41 } catch (RecognitionException e) {
42 e.printStackTrace();
43 }
44
45 }
46 }
The original file is available from here.
And when you generate the relevant files for your grammar, you must use the - debug option as such:
java org.antlr.Tool XMLGrammar.g
java org.antlr.Tool -debug XMLTree.g
Notice that you should not use the -debug option for the normal grammar file (the one that contains the parser/lexer). If you use the - debug option then it will try to debug the XMLGrammar.g file in addition to the XMLTree.g file and cause this error:
error(10): internal error: org.antlr.runtime.debug.DebugParser.reportError(DebugParser.java:88): java.net.BindException: Address already in use
Compile the necessary java files and run the program using java TestTree someFile. Then in ANTLRWorks, select Debugger > Debug Remote....
comments powered by Disqus