[antlr-interest] Reading all text to end-of-line in a rule

Martijn Reuvers martijn.reuvers at gmail.com
Fri Nov 26 12:51:22 PST 2010


Not tested but I think think your NEWLINE is the problem, replace
'\r'? '\n' with a reference to NEWLINE and make sure NEWLINE is
somewhere at the bottom of the grammar (you don't want it to be
matched too early). As NEWLINE & '\r'? \n' are both matching the same.



On Fri, Nov 26, 2010 at 8:09 PM, Bill Lear <rael at zopyra.com> wrote:
> On Friday, November 26, 2010 at 19:23:24 (+0100) Martijn Reuvers writes:
>>Hello Bill,
>>
>>The grammar below does the trick for your command (I stripped it
>>somewhat, to quickly get it working). See the SHELL_COMMAND token,
>>notice the options part with the greedy identifier. It reads until it
>>encounters the newline stuff. You need to have something in front of
>>it, like SHELL in this example - otherwise it would match anything,
>>which is not what you want.
>
> Thanks Martijn.  I tried replacing my original COMMAND_TEXT with
> your suggestion:
>
> COMMAND_TEXT: (options {greedy=false;} : . )* '\r'? '\n' {
>        setText(getText().trim());
>    }
>    ;
>
> and though this reduces the conflict, I still have one I don't know how
> to resolve:
>
> error(208): Command.g:124:1: The following token definitions can never be matched because prior tokens match the same input: NEWLINE
>
> I need the NEWLINE so I can limit the commands to a single line.  Here is
> one part of the grammar I did not share that is relevant, along with
> the parts I changed with your help:
>
> command
>    : (clean|shell) (NEWLINE | EOF)
>    | NEWLINE
>    ;
>
> [clean as before]
>
> shell : 'shell' timeoutOption? COMMAND_TEXT ;
>
> [timeoutOption as before, etc.]
>
> COMMAND_TEXT: (options {greedy=false;} : . )* '\r'? '\n' {
>        setText(getText().trim());
>    }
>    ;
> EMAIL: ~('\n' | '\r' | ' ' | '"')+ ;
> NEWLINE: '\r'? '\n' ;
> WS: (' ' | '\t')+ { skip(); } ;
>
> So, how do I preserve the single-line command idiom with the shell command
> "read-to-end-of" line part?
>
>
> Bill
>


More information about the antlr-interest mailing list