如何匹配antlr中的unicode字符

时间:2010-01-17 17:19:17

标签: unicode antlr antlr3

我试图在文本中挑选所有标记,并且需要匹配所有Ascii和Unicode字符,所以这就是我如何将它们放置出来的。

fragment CHAR     :  ('A'..'Z') | ('a'..'z');
fragment DIGIT    :  ('0'..'9');
fragment UNICODE  :  '\u0000'..'\u00FF';

现在,如果我将令牌规则写为:

TOKEN  :  (CHAR|DIGIT|UNICODE)+;

我得到“决定可以使用多个替代方案匹配输入,例如”'A'..'Z'“:1,3 结果,对于该输入禁用了备选方案3“ “决策可以使用多个替代方案匹配输入,例如”'0'..'9'“:2,3 结果,对于该输入“

,禁用了备选方案3

没有任何东西可以匹配: 如果我把它写成

TOKEN  :  (UNICODE)+;

没有任何东西可以匹配。

有没有办法做到这一点。

2 个答案:

答案 0 :(得分:6)

如果您计划使用Unicode,另外要考虑的另一个问题是您应该设置charvocabulary选项以表示您要允许Unicode范围为0到FFFE中的任何字符

options
{
charVocabulary='\u0000'..'\uFFFE';
}

您通常会在示例中看到的默认值是

options
{
charVocabulary = '\3'..'\377';
}

涵盖上述观点。通常,如果您需要ascii字符范围'A'..'Z'和unicode范围,则需要制作unicode词法分析器规则: '\u0080'..'\ufffe'

答案 1 :(得分:5)

实际上,TOKEN: (UNICODE)+完全没用。

由于所有内容都是令牌字符,因此,如果您尝试使用此类规则来匹配Java程序,那么它将简单地匹配整个程序并将其作为一个大令牌返回给您。

如果你想将你的输入分成有意义的片段,你真的需要将你的角色分成不同的组。

您可以帮助您了解“专业人士”是如何做到的。这是a BNF grammar for Java,这里是BNF for an identifier,它显示了他们如何解决问题

identifier 
  ::= "a..z,$,_" { "a..z,$,_,0..9,unicode character over 00C0" }