3

int []またはintトークンを解析できるようにしたい。

次の文法を考えてみましょう:

TYPE    :   'int' AFTERINT;
AFTERINT:   '[' ']';

もちろん機能しますが、int []のみです。intでも機能させるために、これに変更AFTERINTしました(空の条件を追加しました':

AFTERINT:   '[' ']' |
              |;

しかし今、私はこの警告とエラーを受け取ります:

[13:34:08] 警告 (200): MiniJava.g:5:9: 決定は、複数の選択肢を使用して "" などの入力と一致する可能性があります: 2、3

その結果、その入力に対して代替案 3 が無効になりました [13:34:08] エラー (201): MiniJava.g:5:9: 次の代替案は決して一致しません: 3

空の条件が機能しないのはなぜですか?

4

1 に答える 1

4

lexer は、空の文字列に一致するトークンを処理できません。少し考えてみれば、これは驚くべきことではありません。結局のところ、入力には無限の量の空の文字列があります。lexer は常に空の文字列を有効なトークンとして生成するため、無限ループが発生します。

型の認識はレクサーではなく、パーサーに属します。

type
 : (INT | DOUBLE | BOOLEAN | ID) (OBR CBR)?
 ;

OBR     : '[';
CBR     : ']';
INT     : 'int';
DOUBLE  : 'double';
BOOLEAN : 'boolean';
ID      : ('a'..'z' | 'A'..'Z')+;

異なるタイプの文字を組み合わせて (単一の) トークンを作成する場合は、通常、このためのパーサー ルールを作成することをお勧めします。レクサー ルール (トークン) は、言語の最小構成要素と考えてください。これらのビルディング ブロックから、パーサー ルールを構成します。

于 2012-11-08T13:23:35.197 に答える