((VariableA - > VariableB)AND NOT VariableC) パーサーは、与えられた結果がtrueかfalseかを返すことができるはずです変数の値論理式パーサー
基本的に、式には変数、論理演算子(または、および含意、同値、否定および括弧)のみが含まれます。
この種類のパーサー(ASTツリーまたは逆ポーランド記法を使用)を実装する最善の方法は何ですか?あるいは、すでに仕事をすることができるオープンソースのパーサーがいくつか存在するでしょうか?
((VariableA - > VariableB)AND NOT VariableC) パーサーは、与えられた結果がtrueかfalseかを返すことができるはずです変数の値論理式パーサー
基本的に、式には変数、論理演算子(または、および含意、同値、否定および括弧)のみが含まれます。
この種類のパーサー(ASTツリーまたは逆ポーランド記法を使用)を実装する最善の方法は何ですか?あるいは、すでに仕事をすることができるオープンソースのパーサーがいくつか存在するでしょうか?
私があなたの場合はRPNを使用します。これは解析する際に悲しみを節約するはずです。演算子が入ってくるたびに値のスタックをプッシュしたりポップしたりするだけの単純なアルゴリズムでなければなりません。かっこで欺く必要はありません。唯一の本当の欠点は、ほとんどの人がポストフィックス(AKA RPN)表記に慣れていないことです。
スタックはおそらくツリーよりも扱いやすくなります。
ちょうど私の2¢:)
何語あなたがターゲットとしていますか?
パーサーを作成する場合は、多分ANTLRがあなたに代わってくれます。それはもともとJavaベースですが、さまざまな言語用のジェネレータを持っています(私はこれを使ってC#パーサを生成します)。また、ピックアップするのも難しくありません。 文法のテストを可能にする素敵なエディタ(ANTLRWorks)があります。
それはあなたが再帰的にあなたの言語を定義する必要が
まず:-)宿題のように聞こえます。
変数が十分に形成される形態(WFF)
XがWFFである場合、XおよびYはWFF次いで、(X - > Y)がある場合、ないXはWFF
あるWFF
ありますXとYが、その後WFFをしている場合(XとYがある)WFF
文法が定義されると、使用LEXまたはFlexやJava や些細なスキャナを記述するためのご希望の言語の同等。
子孫の再帰的パーサーを書き込むために、YACCまたはBisonなどを使用します。
子孫の再帰的な方法で評価する式の評価を取得するために、後で属性を文法に追加します。
Pythonで作業している場合、開始点としてpyparsingを使用して書き込まれたthis expression parser/evaluatorを試してください。
あなたは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をサポートするフォークもあります。
再帰的降下パーサーを実装します。論理式は非常に単純で、このように簡単に解析できます。解析アクションは、スタックから中間変数をプッシュ/ポップする変数を評価することができます。これは~~ 50行のCコードでなければなりません。 –