Evan Driscoll wrote: > I just started work on a grammar to read well, context free grammars, > and am running into a problem. (I'm probably just doing something dumb.) > I've attached my grammar. > > The ARROW token (used between the left and right sides of a production) > should recognize either ':' or '->', but the AntlrWorks interpreter only > accepts '->'. If I try to parse the input 'a -> b;', I get the proper > result. If I try to parse 'a : b;', it gives a MismatchedTokenException. > (I am pretty sure I saw the same behavior using the debug option, but I > don't have the JDK on this computer and can't confirm it.) > > The rules in question are: > > COLON : ':'; // used in multiple places > > ARROW > : '->' > | COLON > ; > > production > : SYMBOL ARROW disjunction SEMICOLON > ;
Okay, I figured it out. Since COLON is listed first, the : in the input stream gets lexed as a COLON token and not ARROW. My mistake was borne out of a misunderstanding of what the docs mean about ANTLR lexing using the same LL(*) parsing strategy as the parser proper. I figured that it would be parsing the 'production' rule, get to the use of ARROW, then go and call mARROW() in the lexer, and mARROW() would consume the : and emit a ARROW token. However, before that point the lookahead framework needs to get a token stream, and so it calls mTokens(). mTokens sees the : sitting in the input stream and (correctly) uses the COLON rule. The fix I put in place was to remove the 'ARROW: COLON' production, create a new non-terminal 'arrow: COLON | ARROW', and change the use of 'ARROW' to 'arrow'. Evan List: http://www.antlr.org/mailman/listinfo/antlr-interest Unsubscribe: http://www.antlr.org/mailman/options/antlr-interest/your-email-address -- You received this message because you are subscribed to the Google Groups "il-antlr-interest" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/il-antlr-interest?hl=en.
