[antlr-interest] mild simplification and tree grammars
Giampaolo Tomassoni
Giampaolo at Tomassoni.biz
Wed Apr 21 03:51:33 PDT 2010
> Another extension of the example shows another ANTLR feature,
> with associated subtle syntax. Say the conditionalExpression
> was being called with TheActualASTRoot being optional, then
> ANTLR supports this with semantic predicates on the tree generation
> options:
>
> protected
> conditionalExpression[CommonTree TheActualASTRoot]
> : QMARK t=expression COMMA f=expression
> -> {(TheActualASTRoot != null)}? ^(ITE {$TheActualASTRoot}
> $t $f)
> -> {(TheActualASTRoot == null)}? ^(ITE $t $f)
> ->
> |
> ;
Nice.
I didn't get why you were telling me that, but now I see: this way it is
easier to avoid non-LLR notations.
Just, I can't turn on my shc (SomethingHasChanged) flag anymore: a rule
like:
condExpr
: QMARK c=orExpression t=condExpr f=condExpr
-> {($c.tree.getType()==TRUE)}? {shc=true;} $t
-> {($c.tree.getType()==FALSE)}? {shc=true;} $f
->
;
Produces a java source with errors, because {shc=true;} is now interpreted
like a tree node reference, not like a java statement to be passed to the
compiler verbatim.
I had to use a function's side-effect to keep track of tree modifications:
@members {
private boolean shc = false;
private boolean sshc(boolean cond) {
shc |= cond;
return(cond);
}
}
...
protected
condExpr
: QMARK c=orExpression t=condExpr f=condExpr
-> {sshc($c.tree.getType()==TRUE)}? $t
-> {sshc($c.tree.getType()==FALSE)}? $f
-> QMARK $c $t $f
| additiveExpression
;
Also note the last '->' term is non-empty, because I'm not rewriting (the
ANTLR compiler says rewrite mode implies backtrack=true).
Do you think is it fine this way or there is some workaround I can implement
to avoid the need of a side-effect function?
Giampaolo
More information about the antlr-interest
mailing list