J'essaye d'écrire un petit analyseur avec Irony. Malheureusement, je reçois un "décalage-réduire le conflit". Les grammaires ne sont pas mon point fort, et je n'ai besoin que de faire une petite chose. Voici la grammaire réduite qui produit l'erreur:Problème résolvant un conflit shift-reduce dans ma grammaire
ExpressionTerm := "asd"
LogicalExpression :=
ExpressionTerm |
LogicalExpression "AND" LogicalExpression |
LogicalExpression "OR" LogicalExpression
Qu'est-ce que le « changement-de réduire les conflits » et comment puis-je résoudre? Je comprends que cela signifie que ma grammaire est ambiguë, mais je ne peux pas tordre ma logique suffisamment pour voir comment.
Ajouté: Pour clarifier - "asd" est simplement une chaîne littérale "asd". Donc, j'attendre à ce que les expressions suivantes sont analysées par cette grammaire:
asd
asd AND asd
asd AND asd OR asd
asd OR asd AND asd OR asd
Ajouté 2: oublié de dire, la racine de la grammaire est LogicalExpression
.
Ajouté 3: Ahh, j'ai compris! L'ambiguïté est parce qu'une expression comme
asd AND asd OR asd
pourrait être interprété de deux façons différentes:
(asd AND asd) OR asd
asd AND (asd OR asd)
Mais comment puis-je résoudre ce problème? OK, je peux mettre un des ET ET OU être plus fort que l'autre (j'avais compris de toute façon). Mais maintenant je vois que l'erreur apparaît même s'il n'y a qu'un seul opérateur. En d'autres termes, il se produit également la même erreur:
LogicalExpression := "asd" | LogicalExpression "OR" LogicalExpression
Dans ce cas, je veux ceci:
asd OR asd OR asd
à analyser à ceci:
(asd OR asd) OR asd
Quel est le non manière ambiguë de le faire?
Ajouté 4: Got it!
LogicalExpression1 := LogicalExpression1 "OR" LogicalExpression2 | LogicalExpression2
LogicalExpression2 := LogicalExpression2 "AND" LogicalExpression3 | LogicalExpression3
LogicalExpression3 := "NOT" LogicalExpression4 | LogicalExpression4
LogicalExpression4 := "asd" | "(" LogicalExpression1 ")"
Cette analyse toutes les expressions booléennes, avec priorité de l'opérateur NOT-> ET-> OR. "asd" peut être remplacé par l'expression destinée à vos termes.
Heh, viennent à penser, je commence à le rappeler modèle de mes jours à l'Université. : D –