我正在尝试创建--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的代码行的终端部分。