2013-07-29 7 views
6

私はコンパイラのバックグラウンドを持っていないので、これがその領域のcommmonものなのかどうかわかりません。このような表現を解析する標準的なテクニックはありますか?私は、スタックベースの評価に頼る必要がある場合、私はわからないこのタイプの式はどのように解析するのですか?

((A+B=1) AND (C+D=1) AND ((P+Q=1) OR (K=1)) AND ((Q=1) AND (R=2))) 

And 
    A + B = 1 
    C + D = 1 
    Or 
     P + Q = 1 
     K = 1 
    And 
     Q = 1 
     R = 2 

は次のように解析されるべき(例えば、タブは、深さを示しますか)?私は現在、1つを試しています。もし私がそれを稼働させることができれば、動作するコードを投稿します。

これを達成するための簡単な方法についてのご意見はありますか?

+0

コンテキストとは何ですか?それは "安全"でなければならないのですか?あるいは構文を少し変更して、 'eval()'などでPythonを使うことができますか?たとえば、 '((A + B == 1)と(C + D == 1))'はPython構文です。 –

+0

残念ながら、私は入力を変更することはできません。私はいくつかのXMLファイルを解析しており、式自体を文字列に解析しています。どのように私は文字列をフォーマットするのですが、評価の順序とすべてはまだケアが必要です。また、何かを評価するのではなく、文字列を印刷したいと思っています。 – Legend

+0

あなたは木の表現を解析していますか?それらの変数の数値を下にして評価しますか? – Adrian

答えて

3

あなたは、さまざまな優先順位と関連性を持つ演算子から構築された式をパースする方法について質問していると仮定します。

効果的な手法の1つは「トップダウン演算子優先度」と呼ばれ、「演算子優先度」および「優先度上昇」解析でもあります。

  • Pratt parsing(もoriginal paper

  • ダグラス・クロックフォードのtakeその上に

  • Pythonistのtakeその上に

  • :ここでは詳細にアプローチを説明するいくつかの素晴らしい情報源でありますJava version

本当にすっきりしたことは、実際に少しのコードしかないことです。

主要概念は、次のとおりです。mixfix

  • 優先対中置対

    • 接頭辞:3 + 4 * 5(3 + 4) * 5または3 + (4 * 5)として解析されますか?

    • 連想度:x - y - zは、​​または(x - y) - zと解釈されますか?

    偶然、私は最近、このようなものを学び、あなたがhereを見つけることができるオペレータの解析と同様のアプローチ、についての私のブログに記事を書いてしまってきました。私のアプローチでは、接尾辞、接頭辞、接尾辞、およびmixfix演算子(すなわち、? :)を扱います。優先順位と関連性はすべて表で指定されています。私はオペランドがまだ見つからない演算子を追跡するためにスタックを使います。次に、パーサは構文解析ツリーを構築します。各ノードは部分式です。

  • +0

    +1リンクをありがとうございます。 – Legend

    関連する問題