2016-07-28 14 views
2

私は、文字列形式のブール式を持って行く例:文字列内のブール式を評価する - 、

name := "Fred" 

type := "Person" 

が、私はこの式がtrueまたはfalseに評価したいです。研究から、これはGoは、箱から出してサポートしていますものではありません、しかし、

​​

exp := "(name == Fred) && (type == Person)" 

結局、私は以下のような条件ステートメントを実行できるようにしたいと思います。私は、ASTを解析し評価するための提案を見てきました。しかし、私はかなり新しく、特にASTなので、それについてどうやって行くのか分かりません。誰かが文字列ブール式を評価する方法についてのガイダンスを提供してもらえますか?私はこれを完全にサポートするパッケージを見つけたわけではありません。

+0

o.õこれはかなり臭いですが、なぜ文字列が必要ですか – Plato

+1

ファイル内にJSONとして格納されているブール式があります。 JSONを解析して文字列ブール式を作成します。表現ができたら、それを評価する必要があります。 –

+1

"ブール式"が正しいことが保証されていますか? (その例は有効なGoではないので、Goとして直接解析することはできません) – JimB

答えて

1

は、理論上はです。しかし、Go構文を使用できる場合はGoを使用しているので、GoのパーサとASTを使用できます。実行時にGo ASTを評価できるコードはありません。しかし、おそらく、あなたが望む部品をサポートするものを書くことができます。それからあなたはGoの通訳がいます。

以下は、あなたが任意のランダム式の構文をサポートするために何をする必要があるかです:

あなたがlex and parseにしたいとしています。メモリにAST (Abstract Syntax Tree)を構築します。それを評価してください。

あなたのツリーノードは、(私の行くの構文は、このための方法が間違っている)かもしれません:

Scope {Tree { 
    Assignment { Symbol: "name", Symbol: "_literal_1" } 
    Assignment { Symbol: "exp", Value: Tree: { 
    AndOperation { Tree{...}, Tree{...} } 
    } 
} 

次に、あなたのプログラムが直接あなたのASTを横切ることができるか、バイトコード形式にそれを書くことができ、それは後でキャッシュするのがより小さくて簡単にしたい場合にのみ便利です。