2009-05-05 47 views
3

((VariableA - > VariableB)AND NOT VariableC) パーサーは、与えられた結果がtrueかfalseかを返すことができるはずです変数の値論理式パーサー

基本的に、式には変数、論理演算子(または、および含意、同値、否定および括弧)のみが含まれます。

この種類のパーサー(ASTツリーまたは逆ポーランド記法を使用)を実装する最善の方法は何ですか?あるいは、すでに仕事をすることができるオープンソースのパーサーがいくつか存在するでしょうか?

+0

再帰的降下パーサーを実装します。論理式は非常に単純で、このように簡単に解析できます。解析アクションは、スタックから中間​​変数をプッシュ/ポップする変数を評価することができます。これは~~ 50行のCコードでなければなりません。 –

答えて

1

私があなたの場合はRPNを使用します。これは解析する際に悲しみを節約するはずです。演算子が入ってくるたびに値のスタックをプッシュしたりポップしたりするだけの単純なアルゴリズムでなければなりません。かっこで欺く必要はありません。唯一の本当の欠点は、ほとんどの人がポストフィックス(AKA RPN)表記に慣れていないことです。

スタックはおそらくツリーよりも扱いやすくなります。

ちょうど私の2¢:)

2

何語あなたがターゲットとしていますか?

パーサーを作成する場合は、多分ANTLRがあなたに代わってくれます。それはもともとJavaベースですが、さまざまな言語用のジェネレータを持っています(私はこれを使ってC#パーサを生成します)。また、ピックアップするのも難しくありません。 文法のテストを可能にする素敵なエディタ(ANTLRWorks)があります。

0

これを実行するツール(論理評価)は既にありますが、見つからないと確信しています。 Bison(YACC、C言語)やANTLR(多くの言語を生成しますが、Javaを使用します)などのツールを使用すると、解析することについてあまり心配する必要はありません。 Coco/Rは、多くの異なる言語を生成できる別のパーサジェネレータです。あなた自身でそれをやりたいのであれば、私はRPNや接頭辞表記(RPNよりも簡単だと思います)を使用します。これにより、構文解析がはるかに簡単になりますが、ユーザーを煩わせることになります。

0

それはあなたが再帰的にあなたの言語を定義する必要が

まず:-)宿題のように聞こえます。

変数が十分に形成される形態(WFF)

XがWFFである場合、XおよびYはWFF次いで、(X - > Y)がある場合、ないXはWFF

あるWFF

あります

XとYが、その後WFFをしている場合(XとYがある)WFF

文法が定義されると、使用LEXまたはFlexやJava や些細なスキャナを記述するためのご希望の言語の同等。

子孫の再帰的パーサーを書き込むために、YACCまたはBisonなどを使用します。

子孫の再帰的な方法で評価する式の評価を取得するために、後で属性を文法に追加します。

+0

YaccとBisonは再帰的降下パーサを作成せず、テーブル駆動のシフト・リダクション(すなわちボトムアップ)パーサを作成します。 – ackb

+0

true! touchee。私はlexとyaccを使っています。 – Luixv

0

あなたはhttp://ncalc.codeplex.comを見ましたか?

これは拡張性があり、高速(独自のキャッシュを持つ)で、EvaluateFunction/EvaluateParameterイベントを処理することで、実行時にカスタム関数と変数を提供できます。式を解析できる式の例:

式e = new式( "Round(Pow(Pi、2)+ Pow([Pi2]、2)+ X、2)");パラメータ「Pi2」は、新しい式(「Pi * Pi」)である。 e.Parameters ["X"] = 10; e.EvaluateParameter + =デリゲート

(文字列名、ParameterArgs引数) {(名前== "PI") args.Result = 3.14であれば、 };

Debug.Assert(117.07 == e.Evaluate()); また、ユニコード&多くのデータ型をネイティブに処理します。あなたが文法を変更したいのであれば、それはアンラーファイルが付属しています。新しい機能をロードするためにMEFをサポートするフォークもあります。