HQL语法中的注释冲突

时间:2018-12-20 17:23:02

标签: parsing antlr antlr4 lexer

我正在尝试创建--someinteger;语句,但是我的问题出在HQL的单行注释规则上,它指出:
L_S_COMMENT : ('--' | '//') .*? '\r'? '\n' -> channel(HIDDEN) ;
我在词法分析器中写的规则是:
T_SUB2 : '--' ;
T_SEMICOLON : ';' ;
解析器中的规则:
dummy_rule: T_SUB2 'i' T_SEMICOLON ;
当我测试该规则时,它可以正确显示解析树,但是当我按ENTER输入新行时,它显示错误,并且不再接受其他规则,我知道其评论规则因为当我删除它时,规则运作良好, 但是,删除任何可能导致此问题以及如何绕过它的想法并不是最佳解决方案。

1 个答案:

答案 0 :(得分:0)

如果始终必须在SEMI中终止相关语句,则应从注释定义中排除:

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

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

说明

规则的第一个替代项与标准//注释匹配

第二个替代字符将匹配--注释,前提是在终止空白之前的一个可见字符不是SEMI。 ~被设置为否定,而[; \t\r\n\f]是一组字符。由于没有操作员修改集合,因此~[; \t\r\n\f]将仅匹配不是指定字符之一的单个字符。

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