Estoy tratando de escribir un pequeño analizador con Irony. Lamentablemente, recibo un "conflicto de cambio-reducción". Las gramáticas no son mi punto fuerte, y solo necesito hacer esta pequeña cosa. Aquí está la reducción de la gramática que produce el error:Problema al resolver un conflicto shift-reduce en mi gramática
ExpressionTerm := "asd"
LogicalExpression :=
ExpressionTerm |
LogicalExpression "AND" LogicalExpression |
LogicalExpression "OR" LogicalExpression
Lo que hace el "desplazamiento y reducción de conflictos" significa y cómo puedo solucionarlo? Supongo que significa que mi gramática es ambigua, pero no puedo torcer mi lógica lo suficiente como para ver cómo.
Agregado: Para aclarar - "asd" es simplemente una cadena literal "asd". Por lo que se puede esperar que las siguientes expresiones son analizados por esta gramática:
asd
asd AND asd
asd AND asd OR asd
asd OR asd AND asd OR asd
Agregado 2: olvidaba decir, la raíz de la gramática es LogicalExpression
.
Agregado 3: Ahh, lo tengo! La ambigüedad se debe a una expresión como
asd AND asd OR asd
podría interpretarse de dos maneras diferentes:
(asd AND asd) OR asd
asd AND (asd OR asd)
Pero, ¿cómo puedo solucionar esto? OK, puedo poner uno de AND o O para ser más fuerte que el otro (lo había intentado de todos modos). Pero ahora veo que el error aparece incluso si solo hay un operador. En otras palabras, esto también produce el mismo error:
LogicalExpression := "asd" | LogicalExpression "OR" LogicalExpression
En este caso quiero esto:
asd OR asd OR asd
que se consultará a esto:
(asd OR asd) OR asd
¿Cuál es la no manera ambigua de hacer esto?
Agregado 4: ¡Lo tengo!
LogicalExpression1 := LogicalExpression1 "OR" LogicalExpression2 | LogicalExpression2
LogicalExpression2 := LogicalExpression2 "AND" LogicalExpression3 | LogicalExpression3
LogicalExpression3 := "NOT" LogicalExpression4 | LogicalExpression4
LogicalExpression4 := "asd" | "(" LogicalExpression1 ")"
Este análisis sintáctico de todas las expresiones booleanas, la prioridad de los operadores como NOT-> AND> O. "asd" se puede reemplazar con la expresión destinada a sus términos.
Je, ahora que lo pienso de ella, estoy empezando a recordar esto patrón de mis días en la Universidad. : D –