I have some non-reserved keywords I'm matching with rules like:
kFOO = {self.input.LT(1).text.lower() == 'foo'}? ID;
Where the ID
token is a standard alpha-numeric string. These kinds of rules work great, except when I try to do something like this:
some_rule
@after { do_something_with($t.text) }
: t=kWORD1
| t=kWORD2
| t=kWORD3
;
In the generated parser, the kWORD1
and kWORD2
rule functions don't return anything, but the kWORD3
function does. As well, in the some_rule
function, only the block trying to match kWORD3
assign the return value to t
. The other two invocations don't reference t
in any way.
(Also, I expected the following to work, but it did not, I suspect for the same underlying reason.
some_rule
@after { do_something_with($t.text) }
: t=( kWORD1
| kWORD2
| kWORD3)
;
Nothing gets assigned to t
under any conditions.)
However, the following DOES work as expected:
some_rule
@after { do_something_with($t1.text or $t2.text or $t3.text) }
: t1=kWORD1
| t2=kWORD2
| t3=kWORD3
;
Each of the matching functions is generated to return a value, and each of the blocks matching the keyword rules in some_rule
assigns the return value to their label. The problem with this solution is it gets a little excessive when there are several more alternatives.
Half of me cries "BUG!" but this is the first antlr project I've done, so more likely there's something I don't understand.
What's the best way to do what it is I'm trying to do here?