解析注释行

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