[antlr-interest] Keeping lookahead low
Andrew Deren
andrew at adersoftware.com
Wed Aug 24 15:38:58 PDT 2005
Why don't you change your ID rule check if the matched ID starts with Thing
(or whatever logic you have for THING_ID) and do $setType(THING_ID)
-----Original Message-----
From: antlr-interest-bounces at antlr.org
[mailto:antlr-interest-bounces at antlr.org] On Behalf Of Ciaran Treanor
Sent: Wednesday, August 24, 2005 3:26 PM
To: antlr-interest at antlr.org
Subject: [antlr-interest] Keeping lookahead low
Following on from the help provided by Alexey and Olivier yesterday
I've cleaned up a test grammar I was working on and am left with one
question outstanding.
I have a test data file that looks like the following:
System {
foo = Th ! case 1: BROKEN - rhs should be considered an ID
foo = Thing ! case 2: BROKEN - rhs should be considered an ID
foo = Thing123 ! case 3: GOOD - rhs is a THING_ID
foo = Thingy ! case 4: GOOD - rhs is a regular id
foo = foo ! case 5: GOOD - rhs is a regular id
Th = foo ! case 6: BROKEN - lhs should be considered an ID
Thing = foo ! case 7: BROKEN - lhs should be considered an ID
Thing123 = foo ! case 8: Why is error "expecting '}'" instead of expecting
ID
Thingy = foo ! case 9: GOOD - lhs is a regular id
}
Can anyone tell me why the parser fails with the following error when
it endounters 'Th' or 'Thing'?
Exception in thread "main" line 2:11: expecting 'i', found ' '
at com.ct.test.TestLexer.nextToken(TestLexer.java:120)
at
antlr.TokenStreamHiddenTokenFilter.consume(TokenStreamHiddenTokenFilter.java
:38)
at
antlr.TokenStreamHiddenTokenFilter.nextToken(TokenStreamHiddenTokenFilter.ja
va:134)
at antlr.TokenBuffer.fill(TokenBuffer.java:69)
at antlr.TokenBuffer.LA(TokenBuffer.java:80)
at antlr.LLkParser.LA(LLkParser.java:52)
at antlr.Parser.match(Parser.java:210)
at com.ct.test.TestParser.systemBlock(TestParser.java:82)
at com.ct.test.TestParser.testFile(TestParser.java:61)
at com.ct.test.TestParser.main(TestParser.java:31)
Increasing lookahead to 6 fixes case 1 and case 2. Unfortunately
increasing the lookahead isn't really an option for me since, in
reality, 'Thingy' is actually a 20 character word.
What's the simplest thing I can do to the grammar to fix the cases
above that I've flagged as broken?
Oh, can anyone explain the error reported for case 8. This case is an
assignment that looks like:
THING_ID = ID
Since the grammar is expecting assignments of the form ID = ( ID |
THING_ID) I would have thought the parser would complain that it found
a THING_ID when it was expecting a regular ID. Instead it compains
about expecting '}'. Why is that?
Thanks a million (oh, grammar and test file attached)
ct
More information about the antlr-interest
mailing list