1

特定の文字列を取得して結果を評価できる、かなりの数の式パーサー/トークナイザーを見てきました。たとえば、文字列をポンピングできます。

4+4

次のコードに:

MSScriptControl.ScriptControl sc = new MSScriptControl.ScriptControl();
//' You always need to initialize a language engine
sc.Language = "VBScript";
//' this is the expression - in a real program it will probably be
//' read from a textbox control 
string  expr  = "4+4";
double res  = sc.Eval(expr);

そして8を取得します。しかし、文字列を評価できる解析ツールはありますか:

4 = 4 = 4

? これまでのところ、すべての例は double と boolean を比較できないというエラーで失敗しています (これはコンパイラの観点からは理にかなっていますが、人間の観点からは、これが真実であることがわかります)。誰でもこれを達成できるものに出くわしますか?

4

3 に答える 3

2

人間の観点からすると、これは、x = y = z を特別な演算子 (3 つのオペランドを持つ) と考える場合にのみ当てはまり、x = y、y = z、x = z を意味します。これは、式の特定の構文解釈です。人間 (特にプログラマー) は、ほとんどのコンパイラーと同じように解釈することもできます。つまり、最も左のグループ化 ( x = y ) を選択し、その比較の結果 (ブール値) を z と比較します。人間にとっても、これはこの構文では意味がありません。人間は、特定のコンテキストに対して「意味のある」構文を選択することに関してはあいまいであることで知られているため、人間の観点からのみ明らかなように思えます。

そのレベルの「あいまいさ」が本当に必要な場合は、コンテキスト分析を実行して式の意味の最良の推測を見つけようとするWolfram Alphaなどを調べる必要があります。そこに「4 = 4 = 4」と入力すると、True と返されます。

于 2012-08-29T21:11:34.340 に答える
1

「言語」の構文を定義し、パーサーを構築する必要があります。これは、予想される動作が通常の式の構文ではカバーされていないためです (また、私が聞いたすべての言語は = をバイナリ演算として実装しているため、通常の言語ではそれを「false」と評価する必要があります。ある時点で「4 = true」になります)。C#用のパーサーを構築するツールがあります...

補足: 「人間の視点」を一致させることは、非常に難しい問題であり、人間同士のコミュニケーションであってもまだ解決されていません:)。

于 2012-08-29T21:12:33.443 に答える
0

で試してください

var result = (int) HtmlPage.Window.Eval("4 + 4");
于 2012-08-29T21:06:25.937 に答える