Crie uma calculadora flexível usando gramática independente do contexto
Implemente uma calculadora simples que dê suporte a infixos, notação polonesa, e notação polonesa inversa. Use o elemento integrado "SemanticNumber" e defina regras para o elemento customizado "Math".
In[1]:=
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}
]
];
Teste a calculadora.
In[2]:=
GrammarApply[calc, "2 3 + * five"]
Out[2]=
In[3]:=
GrammarApply[calc, "* * * * 1 2 3 4 5"]
Out[3]=
In[4]:=
GrammarApply[calc, "1 2 3 4 5 + + + +"]
Out[4]=
Dependendo se você usar infix e/ou notação polonesa inversa, pode haver ambiguidade na análise do input. Isso é tratado pela opção AmbiguityFunction. O resultado 16 correponde à análise de 2 (3 + 5) *, enquanto o resultado 25 correspode à análise de (2 3 +) 5 *.
In[5]:=
GrammarApply[calc, "2 3 + 5 *", AmbiguityFunction -> All]
Out[5]=