1

Webアプリケーションに次のことを実装する必要があります。私の解決策が正しくないことは知っていますが、アイデアを示すためにコードjsutを配置しました。

クラス「arc」があります。このアークに任意の式を割り当てることができる必要があります(たとえば、a + b + c、ac、if-then)。式が割り当てられたら、ランダムに取得した変数を使用して式を実行できるようにしたいと思います。そのような機能をWebアプリケーションに実装することは可能ですか?たぶん、MathPLのようなプラグインを使用する必要がありますか?それとも、そのような種類の問題に取り組むためのまったく異なるアプローチがあるのでしょうか?

class arc {

    var $arcexpression;

    function setExpression($arcexpression) {
        $this->arcexpression = $arcexpression;
    }

    function getExpression() {
        return $this->arcexpression;
    }


}

$arc = new arc();

$arc->setExpression("if a>b then return a else return b");

$result = $arc->execute(a,b);  // the function 'execute' should be somehow described in 'arc'
4

1 に答える 1

0

このために言語全体を実装する必要はありません。まず、実行できることを制限することから始めます。たとえば、式を算術演算子(+、-、*、/)、括弧、およびif-then演算子に制限します。if-thenを簡単にするために、おそらくphpの演算子と同じように、ある種の構文を適用する必要があります?:。その後、この文法専用のパーサーを作成する必要があります。特定の式を解析してツリーにします。たとえば、式 `a + b *c'は次のように解析されます。

  +
 / \
a   *
   / \
  b   c

その後、そのような式を評価する必要があります。たとえば、evaluate型の関数に配列を渡すと、その{ a => 1, b => 2, c => 3 }中から7個を取得できます。

解析の考え方は次のとおりです。

  1. 文字列の位置1から開始し、再帰関数を呼び出してその位置からデータを解析します。関数内で、指定した位置から読み取りを開始します。
  2. 開き括弧を読んだ場合は、再帰的に自分自身を呼び出します
  3. 閉じ括弧または文字列の終わりに遭遇した場合は、ルートノードを返します
  4. 最初の識別子を読み取ります(または括弧内を再帰的に)
  5. 算術記号を読む
  6. 2番目の識別子を読み取ります(または括弧内を再帰的に)
  7. 符号が*または/の場合は、符号が含まれ、2つのオペランドが子としてノードを作成し、そのノードを前の演算子の対応する(左または右)子としてアタッチします。
  8. 符号が+または-の場合は、符号を含むノードを作成します。子の1つはオペランドの1つであり、2番目のノードはサブツリーのルートであり、ルート(または2番目のオペランド)に*と/があります。 、簡単な操作の場合)。

かっこを使用して純粋な算術を取得すると、作業は簡単です。if-thenはもう少しトリッキーですが、それでもそれほど悪くはありません。約10年前、私はJavaでこのようなものを実装する必要がありました。すべてを並べ替えるのに約3日かかり、javadocを除いて、1つのクラスで合計約500行のコードでした。PHPでは、PHPの構文と型変換が非常に単純であるため、コードが少なくなると思います。

複雑に聞こえるかもしれませんが、実際には、一度始めたら見た目よりもはるかに簡単です。17〜18年前に、アルゴリズムクラスの一部として同様のことを行うという大学の任務をよく覚えています。

于 2012-07-19T14:18:34.240 に答える