【发布时间】:2015-03-22 03:08:31
【问题描述】:
我目前正在研究支持 C 样式注释的 ANTLR 词法分析器规则。对于这样的目标,有一个广泛推荐的规则:
C_COMMENT
:
'/*' (options {greedy=false;}: .)* '*/'
{ $channel=HIDDEN; }
;
但是我想要的是另一种选择:'+' 不允许成为评论正文的第一个非空格字符,例如/* +blablabla*/ 不是有效的评论。 然后我尝试了这样的事情:
C_COMMENT
:
'/*' (' '|'\r'|'\t'|'\n')* ~(' '|'\r'|'\t'|'\n'|'+') (options {greedy=false;}: .)* '*/'
{ $channel=HIDDEN; }
;
除了空的 cmets /* */ 之外,它几乎成功了。所以我尝试了这样的事情:
C_COMMENT
:
'/*' (' '|'\r'|'\t'|'\n')*
(
'*/'
|
(~(' '|'\r'|'\t'|'\n'|'+') (options {greedy=false;}: .)* '*/')
)
{ $channel=HIDDEN; }
;
它,以及我没有列出的一堆类似的,从来没有工作过。 /* */ 中的 * / 总是属于 ~(' '|'\r'|'\t'|'\n'|'+') 部分。
最后我得到了这样的工作:
C_COMMENT
:
'/*' (' '|'\r'|'\t'|'\n')* '*/'
{ $channel=HIDDEN; }
|
'/*' (' '|'\r'|'\t'|'\n')*
(
'*/'
|
(~(' '|'\r'|'\t'|'\n'|'+') (options {greedy=false;}: .)* '*/')
)
{ $channel=HIDDEN; }
;
尽管 ANTLR 警告说 /* */ 之类的模式可以匹配这两种选择。
谁能帮我理解这一切?我的意思是,为什么在最后一个之上没有任何效果。
提前致谢。
【问题讨论】:
标签: regex parsing antlr grammar lexer