ANTLRWorks1.4には次の文法があります。私は、テキストアドベンチャーゲームクリエーターでパーサーを実装するためのアイデアをいじっています。ユーザーは、ゲームで許可されるさまざまなコマンドを指定します。
grammar test;
parse : cmd EOF;
cmd : putSyn1 gameObject inSyn1 gameObject;
putSyn1 : Put | Place | Drop ;
inSyn1 : In | Into | Within;
gameObject : det obj;
det : The | A | An | ;
obj : Word obj | Word;
Space : (' ' | '\t' | '\r' | '\n'){$channel=HIDDEN;};
Put : 'put';
Place : 'place';
Drop : 'drop';
In : 'in';
Into : 'into';
Within : 'within';
The : 'the';
A : 'a';
An : 'an';
Word : ('a'..'z' | 'A'..'Z')+;
関係するさまざまな微妙な点を感じているところです(ここで行ったように)。
今回は、ANTLRを使用して、次のような入力を解析できるかどうか疑問に思っています。
put wood in fire place
つまり、「木」と「暖炉」は上記のgameObjectsです。ただし、「場所」は「置く」の同義語でもあります。したがって、これも同様に有効です。
place wood in fire place
ANTLRは、最後の「場所」トークンを解析しようとすると、NoViableAltExceptionを返します。「暖炉」をgameObjectとして認識したい。
それで、この種のことはANTLRで可能ですか?文法で可能ですか?
一方で、私はNFAや辞書などのビットを含む奇妙なカスタムデータ構造を使用する手動実装に取り組んでいます。しかし、私はまだもっと時間が必要であり、必要な検索と挿入のアルゴリズムを設計するためにいくつかの脳細胞を犠牲にしなければなりません。
しかし、これがANTLRで可能であれば、生成されたC#ファイルを使用できますね。