6

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

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

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

TOKEN  :  (CHAR|DIGIT|UNICODE)+;

我得到“Decision can match input such as "'A'..'Z'" using multiple alternatives: 1, 3 因此,该输入的替代项 3 被禁用”“Decision can match input such as "' 0'..'9'" 使用多个备选方案:2、3 因此,该输入的备选方案 3 被禁用"

没有任何匹配:如果我把它写成

TOKEN  :  (UNICODE)+;

什么都匹配不上。

有没有办法做到这一点。

4

2 回答 2

7

如果您计划使用 Unicode,要考虑的另一件事是,您应该设置charvocabulary选项以说明您希望允许 Unicode 范围 0 到 FFFE 中的任何字符

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

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

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

涵盖上述观点。一般来说,如果你需要 ascii 字符范围'A'..'Z'和 unicode 范围,你会制定一个 unicode 词法分析器规则,如: '\u0080'..'\ufffe'

于 2010-01-18T21:06:39.357 回答
5

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

由于一切都是令牌字符,如果您尝试使用这样的规则来匹配 Java 程序,例如,它将简单地匹配整个程序并将其作为一个大令牌返回给您。

如果您想将输入分成有意义的片段,您确实需要将您的角色分解为不同的组。

它可能会帮助您了解“专业人士”是如何做到的。这是Java 的 BNF 语法, 这里 是BNF 的 标识符, 它显示了他们如何不厌其烦地分组

identifier 
  ::= "a..z,$,_" { "a..z,$,_,0..9,unicode character over 00C0" } 
于 2010-01-17T17:23:09.473 回答