我目前在 antlr 中有一个多行注释词法分析器规则,如下所示:
MULTILINE: '/*' .* '*/' {$channel=HIDDEN;} ;
但是,这目前允许执行以下操作:
/* /* hello */ */
有没有可能的方法来禁用 antlr 中的嵌套评论?我尝试过各种各样的事情,比如
MULTILINE: '/*' (~(MULTILINE)|.*) '*/' {$channel=HIDDEN;} ;
但这不起作用。任何帮助将非常感激!
不,那是不正确的:.*
并且.+
不贪婪。
给定由以下语法生成的解析器:
grammar T;
parse
: (t=. {System.out.printf("\%-15s'\%s'\n", tokenNames[$t.type], $t.text);} )* EOF
;
MULTILINE
: '/*' .* '*/' {$channel=HIDDEN;}
;
OTHER
: .
;
输入"/* /* hello */ */"
将在您的命令行上产生以下内容:
其他 ' ' 其他 '*' 其他 '/'
即,"/* /* hello */"
被放到HIDDEN
通道上,并且OTHER
构建了 3 个令牌。
尝试这个:
无法在评论正文中识别前缀或后缀。此外,不允许嵌套。
COMMENT_NON_NEST
: '/*'
( ('/'|'*'+)? ~[*/] )*?
('/'|'*'+?)?
'*/'
{$channel=HIDDEN;}
;