[antlr-interest] Problem with tree parser using ANTLR 3.x
iamhere
hongyan99 at yahoo.com
Wed May 18 18:11:15 PDT 2011
Hi,
I'm newbie with ANTLR and is currently working on a ANTLR parser. The parser
grammar worked just fine. It created a tree that looked right. But when I
tried to walk the tree with my tree grammar, it failed. I hope that someone
here could help. Any help is appreciated!
The script language I'm working on has the following structure:
assignment or expression<new line>
assignment or expression<new line>
assignment or expression<new line>
....
where assignment is like
identifier = expression
My parser grammar is:
-----------------------------------------------------------------------------
grammar myscript;
options {
language = Java;
output = AST;
ASTLabelType = CommonTree;
}
tokens {
NEGATION;
NEXT;
}
@header {
package a.b.c;
}
@lexer::header {
package a.b.c;
}
codeFragment
: (next!)? statement (next! statement)* EOF
;
next
: ('\r' | '\n' )+ -> NEXT
;
statement
: expression
| assignment;
assignment
: IDENT '='^ expression
;
term
: INTEGER
| IDENT
| '('! expression ')'!
;
negate
: '!'^* term
;
unary
: ('+'! | negation^)* negate
;
negation
: '-' -> NEGATION
;
mult
: unary (('*'^ | '/'^) unary)*
;
add
: mult (('+'^ | '-'^) mult)*
;
relation
: add (('=='^ | '<'^ | '<='^ | '>'^ | '>='^) add)*
;
expression
: relation (('&'^ | '&&'^ | '|'^ | '||'^) relation)*
;
INTEGER: '0' | '1'..'9' DIGIT* 'L'? | '0x' DIGIT+ 'L'?;
IDENT: LETTER (LETTER | DIGIT)*;
WS: (' ' | '\t' | '\f')+ {$channel = HIDDEN;};
COMMENT: '#' .* ('\n'|'r') {$channel=HIDDEN;};
fragment DIGIT: '0'..'9';
fragment LETTER: ('a'..'z' | 'A'..'Z');
-----------------------------------------------------------------------------
The tree walker grammar is:
-----------------------------------------------------------------------------
tree grammar CodeFragWalker;
options {
language = Java;
tokenVocab = myscript;
ASTLabelType = CommonTree;
output = AST;
}
@header {
package a.b.c;
}
evaluator returns [String result]
: (assignment | expression)* EOF!
;
assignment returns [int result]
: ^('=' IDENT expression)
;
expression returns [int result]
: ^('+' expression expression)
| ^('-' expression expression)
| ^('*' expression expression)
| ^('/' expression expression)
| ^(NEGATION expression)
| IDENT
| INTEGER
;
-----------------------------------------------------------------------------
The tree output from the parser is:
(= a (* (* 3 (+ 2 3)) 2)) (= b (+ 3 5)) (+ a b) (+ 1 2) <EOF>
The error I'm getting when running the following is :
node from line 2:1 mismatched tree node: = expecting EOF
The code:
-----------------------------------------------------------------------------
CharStream charStream = new ANTLRStringStream("\na=3*(2+3)*2\r\n\r\n" +
"b=3+5\r" +
"a+b\n" +
"1+2");
myscriptLexer lexer = new myscriptLexer(charStream);
TokenStream tokenStream = new CommonTokenStream(lexer);
myscriptParser parser = new myscriptParser(tokenStream);
codeFragment_return fragment = parser.codeFragment();
CommonTree tree = fragment.tree;
System.out.println(tree.toStringTree());
CommonTreeNodeStream nodeStream = new CommonTreeNodeStream(tree);
CodeFragWalker walker = new CodeFragWalker(nodeStream);
walker.evaluator();
-----------------------------------------------------------------------------
--
View this message in context: http://antlr.1301665.n2.nabble.com/Problem-with-tree-parser-using-ANTLR-3-x-tp6380250p6380250.html
Sent from the ANTLR mailing list archive at Nabble.com.
More information about the antlr-interest
mailing list