consili...@gmail.com wrote:
> On 09-08-18 12:43 PM, David-Sarah Hopwood wrote:
>> consili...@gmail.com wrote:
>>> The last line, b., doesn't match the MC_INCORRECT token because there's
>>> no newline after it. Is there an easy way to match this in ANTLR?
>> Yes. I had the same problem when matching the end of a //-style comment,
>> and solved it like this:
>>
>> fragment ENDOFLINE
>>    : NEWLINE
>>    | { input.LA(1) == EOF }?
>>    ;
>>
>> (If this were a non-fragment rule, it would be a problem that it can
>> sometimes match no characters, but since it's a fragment, that's OK.)
> 
> I want to use your solution, however it throws errors about "The 
> following alternatives can never be matched: 1" for MC_QUESTION and 
> MC_INCORRECT. Shouldn't the below work?
> 
> MC_QUESTION  : INT ('.'|')') .* ENDOFLINE;
> MC_INCORRECT : LETTER '.' .* ENDOFLINE;
> MC_CORRECT   : '*' MC_INCORRECT;
> 
> fragment ENDOFLINE : NEWLINE | { input.LA(1) == EOF }?;
> fragment NEWLINE : '\r'? '\n';
> fragment LETTER  : ('a'..'z'|'A'..'Z');
> fragment INT     : '0'..'9'+;

ANTLR is correctly warning that .* will always match to the end of the
input (since . includes '\r' and '\n'), so the NEWLINE will never be
matched. This problem occurs in both the MC_QUESTION and MC_INCORRECT
rules.

Normally you would be able to use "(options { greedy=false; } : .)*" in
place of ".*" to correct a problem like this. However, that doesn't appear
to work in this particular case (in my experience the greedy=false option
can be a bit fragile), so I would suggest:

MC_QUESTION  : INT ('.' | ')') NOTNEWLINE* ENDOFLINE;
MC_INCORRECT : LETTER '.' NOTNEWLINE* ENDOFLINE;

// ~NEWLINE won't work in this case.
fragment NOTNEWLINE
  : ~('\r' | '\n')
  | { input.LA(2) != '\n' }? '\r'
  ;

// ENDOFLINE, NEWLINE, LETTER and INT unchanged


Alternatively, you might want to match bare '\r' as a newline (as used
in original MacOS). In that case change MC_QUESTION and MC_INCORRECT as
above, but use:

fragment NOTNEWLINE : ~('\r' | '\n');
fragment NEWLINE : '\r' '\n'? | '\n';

-- 
David-Sarah Hopwood  ⚥  http://davidsarah.livejournal.com


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 il-antlr-interest@googlegroups.com
To unsubscribe from this group, send email to 
il-antlr-interest+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/il-antlr-interest?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to