Shunting Yardの実装が必要なPHPでの実装は、数学的な比較を実行し、ブール結果を返す文字列を解釈し、解析する
-
01-10-2019 - |
質問
私はPHPで文字列を解釈して簡単な数学計算を実行できるものを探しています。そして、式が真かfalsであるかについてのブール結果を返します。
例えば:
- 「3*{mysalary}/9 = 10000」のスータイプ
- PHPはこれを2つの式に分割します - 爆発( '='、文字列);
- PHPはデータベースフィールドの私のリストを取得し、「{}」と区別されたフィールドをデータに置き換えます(int to int)
- その後、PHPは数学式を評価します
- PHPは左側を右側と比較します
- ブール結果が生成されました。
複雑に聞こえるかもしれませんが、非常にシンプルである必要があります。制約は次のとおりです。1/数学演算子は次のように固定されています。 + - / * 2/比較演算子は次のように固定されています。=> <> = <= 3/浮動小数点比較は必要ありません。したがって、必要に応じて、または単に最終結果を単純に回すことができます。
1つの比較演算子を持つ2つの式しかありません。何らかのエラーがある場合は、Falseを返すだけです。
誰かがすでにこれを行うことができる何かを見たことがありますか?私は何かを作ることができることを知っていますが、なぜホイールを正しく再発明しますか?
何も見たことがない場合は、これを構築するときに考えることができる「ゴッチャ」または警告をリストしたいと思います。
もう少し読んだ後、私は私が使用できることに気づきました シャントヤードアルゴリズム. 。誰かがPHPでこれを実装していますか?
この評価はこれを実行するのが簡単な方法である可能性があることを知っていますが、ユーザーがこの方法を使用して何かを非常に簡単に壊したり、構文エラーを引き起こす可能性があることに関係しています。私はそれをソリューションに含めないか、そうすればそれがどのように使用されるかを厳しく制御する必要があるでしょう。
ありがとう。
ジェイソン
解決
を見てください 評価 phpclassesのクラス。これは、可変置換(式を評価する前に例で「mysalary」の値を設定するなど)を含む、あなたが望むほとんどすべてを行う必要があります)
他のヒント
あります 発現パーサーエンジン (の実装 JavaScript+ノード, Php, Python およびactionscript)、on github xpresion (ps。私は著者です)
エンジンは非常に柔軟で構成可能です。 ユーザー定義の変数, ユーザー定義の関数, 多型演算子 そして一般 n-aryオペレーター (例えば。 三元if-then-else)
アルゴリズムは非常に一般的です(1つは、一般化されたバリエーションが シャントヤードアルゴリズム)
私が取るアプローチは次のとおりです。
- 式をトークン化します
- 抽象的な構文ツリーに解析します
- 可変置換を実行します(参照してください 熱心な評価)
- 結果を計算します
今...
- シャントヤードアルゴリズムは、手順1と2を実行する方法です。
- 2番目のステップの後、式が構文的に正しいかどうかを確認できます
- 結果の計算方法は、ASTの構築方法によって異なります。
最も難しいステップは2番目です。オペレーターの優先順位、括弧、その他のことを考慮する必要がありますが、それについてはたくさんの文献があります(Wikipediaリンクに従うことさえできます)
なぜ変数の交換を実行して、それから preg_replace("/[^0-9+-*\/]/", '', $inputString)
, 、そしてどちらかを使用します eval()
また create_function()
?これを使用する場合、安全でない「ステートメント」が削除されていることを確認する必要があります。だから、preg_replaceを使用したため、リテラル文字列を削除する必要があります。