I am creating a parser using ANTLR 3.x that targets java. I have written both parser grammar (for creating Abstract Syntax Tree, AST) and Tree Grammar (for performing operations on AST). Finally, to test both grammar files, I have written a test file in Java.
Have a look at the below code,
protocol grammar
grammar protocol; options { language = Java; output = AST; } tokens{ //imaginary tokens PROT; INITIALP; PROC; TRANSITIONS; } @header { import twoprocess.Configuration; package com.javadude.antlr3.x.tutorial; } @lexer::header { package com.javadude.antlr3.x.tutorial; } /* parser rules, in lowercase letters */ program : declaration+ ; declaration :protocol |initialprocess |process |transitions ; protocol :'protocol' ID ';' -> ^(PROT ID) ; initialprocess :'pin' '=' INT ';' -> ^(INITIALP INT) ; process :'p' '=' INT ';' -> ^(PROC INT) ; transitions :'transitions' '=' INT ('(' INT ',' INT ')') + ';' -> ^(TRANSITIONS INT INT INT*) ; /* lexer rules (tokens), in upper case letters */ ID : (('a'..'z' | 'A'..'Z'|'_')('a'..'z' | 'A'..'Z'|'0'..'9'|'_'))*; INT : ('0'..'9')+; WHITESPACE : ('\t' | ' ' | '\r' | '\n' | '\u000C')+ {$channel = HIDDEN;}; protocolWalker
grammar protocolWalker; options { language = Java; //Error, eclipse can't access tokenVocab named protocol tokenVocab = protocol; //import tokens from protocol.g i.e, from protocol.tokens file ASTLabelType = CommonTree; } @header { import twoprocess.Configuration; package com.javadude.antlr3.x.tutorial; } program : declaration+ ; declaration :protocol |initialprocess |process |transitions ; protocol :^(PROT ID) {System.out.println("create protocol " +$ID.text);} ; initialprocess :^(INITIALP INT) {System.out.println("");} ; process :^(PROC INT) {System.out.println("");} ; transitions :^(TRANSITIONS INT INT INT*) {System.out.println("");} ; Protocoltest.java
package com.javadude.antlr3.x.tutorial; import org.antlr.runtime.*; import org.antlr.runtime.tree.*; import org.antlr.runtime.tree.CommonTree; import org.antlr.runtime.tree.CommonTreeNodeStream; public class Protocoltest { /** * @param args */ public static void main(String[] args) throws Exception { //create input stream from standard input ANTLRInputStream input = new ANTLRInputStream(System.in); //create a lexer attached to that input stream protocolLexer lexer = new protocolLexer(input); //create a stream of tokens pulled from the lexer CommonTokenStream tokens = new CommonTokenStream(lexer); //create a pareser attached to teh token stream protocolParser parser = new protocolParser(tokens); //invoke the program rule in get return value protocolParser.program_return r =parser.program(); CommonTree t = (CommonTree)r.getTree(); //output the extracted tree to the console System.out.println(t.toStringTree()); //walk resulting tree; create treenode stream first CommonTreeNodeStream nodes = new CommonTreeNodeStream(t); //AST nodes have payloads that point into token stream nodes.setTokenStream(tokens); //create a tree walker attached to the nodes stream //Error, can't create TreeGrammar object called walker protocolWalker walker = new protocolWalker(nodes); //invoke the start symbol, rule program walker.program(); } } Problems:
In protocolWalker, I can't access the tokens (protocol.tokens)
//Error, eclipse can't access tokenVocab named protocol tokenVocab = protocol; //import tokens from protocol.g i.e, from protocol.tokens fileIn In protocolWalker, can I create the object of java class, called Configuration, in the action list?
protocol :^(PROT ID) {System.out.println("create protocol " +$ID.text); Configuration conf = new Configuration(); } ;In Protocoltest.java
//create a tree walker attached to the nodes stream //Error, can't create TreeGrammar object called walker protocolWalker walker = new protocolWalker(nodes);Object of protocolWalker can't be created. I have seen in the examples and the tutorials that such object is created.