ANT*_*ter 9 grammar comments antlr line
鉴于以下基本语法,我想了解如何处理注释行.缺少的是处理<CR><LF>通常会终止注释行 - 唯一的例外是EOF之前的最后一条注释行,例如:
# comment
abcd := 12 ;
# comment eof without <CR><LF>
Run Code Online (Sandbox Code Playgroud)
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' )*
;
Run Code Online (Sandbox Code Playgroud)
Bar*_*ers 18
除非你有一个非常令人信服的理由将评论放在解析器中(我想听到),你应该把它放在词法分析器中:
Comment
: '#' ~( '\r' | '\n' )*
;
Run Code Online (Sandbox Code Playgroud)
既然你已经考虑了Space规则中的换行符,那么输入就没有问题了# comment eof without <CR><LF>
此外,如果在解析器规则中使用文字标记,ANTLR会在幕后自动创建它们的词法规则.所以在你的情况下:
comment
: '#' ~( '\r' | '\n' )*
;
Run Code Online (Sandbox Code Playgroud)
将匹配一个'#'后跟零个或多个令牌比其他'\r'和'\n'和不大于其他零个或多个字符'\r'和'\n'.
备查:
~ 否定令牌. 匹配任何令牌~ 否定人物.匹配范围内的任何字符0x0000......0xFFFF