1

Parsekit から: 個々の引用文字を一致させる方法は?

パーサーを定義する場合:

@start = int;
int = /[+-]?[0-9]+/

残念ながら、以下を含めない限り、「+」で始まる整数は解析されません。

@numberState = "+" // at the top.

上記の数値解析では、"Symbol" デフォルト パーサーは言及されていませんが、まだアクティブであり、ユーザー定義のパーサーをオーバーライドします。

ディレクティブを追加することで数字を修正できます。「++」のパーサーを作成しようとしている場合はどうなりますか? 次のパーサーを機能させるディレクティブは見つかりませんでした。

@start = plusplus;
plusplus = "++";

ユーザーパーサーに対するデフォルトパーサーの影響は、非常に恣意的なようです。「++」を解析できないのはなぜですか?

デフォルトのパーサーを完全にオフにすることは可能ですか? ありふれたことをしていないと邪魔になりそうです。

または多分私はそれをすべて間違っています。

編集:

plus plus を解析するパーサーを見つけました。

@start = plusplus;
plusplus = plus plus;
plus = "+";

答えは次のとおりだと思います。パーサーで定義されたリテラル記号は、デフォルトのパーサー間で重複することはできません。少なくとも 1 回は完全に封じ込める必要があります。

4

1 に答える 1

2

ParseKitの開発者はこちら。

いくつかの応答があります。

  1. 学べば学ぶほど、ParseKit API が非常に洗練されていて実用的であることがわかると思います。私がそう言って自分の角を鳴らしているわけではないことに注意してください. 私は ParseKit を作成しましたが、ParseKit API を設計しませんでした。むしろ、ParseKit の設計は、 Steven Metsker のBuilding Parsers In Javaに見られる設計にほぼ完全に基づいています。ParseKit を深く理解したい場合は、本をチェックアウトすることを強くお勧めします。さらに、解析全般に関する素晴らしい本です。

  2. Tokenizer StatesParsersを混同しています。これらは 2 つの異なるものですが、詳細はここでお答えできるよりも複雑です。繰り返しますが、メツカーの本をお勧めします。

  3. あなたの質問に答える過程で、私は ParseKit に小さなバグを見つけました。ありがとう!ただし、探していると思われる結果を得るために正しい文法を使用していなかったため、上記の結果には影響しませんでした。今すぐ The Google Code Projectからソース コードを更新する必要があります。そうしないと、以下のアドバイスが役に立ちません。


今あなたの質問に答えます。

++単一の複数文字トークンとして認識し、トークンの後にトークンが続くのではなく、Symbol先頭の文字を持つ数字を明示的に正の数として認識する文法を探していると思います。++ SymbolNumber

あなたが探していると私が信じている正しい文法は、次のようなものです。

@symbols = '++';    // declare ++ as a multi-char symbol
@numberState = '+'; // allow explicitly-positive numbers
@start = (Number|Symbol)*;

次のように入力します。

++ +1 -2 + 3 ++

次のようにトークン化されます。

[++, +1, -2, +, 3, ++]++/+1/-2/+/3/++^

2 つのリマインダー:

  1. 繰り返しになりますが、これが正しく機能することを確認するには、ソース コードを今すぐ更新する必要があります。この場合、バグを修正する必要がありました。
  2. これはややこしいので、Metsker の本を読んで ParseKit の仕組みを完全に理解することをお勧めします。
于 2012-02-24T19:51:10.093 に答える