私は方法を見つけました。それは最良のアプローチではないかもしれませんが、確かに動作しているようです。
- ANTLRパーサは
ITokenStream
パラメータ
- ANTLRのレクサーは、それ自体ある
ITokenSource
の
ITokenSource
がITokenStream
にITokenSource
を変換する最も簡単な方法は、CommonSourceStream
を使用することですITokenStream
- よりも大幅に簡素インタフェースである受け取ります
ITokenSource
パラメータを受信する。
は、だから今我々は2つのことを実行する必要があります。
- パーサ専用
- は文法を調整ITokenSource
を実装する文法を調整して非常に簡単です。すべてのレクサー宣言を削除し、文法をparser grammar
として確実に宣言してください。簡単な例では便宜上つけここに掲載されています
parser grammar mygrammar;
options
{
language=CSharp2;
}
@parser::namespace { MyNamespace }
document: (WORD {Console.WriteLine($WORD.text);} |
NUMBER {Console.WriteLine($NUMBER.text);})*;
注次のファイルが出力class mygrammar
代わりのclass mygrammarParser
をすること。
これで、 "偽の"レクサーを実装したいと考えています。 私は個人的には、以下の擬似コードを使用:
TokenQueue q = new TokenQueue();
//Do normal lexer stuff and output to q
CommonTokenStream cts = new CommonTokenStream(q);
mygrammar g = new mygrammar(cts);
g.document();
は最後に、我々はTokenQueue
を定義する必要があります。 TokenQueue
は厳密には必要ではありませんが、便宜のために使用しました。 これには、レクサートークンを受け取るメソッドと、Antlrトークンを出力するメソッドが必要です。したがって、Antlrネイティブトークンを使用しない場合は、Antlr-to-token変換メソッドを実装する必要があります。 また、TokenQueue
はITokenSource
を実装する必要があります。
トークン変数を正しく設定することが非常に重要であることに注意してください。当初、私はCharPositionInLine
を誤算していたのでいくつか問題がありました。これらの変数が正しく設定されていないと、パーサーが失敗することがあります。 また、通常のチャネル(隠されていない)は0です。
これはこれまで私のために働いていたようです。私は他の人にも便利だと思っています。 私はフィードバックを受けています。特に、この問題を解決するためのよりよい方法が見つかった場合は、別の返信を自由に投稿してください。
私がお勧めするのは、既存のものから学ぶことができるということです。しかし、私はAntlrを使用するNHibernateしか見つけることができず、使い方は限られています。 : –
* "しかし、小さな部分があり、解決できないほど痛い" * - 奇妙なことに、言語の字句部分は通常実装が簡単です。 –
@Bart Kiers私はレンジや他のいくつかの機能(例えば、3.toString()や3.0.toString()など)をFAQにリストされている方法とは異なる方法で実装するのに問題があります。信じられないほど簡単に手動で作成されたレクサーで解決することができます。 – luiscubal