1

首先,我是 ANTLR 的新手。我问的对你们其他人来说可能是微不足道的,但我需要你的帮助。

我想匹配流中的所有限定名称,并忽略流中的其余字符。

我尝试了以下方法:

findAllQualifiedNames
    :   qualifiedName+
    ;

qualifiedName 
    :   IDENTIFIER
        ('.' IDENTIFIER)*
    ;

IDENTIFIER
    :   ('_'
    |   '$'
    |   ('a'..'z' | 'A'..'Z'))
        ('a'..'z' | 'A'..'Z' | '0'..'9' | '_' | '$')*
    ;
AnyOtherChar
    :   . 
    {$channel=HIDDEN;}
    ;

但它没有按我预期的方式工作:对于 input ,它仅作为限定名称a.b.c;d.e.f;匹配。a.b.c我得到了错误:

没有可行的替代方案;

编辑:

对于上面的语法,我尝试了以下输入:abc; 定义;.. {xy;}

我希望匹配a.b.c, d.e.fand x.y,但我得到以下信息:

Eclipse 插件解释器

4

1 回答 1

3

但它没有按我预期的方式工作:对于输入 abc;def;,它只匹配 abc 作为限定名。我得到了错误:...

我无法重现。

使用 ANTLRWorks 1.4.3 中的调试器,我得到以下解析树:

在此处输入图像描述

(如您所见,输出屏幕(左下角)上没有打印错误/警告)

当然,您需要考虑字符串文字中的文本和“看起来”像限定名称的注释,但我在您之前的问答中展示了这一点(我将最后一条评论更多地发布给可能认为它的未来读者容易从 Java 源文件中获取所有限定名称)。

编辑

a.b.c; d.e.f; .. {x.y;}产生错误的事实是因为.那里有两个(点)。点被单独标记,而不是作为AnyOtherChar标记。

在解析器规则中定义文字标记(就像您在 in 中所做的'.'那样qualifiedName不会导致这些标记仅在那些解析器规则中创建。以下两个语法是相同的:

1

qualifiedName : IDENTIFIER ('.' IDENTIFIER)*;
IDENTIFIER    : ('_' | '$' | 'a'..'z' | 'A'..'Z')+;

2

qualifiedName : IDENTIFIER (DOT IDENTIFIER)*;
IDENTIFIER    : ('_' | '$' | 'a'..'z' | 'A'..'Z')+;
DOT           : '.';
于 2012-04-23T21:17:34.517 回答