0

我目前在 antlr 中有一个多行注释词法分析器规则,如下所示:

MULTILINE: '/*' .* '*/' {$channel=HIDDEN;} ;

但是,这目前允许执行以下操作:

/* /* hello */ */

有没有可能的方法来禁用 antlr 中的嵌套评论?我尝试过各种各样的事情,比如

MULTILINE: '/*' (~(MULTILINE)|.*) '*/' {$channel=HIDDEN;} ;

但这不起作用。任何帮助将非常感激!

4

2 回答 2

2

不,那是不正确的:.*并且.+不贪婪。

给定由以下语法生成的解析器:

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 个令牌。

于 2013-04-18T17:50:54.447 回答
0

尝试这个:

无法在评论正文中识别前缀或后缀。此外,不允许嵌套。

COMMENT_NON_NEST
    : '/*'
      ( ('/'|'*'+)? ~[*/] )*?
      ('/'|'*'+?)?
      '*/'
      {$channel=HIDDEN;}
    ;
于 2017-10-16T20:02:15.380 回答