[antlr-interest] Parsing comments
David-Sarah Hopwood
david-sarah at jacaranda.org
Thu Sep 17 11:33:57 PDT 2009
Soren Holstebroe wrote:
> Thank you for your answer,
>
> As i understand it, your suggestion considers the whole template line as a
> single token, but I don't want the template token to eat up the rest of the
> line, since this is where my template wrapping grammar would be.
>
> My grammar will have rules like this:
>
> wrap_option
> : WRAP_OPTION_BEGIN
> ( 'WRAP'
> | 'TEMPLATE' '<' type_specifier (',' type_specifier)* '>'
> )
> ;
>
> so I need something to match '//' WS* '@' as my WRAP_OPTION_BEGIN.
The tricky part here is that the parser should ideally report an error
if the template line does not end with a newline, but newline would
normally be a hidden token. Here's a possible solution (untested):
@lexer::members {
private int newlineChannel = HIDDEN;
}
fragment WRAP_OPTION_BEGIN : ;
SLCOMMENT
: '//' WS? ( '@' { $type = WRAP_OPTION_BEGIN;
newlineChannel = DEFAULT_CHANNEL; }
| ( ~('@' | '\r' | '\n' | ' ' | '\t') (~('\r' | '\n'))* )? EOL
{ $channel = HIDDEN; }
)
;
NEWLINE
: ('\r' '\n'? | '\n')
{ $channel = newlineChannel;
newlineChannel = HIDDEN; }
;
fragment EOL
: NEWLINE
// allow single-line comment without newline at end of file
| { input.LA(1) == EOF }?
;
WS : (' ' | '\t')+ { $channel = HIDDEN; } ;
// parser
wrap_option
: WRAP_OPTION_BEGIN
( 'WRAP'
| 'TEMPLATE' '<' type_specifier (',' type_specifier)* '>'
)
NEWLINE
;
--
David-Sarah Hopwood ⚥ http://davidsarah.livejournal.com
More information about the antlr-interest
mailing list