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

私の問題は、次の理由でこれが不可能であることです。

その結果、代替 2 はその入力に対して無効になりました [14:55:32] エラー (208): ltxt2.g:61:1: 前のトークンが同じ入力に一致するため、次のトークン定義は一致しません:文字、数字、A_ELEMENT、WS

私の問題は、UTF8 を OTHERCHARS でキャッチする必要があることです...そして、("!".."?") のように範囲を指定できないため、特別な UTF8 文字をすべて Lexer ルールに入れることはできません。

したがって、NOT (~) が必要です。ここの OTHERCHARS には、">" または "}" 以外のすべてを指定できます。これら 2 つは文字通りの文脈を閉じており、内部では禁止されています。

このような事例はあまり参考にされていないようですので、どなたか回避策をご存じの方がいらっしゃれば幸いです。ここでの NOT 演算子は、解決する必要があるアンビバレンスを作成します。

前もって感謝します。

ベストウィッシュ

4

1 に答える 1

1

レクサーの最後に移動OTHERCHARSし、次のように定義します。

OTHERCHARS : . ;

Java ターゲットでは、これは以前のルールでは一致しない単一の UTF-16 コード ポイントと一致します。私は通常、ルールに名前を付け、ANY_CHARそれをフォールバックとして扱います。.の代わりに を使用することにより.+、レクサーは他のルールと一致しない場合にのみこのルールを使用します。

  1. ANY_CHAR別のルールが複数の文字に一致する場合、入力からより多くの文字に一致するため、そのルールが優先されます。
  2. 別のルールが正確に 1 文字に一致する場合、そのルールはANY_CHAR文法の前に現れるため、優先されます。

編集:ルールから除外する}には、それらのルールを作成して、ポイント 2 でカバーされるようにします。>ANY_CHAR

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