HQL语法中的注释冲突



我正在尝试创建--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规则,因为当我删除它时,规则工作正常。

但删除它并不是最佳解决方案——任何可能导致这种情况的想法以及如何绕过它

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

COMMENT 
: ( CMark .*? Vws 
| DMark .*? ~[; trnf] Hws* Vws 
) -> channel(HIDDEN)  
;
fragment CMark : '//' ;
fragment DMark : '--' ;
fragment Hws   : [ t] ;
fragment Vws   : [rn]+ ;

解释

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

如果终止空白之前的一个可见字符不是SEMI,则第二个alt将匹配--注释。~是一组否定,而[; trnf]是一组字符。由于不存在修改集合的运算符,~[; trnf]将只匹配不是命名字符之一的单个字符。

因此,注释规则将不匹配包含--并终止于SEMI的代码行的终端部分。

相关内容

  • 没有找到相关文章

最新更新