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 結果として、alternative(s) 3 was disabled for that input」 「Decision can match input such as "' 0'..'9'" 複数の選択肢を使用: 2、3 その結果、その入力に対して選択肢 3 が無効になりました"

そして、何も一致しません。また、次のように記述した場合

TOKEN  :  (UNICODE)+;

何も一致しません。

これを行う方法はありますか。

4

2 に答える 2

7

Unicode の使用を計画している場合に考慮すべきもう 1 つのことはcharvocabulary、0 から FFFE までの Unicode 範囲の任意の文字を許可するオプションを設定する必要があることです。

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

例で通常見られるデフォルトは

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

上記の点をカバーするために。一般に、ASCII 文字範囲と Unicode 範囲の両方が必要な場合は、次の'A'..'Z'ような Unicode lexer ルールを作成します。 '\u0080'..'\ufffe'

于 2010-01-18T21:06:39.357 に答える
5

実際には、TOKEN: (UNICODE)+まったく役に立たない。

すべてがトークン文字であるため、このようなルールを使用してJavaプログラムと一致させようとすると、たとえば、プログラム全体と一致し、1つの大きなトークンとして返されます。

入力を意味のあるフラグメントに分割したい場合は、実際に文字を異なるグループに分割する必要があります。

「プロ」がどのようにそれを行ったかを見るのに役立つかもしれません。これがJavaのBNF文法であり、これが識別子のBNFであり、グループ化するのにどのように苦労したかを示しています。

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