動的論理的表現の構文解析-評価クライアントまで、フルのC#またはVB?

StackOverflow https://stackoverflow.com/questions/350181

  •  20-08-2019
  •  | 
  •  

質問

何が最高評価であった表現すると、下記のように
(A)又は(A-C)又は(B,C)
または
(A-B)||(A&&C)||(!B&&C)

ランタイム時において、また企画に変換する上記の表は、以下の
(TrueとFalseの場合)または(TrueとFalseの場合)又は(いないFalseの場合、True)
または
(True&&False)||(True&&False)||(!False&&True)

条件:1)論理的な表現は知らないまで行います。2)変数とその値がっているものと考えられるまで行います。3)変数の値はnullにはならない.

私ができるような簡単な組み立てて、クラスの方法がい創出実行時の入力があります。を行っています。使用文字列ビルダを、コードを書く、そのコンパイラです。その後、荷重の組み立てやメソッドを呼び出し.

う方に。

感謝。

役に立ちましたか?

解決

あなたは、あなたがテキストを解析し、式のクラスを使用して、抽象sytaxツリーを作成することができます.NET3.5を使用している場合。その後、適切なLambdaExpressionインスタンスを作成し、その後、実行することができ、デリゲート、にそれをコンパイルします。

かなり単純な文法のこの種のパーサと構文ツリービルダーの構築は非常に興味深い運動です、と(そしてそれは同様に私の見解ですっきりです)コンパイラを呼び出すよりもやや高速に実行されます。

あなたが.NET3.5を使用していない場合は、

、それはまた、解釈、抽象構文木を自分で実装するには複雑ではないです。

他のヒント

は、警告さ:あなたが話している2つの最終条件は必ずしも同じではありません。 VB論理Andオペレータはないながら、C#で&&演算子は、短絡evalutionを使用します。あなたは文が等価であることを確認したい場合は、AndAlsoするユーザーOrとユーザーを翻訳OrElse <=>へ。

シンプルexpresssionsのために、あなたはおそらく違いに気付くことはありません。しかし、条件が副作用を持つことができるか、2間の性能差が懸念される場合、これは重要なことができるかどうか。

これまでに簡単に:

  1. パーサジェネレータ(なAOETOOLSは、以上)かかる真偽値表現として力を生み出infix一覧
  2. コードの評価は逆ポーランド表記スタックです。

の文法をするとどうなるのかわかりません

program: exprList ;

exprList: expr { Append($1); }
    | expr OR exprList { Append(OR); }
    | expr AND exprList { Append(AND); }
    | NOT exprList { Append(NOT); }
    | ( exprList ) { /* Do nothing */ }
    ;

expr: var { Append($1); }
    | TRUE { Append(True); }
    | FALSE { Append(False); }
    ;

評価のみなさん、この:

for each item in list
    if item is symbol or truth value, push onto RPN stack
    else if item is AND, push (pop() AND pop())
    else if item is OR, push (pop() OR pop())
    else if item is NOT, push (NOT pop())

result = pop()

のための記号は、代替の真価を行います。

あなたが使用することができます https://github.com/mrazekv/logicalparserする

その論理式を記述するだけで、ライブラリ(precenednceテーブルでevaulated、とOR、NOT、AND演算子と>、> =、ことができます。<文字列変数に=整数変数に=、<をして)

あなたは、単純なインタプリタ/パーサを書くことができます。 ANTLR のようなものを使用し、既存の文法を再利用します。

は、.NET 3.5を使用している場合は、ラムダ式を作成することができます。そして、あなたはそれからデリゲートを作成し、標準のデリゲート/メソッドとして呼び出すことができます。 インターネット上のラムダ式についてのサンプルがたくさんある。

一つの解決策は、文字列として式を組み立てて、それSQL Server、またはどのようなデータベースが評価のためであるを送信することです。それぞれTrueとFalseのための1 = 1または0 = 1と実際の変数を置き換え、そしてあなたは、このようなクエリで終わるでしょう。

(1 = 1、0 = 1)1か(1 = 1、1 = 1)またはSelect(ない0 = 1,1 = 1)

クエリを実行すると、結果が真であるとき、

は、その後、あなたは1を取り戻します。最もエレガントな解決策ではないかもしれないが、それは動作します。多くの人々は、おそらくこのに対してアドバイスしますが、私はとにかくそこに可能な解決策として、それをスローするつもりです。

Proviant に、私のライブラリを見てみましょう。これは、ブール式を評価するの分流ヤードアルゴリズムnoreferrer">

scroll top