【问题标题】:Comment conflict in HQL grammarHQL 语法中的注释冲突
【发布时间】:2018-12-20 17:23:02
【问题描述】:

我正在尝试创建 --i; 语句。

但我的问题在于 HQL 的 单行注释规则

 L_S_COMMENT : ('--' | '//')  .*? '\r'? '\n' -> channel(HIDDEN)  ; 

我在lexer中写了规则:

T_SUB2         : '--' ;
T_SEMICOLON    : ';' ;

解析器中的规则

dummy_rule: T_SUB2 'i' T_SEMICOLON ;

当我测试规则时,它可以正常显示解析树,但是当我按 ENTER 换行时显示错误,并且它不会接受还有更多规则,我知道它是 L_S_COMMENT 规则,因为当我删除它时,规则可以正常工作。

但删除它并不是最佳解决方案,任何可能导致此问题以及如何绕过它的想法。

【问题讨论】:

  • 您的语法似乎自相矛盾。非正式地,-- 何时是评论的开始,何时不是?
  • 这就是为什么我问如何在不删除评论规则的情况下跳过这个矛盾
  • @Makdous:这不是语法问题。这是一个语言设计问题。当您查看评论时,将如何确定评论是评论还是 -- 声明?你必须先回答这个问题,然后你才能设计一个适合的语法。就个人而言,我认为必须回答这个问题表明添加--f 作为声明并不是一个好主意。毕竟,f -= 1 几乎不会更难输入,而且阅读起来也不会那么混乱。

标签: parsing antlr antlr4 lexer


【解决方案1】:

如果相关语句总是必须在 SEMI 中终止,则有效地将 then 从注释定义中排除:

COMMENT 
    : ( CMark .*? Vws 
      | DMark .*? ~[; \t\r\n\f] Hws* Vws 
      ) -> channel(HIDDEN)  
    ;

fragment CMark : '//' ;
fragment DMark : '--' ;
fragment Hws   : [ \t] ;
fragment Vws   : [\r\n]+ ;

解释

规则的第一个 alt 匹配标准 // 注释

第二个 alt 将匹配 -- 注释,如果紧接在终止空格之前的一个可见字符不是 SEMI。 ~ 是设置否定,而 [; \t\r\n\f] 是一组字符。由于没有操作员修改该集合,~[; \t\r\n\f] 将仅匹配不是指定字符之一的单个字符。

因此,注释规则将不匹配包含 -- 并以 SEMI 结尾的代码行的结尾部分。

【讨论】:

  • 你能解释一下这条规则的作用吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多