ANTLR仅匹配流中的特定字符串,忽略其余字符串

时间:2012-04-23 20:16:33

标签: java antlr antlr3

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

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

我尝试了以下内容:

findAllQualifiedNames
    :   qualifiedName+
    ;

qualifiedName 
    :   IDENTIFIER
        ('.' IDENTIFIER)*
    ;

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

但它并不像我预期的那样工作:对于输入a.b.c;d.e.f;,它仅匹配a.b.c作为限定名称。我得到错误:

  

没有可行的选择;

修改

对于上面的语法,我尝试了以下输入: A.B.C; d.e.f; .. {x.y;}

我希望匹配a.b.c, d.e.fx.y,但我得到以下内容:

Eclipse plugin interpreter

1 个答案:

答案 0 :(得分:3)

  

但它不能按我预期的方式工作:对于输入a.b.c; d.e.f;,它只匹配a.b.c作为限定名。我得到错误:...

我无法重现。

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

enter image description here

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

当然,你需要考虑字符串文字中的文字以及“看起来”像限定名字的评论,但我在previous Q&A of yours中表明了这一点(我将在未来的读者中更多地发布这句话可能认为 很容易从Java源文件中获取所有限定名称。)

修改

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

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

1

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

2

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