0

S 式の構文に似た、おもちゃのような式言語を構文解析するための文法を作成したいと考えています。

「Getting Started with PyParsing」という本を読んだところ、似たような文法をカバーする非常に優れたセクションが含まれていました。

解析するデータの 2 つの例は次のとおりです。

sum(5,10,avg(15,20))+10
stdev(5,10)*2

ここで、式をある程度解析するが、関数の展開と演算子の優先順位を無視する文法を考え出しました。

それを続行するためのベストプラクティスは何ですか: 関数名 ( sum, avg ... ) の oneOf に一致する単語に parseActions を追加する必要があります。ネストされたリストを作成すると、解析結果の深さ優先のウォーキングを実行して関数を評価できますか?

4

1 に答える 1

3

コードをもっと見ずにアドバイスするのは少し難しいです。それでも、あなたが説明していることから、句読点のさまざまなビットを認識し、代数演算子の数値定数から変数名を区別するために、ほとんどトークン化しているように聞こえます。nestedExpr はいくつかの構造を付与しますが、基本的な括弧の入れ子のみです - これは、解析後の作業のために演算子の優先順位の処理を残します。

中置記法の構文解析について学習している場合は、一連の pyparsing の例を調べて学習する必要があります ( pyparsing wiki の例のページ)。実際には5 つの関数の中置記法パーサーである fourFn.py から始めます。その BNF() メソッドに目を通し、再帰的な定義がどのように機能するかを理解してください (まだ pushFirst 解析アクションについて心配する必要はありません)。このようにパーサーを構造化することで、演算子の優先順位が解析結果に組み込まれます。を解析する4 + 2 * 3と、単なるトークナイザーで が得られるだけ['4','+','2','*','3']で、4 を足して 10 を得る前に 2*3 を計算する方法を理解する必要があります。4 と 2 を力ずくで足してから 3 を掛けるだけではありません (これにより、 18の間違った答え)。fourFn.py のパーサーは、['4','+',['2','*','3']]これは、4 に追加する前に 2*3 の部分を評価するのに十分な構造です。

操作の優先順位を付けて中置記法を解析するというこの全体的な概念は非常に一般的operatorPrecedenceです。サンプル simpleArith.py でこれがどのように機能するかを確認してから、eval_arith.py に移動して、解析された構造のエバリュエーターを作成する拡張機能が必要であることを確認してください。simpleBool.py は、AND と OR を組み合わせた論理用語の優先順位を示すもう 1 つの良い例です。

最後に、Excel のようなことをしているので、excelExpr.py を見てください。他のシートや他のワークブックへの参照を含む、Excel セル参照を評価しようとするときに発生する、非常にまれなケースのいくつかを処理しようとします。

幸運を!

于 2011-06-04T16:19:14.733 に答える