ANTLR 3 - 如何使用NOT特殊字符创建唯一标记

时间:2013-01-10 14:01:14

标签: utf-8 antlr special-characters

我有一个简短的问题:

// Lexer 
LOOP_NAME   :   (LETTER|DIGIT)+;

OTHERCHARS  :   ~('>' | '}')+;

LETTER      :   ('A'..'Z')|('a'..'z');

DIGIT       :   ('0'..'9');

A_ELEMENT
    :       (LETTER|'_')*(LETTER|DIGIT|'_'|'.');

// Parser-Konfiguration
WS          : ( ' '     
        | '\t'
        | '\r'
            | '\n'
            ) {$channel=HIDDEN;}
            ;

我的问题是,这是不可能的,因为:

  

结果,替代品(s)2因输入而被禁用[14:55:32]   错误(208):ltxt2.g:61:1:以下令牌定义永远不会   匹配,因为先前的标记匹配相同的输入:   字母,数字,A_ELEMENT,WS

我的问题是我还需要使用OTHERCHARS捕获UTF8 ...而且我不能将所有特殊的UTF8字符放入Lexer规则,因为我不能像(“!”..“?”)那样的范围。

所以我需要NOT(〜)。这里的OTHERCHARS可以是“>”之外的所有内容要么 ”}”。这两个关闭了字面上下文并且被禁止。

似乎并没有很好地引用这种情况,所以如果有人知道解决方法,我会很高兴。这里的NOT运算符创造了我需要解决的矛盾心理。

提前致谢。

最佳, wishi

1 个答案:

答案 0 :(得分:1)

OTHERCHARS移到词法分析器的最末端并按如下方式定义:

OTHERCHARS : . ;

在Java目标中,这将匹配与先前规则不匹配的单个UTF-16代码点。我通常将规则命名为ANY_CHAR并将其视为后备。使用.代替.+,如果没有其他规则匹配,词法分析器将仅使用此规则。

  1. 如果其他规则与多个字符匹配,则该规则的优先级将高于ANY_CHAR,因为该字符与输入中的大量字符匹配。
  2. 如果另一个规则只与一个字符匹配,则该规则优先于ANY_CHAR,因为它在语法中较早出现。
  3. 修改:要从}规则中排除>ANY_CHAR,您需要为它们创建规则,以便它们在第2点中涵盖。

    RBRACE   : '}' ;
    GT       : '>' ;
    ANY_CHAR : . ;