HQL语法中的注释冲突

Comment conflict in HQL grammar

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

但我的问题在于 HQL 的单行注释规则,它指出:

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

我在词法分析器中写了规则:

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

解析器中的规则:

dummy_rule: T_SUB2 'i' T_SEMICOLON ;

当我测试规则时,它在解析树正确显示的情况下工作正常,但是 当我按 ENTER 换行时它显示错误,它不再接受任何规则,我知道它是 L_S_COMMENT 规则,因为当我删除它时,规则工作正常。

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

如果相关语句总是必须在 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 中终止的代码行的终端部分。