首先,我是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.f
和x.y
,但我得到以下内容:
答案 0 :(得分:3)
但它不能按我预期的方式工作:对于输入a.b.c; d.e.f;,它只匹配a.b.c作为限定名。我得到错误:...
我无法重现。
使用ANTLRWorks 1.4.3中的调试器,我得到以下解析树:
(如您所见,输出屏幕(左下角)没有打印错误/警告)
当然,你需要考虑字符串文字中的文字以及“看起来”像限定名字的评论,但我在previous Q&A of yours中表明了这一点(我将在未来的读者中更多地发布这句话可能认为 很容易从Java源文件中获取所有限定名称。)
a.b.c; d.e.f; .. {x.y;}
产生错误的事实是因为那里有两个.
(点)。点被单独标记,而不是AnyOtherChar
标记。
在解析器规则中定义文字标记(就像您在'.'
中使用qualifiedName
所做的那样) 不 导致这些标记仅在那些解析器规则。以下两个语法是相同的:
qualifiedName : IDENTIFIER ('.' IDENTIFIER)*;
IDENTIFIER : ('_' | '$' | 'a'..'z' | 'A'..'Z')+;
qualifiedName : IDENTIFIER (DOT IDENTIFIER)*;
IDENTIFIER : ('_' | '$' | 'a'..'z' | 'A'..'Z')+;
DOT : '.';