Создание гибкого калькулятора с использованием бесконтекстной грамматики
Разверните простой калькулятор, поддерживающий инфикс, польский язык, и польскую нотацию. Используйте встроенную лексему "SemanticNumber" и определите правила для собственной лексемы "Math".
In[1]:=
![Click for copyable input](assets.ru/create-a-flexible-calculator-using-a-context-free/In_123.png)
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](assets.ru/create-a-flexible-calculator-using-a-context-free/In_124.png)
GrammarApply[calc, "2 3 + * five"]
Out[2]=
![](assets.ru/create-a-flexible-calculator-using-a-context-free/O_81.png)
In[3]:=
![Click for copyable input](assets.ru/create-a-flexible-calculator-using-a-context-free/In_125.png)
GrammarApply[calc, "* * * * 1 2 3 4 5"]
Out[3]=
![](assets.ru/create-a-flexible-calculator-using-a-context-free/O_82.png)
In[4]:=
![Click for copyable input](assets.ru/create-a-flexible-calculator-using-a-context-free/In_126.png)
GrammarApply[calc, "1 2 3 4 5 + + + +"]
Out[4]=
![](assets.ru/create-a-flexible-calculator-using-a-context-free/O_83.png)
В зависимости от того, используете ли Вы инфикс и/или обратную польскую нотацию, может возникнуть неоднозначность в синтаксическом анализе ввода. Обычно это исправляется при помощи опции AmbiguityFunction. Результат 16 соответствует синтаксическому анализу 2 (3 + 5) *, в то время как результат 25 соответствует синтаксическому анализу (2 3 +) 5 *.
In[5]:=
![Click for copyable input](assets.ru/create-a-flexible-calculator-using-a-context-free/In_127.png)
GrammarApply[calc, "2 3 + 5 *", AmbiguityFunction -> All]
Out[5]=
![](assets.ru/create-a-flexible-calculator-using-a-context-free/O_84.png)