Créez une calculatrice en langage naturel
Cet exemple construit une calculatrice simple qui prend des nombres en langage naturel et prend en charge plusieurs opérateurs infixes de différentes priorités relatives.
Utilisez la forme d'élément intégré "SemanticNumber" et quatre éléments supplémentaires personnalisés.

tokens = {GrammarToken["SemanticNumber"], GrammarToken["Summand"],
GrammarToken["Multiplicand"], GrammarToken["Addition"],
GrammarToken["Multiplication"]};
Une opérande de somme peut être une expression de somme complète (pour mettre en œuvre l'associativité), une expression de multiplication complète ou un nombre. Un multiplicande peut être une expression de multiplication complète (encore une fois pour mettre en œuvre l'associativité) ou un nombre, mais non une expression d'addition qui attribue une priorité plus élevée à la multiplication.

defs1 = {"Summand" ->
s : (GrammarToken["Addition"] | GrammarToken["Multiplication"] |
GrammarToken["SemanticNumber"]) :> s,
"Multiplicand" ->
m : (GrammarToken["Multiplication"] |
GrammarToken["SemanticNumber"]) :> m};
Associez l'élément "Addition" à des sommes et des restes, et l'élément "Multiplication" aux produits et aux divisions. Les restes et les divisions ne sont pas commutatives, par conséquent, vous devez garder l'ordre des termes en utilisant FixedOrder.

defs2 = {
"Addition" ->
FixedOrder[a : GrammarToken["Summand"], "+",
b : GrammarToken["Summand"]] :> a + b,
"Addition" ->
FixedOrder[a : GrammarToken["Summand"], "-",
b : GrammarToken["Summand"]] :> a - b,
"Multiplication" ->
FixedOrder[a : GrammarToken["Multiplicand"], "*",
b : GrammarToken["Multiplicand"]] :> a*b,
"Multiplication" ->
FixedOrder[a : GrammarToken["Multiplicand"], "/",
b : GrammarToken["Multiplicand"]] :> a/b};
Déployez l'objet GrammarRules dans Wolfram Cloud.

calc = CloudDeploy[GrammarRules[tokens, Join[defs1, defs2]]];
Évaluez certaines entrées arithmétiques contenant du langage naturel.

GrammarApply[calc, "one + one"]


GrammarApply[calc, "one + two + three"]


GrammarApply[calc, "five + seventeen * ten"]


GrammarApply[calc, "one hundred - one hundredth"]


GrammarApply[calc, "zero + one/forty-five"]


GrammarApply[calc, "one/forty-five - one"]
