解析注释行

时间:2011-08-15 20:56:54

标签: line antlr grammar comments

鉴于以下基本语法,我想了解如何处理注释行。缺少的是<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' )*
  ;

1 个答案:

答案 0 :(得分:18)

除非你有一个非常令人信服的理由将评论放在解析器中(我想听到),你应该把它放在词法分析器中:

Comment
  :  '#' ~( '\r' | '\n' )*
  ;

由于您已经考虑了Space规则中的换行符,因此# comment eof without <CR><LF>等输入没有问题

此外,如果在解析器规则中使用文字标记,ANTLR会在幕后自动创建它们的词法规则。所以在你的情况下:

comment
  :  '#' ~( '\r' | '\n' )*
  ;

将匹配'#'后跟零个或多个令牌,而不是'\r''\n'以及 不是 < / strong>除'\r''\n'以外的零个或多个字符。

供将来参考:

内部解析器规则

  • ~否定令牌
  • .匹配任何令牌

内部词法规则

  • ~否定字符
  • .匹配范围0x0000 ... 0xFFFF
  • 中的任何字符