【问题标题】:Parse comment line解析注释行
【发布时间】:2011-10-27 14:21:39
【问题描述】:

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

【问题讨论】:

  • “处理”注释行是什么意思?你想知道如何解析它们吗?
  • 您似乎正在尝试处理解析器语法中的 cmets,通常乳清会在词法分析器中处理,类似于您的 Whitespace 规则。您确定要在解析器中这样做吗?
  • 具体是什么现在不起作用?我发现这个 ANTLR 邮件列表从 2006 年开始发布,问题基本相同(和答案,但看起来与您已有的相似):antlr.org/pipermail/antlr-interest/2006-January/015130.html
  • 非常感谢您的回答! @john:非常有价值的链接,特别感谢。

标签: line antlr grammar comments


【解决方案1】:

除非您有非常令人信服的理由将注释放入解析器(我想听听),否则您应该将其放入词法分析器中:

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

而且由于您已经在 Space 规则中考虑了换行符,因此像 # comment eof without &lt;CR&gt;&lt;LF&gt; 这样的输入没有问题

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

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

将匹配 '#' 后跟零个或多个 tokens,而不是 '\r''\n'not 零个或多个'\r''\n' 以外的字符。

供将来参考:

内部解析器规则

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

内部词法分析器规则

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

【讨论】:

  • 再次感谢 Bart 的回答。我想使用解析器规则来进一步处理注释行。现在我尝试使用解析器规则comment 和词法分析器规则Comment,它也可以工作。但这是正确的方法吗?在这种情况下,在使用词法分析器规则或解析器规则时,是否有或多或少的通用规则?
  • @ANTLRStarter,cmets 几乎总是单个令牌。如果您将它们“提升”为解析器规则,您还需要从 Space 中删除 '\r''\n' 并创建一个 LineBreak 令牌:否则您将无法“看到”@ 987654342@(作为解析器规则!)结束。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-09
  • 2011-03-18
  • 2016-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多