Язык Wolfram Language

Обработка текста и языка

Создание гибкого калькулятора с использованием бесконтекстной грамматики

Разверните простой калькулятор, поддерживающий инфикс, польский язык, и польскую нотацию. Используйте встроенную лексему "SemanticNumber" и определите правила для собственной лексемы "Math".

In[1]:=
Click for copyable input
calc = CloudDeploy[ GrammarRules[{GrammarToken["SemanticNumber"], GrammarToken["Math"]}, {"Math" -> GrammarToken["SemanticNumber"], "Math" -> AnyOrder[a : GrammarToken["Math"], "+", b : GrammarToken["Math"]] :> a + b, "Math" -> AnyOrder[a : GrammarToken["Math"], "-", b : GrammarToken["Math"]] :> a - b, "Math" -> AnyOrder[a : GrammarToken["Math"], "*", b : GrammarToken["Math"]] :> a*b, "Math" -> AnyOrder[a : GrammarToken["Math"], "/", b : GrammarToken["Math"]] :> a/b} ] ];

Попробуйте калькулятор в действии.

In[2]:=
Click for copyable input
GrammarApply[calc, "2 3 + * five"]
Out[2]=
In[3]:=
Click for copyable input
GrammarApply[calc, "* * * * 1 2 3 4 5"]
Out[3]=
In[4]:=
Click for copyable input
GrammarApply[calc, "1 2 3 4 5 + + + +"]
Out[4]=

В зависимости от того, используете ли Вы инфикс и/или обратную польскую нотацию, может возникнуть неоднозначность в синтаксическом анализе ввода. Обычно это исправляется при помощи опции AmbiguityFunction. Результат 16 соответствует синтаксическому анализу 2 (3 + 5) *, в то время как результат 25 соответствует синтаксическому анализу (2 3 +) 5 *.

In[5]:=
Click for copyable input
GrammarApply[calc, "2 3 + 5 *", AmbiguityFunction -> All]
Out[5]=

Родственные примеры

de en es fr ja ko pt-br zh