如何禁止在antlr中嵌套注释

时间:2013-04-18 17:38:59

标签: comments antlr

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

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

然而,这目前允许这样的事情:

/* /* hello */ */

有没有办法在antlr中禁用嵌套注释?我尝试过各种各样的事情,比如

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

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

2 个答案:

答案 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;}
    ;