鉴于以下基本语法,我想了解如何处理注释行。缺少的是<CR><LF>
的处理,它通常终止注释行 - 唯一的例外是EOF之前的最后一个注释行,e。 G:
# comment
abcd := 12 ;
# comment eof without <CR><LF>
grammar CommentLine1a;
//==========================================================
// Options
//==========================================================
//==========================================================
// Lexer Rules
//==========================================================
Int
: Digit+
;
fragment Digit
: '0'..'9'
;
ID_NoDigitStart
: ( 'a'..'z' | 'A'..'Z' ) ('a'..'z' | 'A'..'Z' | Digit )*
;
Whitespace
: ( ' ' | '\t' | '\r' | '\n' )+ { $channel = HIDDEN ; }
;
//==========================================================
// Parser Rules
//==========================================================
code
: ( assignment | comment )+
;
assignment
: id_NoDigitStart ':=' id_DigitStart ';'
;
id_NoDigitStart
: ID_NoDigitStart
;
id_DigitStart
: ( ID_NoDigitStart | Int )+
;
comment
: '#' ~( '\r' | '\n' )*
;
答案 0 :(得分:18)
除非你有一个非常令人信服的理由将评论放在解析器中(我想听到),你应该把它放在词法分析器中:
Comment
: '#' ~( '\r' | '\n' )*
;
由于您已经考虑了Space
规则中的换行符,因此# comment eof without <CR><LF>
等输入没有问题
此外,如果在解析器规则中使用文字标记,ANTLR会在幕后自动创建它们的词法规则。所以在你的情况下:
comment
: '#' ~( '\r' | '\n' )*
;
将匹配'#'
后跟零个或多个令牌,而不是'\r'
和'\n'
以及 不是 < / strong>除'\r'
和'\n'
以外的零个或多个字符。
供将来参考:
~
否定令牌.
匹配任何令牌~
否定字符.
匹配范围0x0000
... 0xFFFF