我目前在antlr中有一个多行注释词法分析器规则,如下所示:
MULTILINE: '/*' .* '*/' {$channel=HIDDEN;} ;
然而,这目前允许这样的事情:
/* /* hello */ */
有没有办法在antlr中禁用嵌套注释?我尝试过各种各样的事情,比如
MULTILINE: '/*' (~(MULTILINE)|.*) '*/' {$channel=HIDDEN;} ;
但这不起作用。任何帮助将非常感激!
答案 0 :(得分:2)
不,这不正确:.*
和.+
并不贪心。
给定由以下语法生成的解析器:
grammar T;
parse
: (t=. {System.out.printf("\%-15s'\%s'\n", tokenNames[$t.type], $t.text);} )* EOF
;
MULTILINE
: '/*' .* '*/' {$channel=HIDDEN;}
;
OTHER
: .
;
输入"/* /* hello */ */"
将在命令行中生成以下内容:
OTHER ' ' OTHER '*' OTHER '/'
即,"/* /* hello */"
被置于HIDDEN
频道,并构建了3个OTHER
代币。
答案 1 :(得分:0)
试试这个:
在注释正文中无法识别前缀或后缀。此外,不允许嵌套。
COMMENT_NON_NEST
: '/*'
( ('/'|'*'+)? ~[*/] )*?
('/'|'*'+?)?
'*/'
{$channel=HIDDEN;}
;