鉴于以下基本语法,我想了解如何处理注释行。缺少的是处理<CR><LF>
它通常终止注释行 - 唯一的例外是 EOF 之前的最后一个注释行,例如: 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' )*
;
除非您有非常令人信服的理由将注释放入解析器中(我想听听),否则您应该将其放入词法分析器中:
Comment
: '#' ~( '\r' | '\n' )*
;
由于您已经考虑了换行符Space
规则,这样输入没有问题# comment eof without <CR><LF>
此外,如果您在解析器规则中使用文字标记,ANTLR 会在幕后自动创建它们的词法分析器规则。所以在你的情况下:
comment
: '#' ~( '\r' | '\n' )*
;
将匹配一个'#'
后面跟着零个或多个tokens以外'\r'
and '\n'
and not零个或多个字符,除了'\r'
and '\n'
.
备查:
内部解析器规则
内部词法分析器规则
-
~
否定字符
-
.
匹配范围内的任意字符0x0000
... 0xFFFF
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)