[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