[antlr-interest] Creating a simple expression language
Ivar Refsdal
refsdal.ivar at gmail.com
Sun Nov 23 14:20:27 PST 2008
Hi,
I'm also a newbie (thus everything could be wrong) so I can't help that
much... But anyway:
Here is a edited Expr grammar:
grammar Expr;
options {
output=AST;
ASTLabelType=CommonTree;
k = 1;
}
prog : (stat {System.out.println($stat.tree.toStringTree());} )+ ;
stat : expr -> expr;
expr : multExpr (('+' ^ | '-'^) multExpr)*
;
multExpr : atom ('*'^ atom)*
;
atom : INT
| function
/* We don't want nodes for the parentheses */
| '('! expr ')'!
;
/* We don't want nodes for the paretheses or commas. */
function : fname^ '('! variable_list? ')'! ;
variable_list
: (variable ( ','! variable )* )
;
variable : FUNCNAME;
fname : FUNCNAME;
FUNCNAME : ( 'a' .. 'z' | 'A' .. 'Z')+ ;
INT : '0' .. '9'+ ;
WS : ( ' ' | '\t' | '\n' | '\r' ) + {skip(); };
It makes it a little bit easier to debug..
Lexer rules (upper case) will not be included/"named" in the parse tree,
but parser rules (lower case) will, so it's easier to have an overview
like this.
Note also: You don't need to bother with using WS i parser rules as they
will already have
been skipped on the lexer level.
Here is a screenshot of debugging the input with (almost) the orginal
grammar,
showing the parse tree:
http://ivarref.at.ifi.uio.no/antlr_screen.png
The input was:
"somefn(arga,argb,argc)"
So as you can see it's not quite generating what you're expecting.
The same holds for using the interactive interpreter, but I prefer the
debugger at the moment.
It works more or less like expected with the revised grammar..
Also, are you sure you want k=1? Check out the backtrack=true option
also, that helped me
for grammars that wasn't easily determined (multiple alternatives). If
you ever run into that.
I've read just a little bit of the Dragon book (new edition), that
helped me a little bit..
Well, good luck,
Ivar
(first post, hope this works.)
More information about the antlr-interest
mailing list