0

我有一个简短的问题:

// 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;}
            ;

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

因此,对于该输入 [14:55:32] 错误(208):ltxt2.g:61:1:以下标记定义永远无法匹配,因为先前的标记与相同的输入匹配,因此禁用了替代项 2:字母、数字、A_ELEMENT、WS

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

所以我需要NOT(〜)。这里的 OTHERCHARS 可以是除“>”或“}”之外的所有字符。这两个关闭了一个字面的上下文,并且被禁止在其中。

似乎没有很好地引用此类案例,所以如果有人知道解决方法,我会很高兴。这里的 NOT 运算符产生了我需要解决的矛盾。

提前致谢。

最好的,希望

4

1 回答 1

1

移动OTHERCHARS到词法分析器的最后并像这样定义它:

OTHERCHARS : . ;

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

  1. 如果另一条规则匹配多个字符,则该规则将优先ANY_CHAR于匹配输入中的大量字符。
  2. 如果另一条规则与一个字符完全匹配,则该规则将优先ANY_CHAR于出现在语法中的较早位置。

编辑:要从规则中排除}>排除ANY_CHAR,您需要为它们创建规则,以便它们包含在第 2 点中。

RBRACE   : '}' ;
GT       : '>' ;
ANY_CHAR : . ;
于 2013-01-10T15:32:37.387 回答