Pregunta

He escrito un compilador básico que genera un AST, teniendo en cuenta correctamente la prioridad de los operadores en las expresiones. Sin embargo, cuando se realiza la generación de código para producir el código C ++, estoy seguro de cómo manejar el uso de paréntesis.

En esta expresión:

A - (B - c)

El AST a continuación:

   -
  / \
 A   -
    / \
   B   C

debe generar correctamente la expresión anterior incluyendo los paréntesis, sin embargo si el segundo operador era un operador de adición (por ejemplo), los paréntesis serían innecesarios. Yo preferiría utilizar sólo cuando sea necesario para facilitar la lectura.

¿Existen normas que dictan este tipo de comportamiento y cómo saber cuándo utilizar paréntesis. Más y menos tienen el mismo nivel de precedencia en la mayoría de los idiomas y me gustaría hacer este trabajo para todos los operadores.

¿Fue útil?

Solución

Históricamente, esto lo llaman "la impresión bastante". Si Google que además de "prioridad", es posible encontrar algunos ejemplos para ayudarte.

De manera informal, creo que la idea básica es que cuando se Recurse en una subexpresión, se compara su preferencia a la expresión actual. Si es menor, es necesario paréntesis. De lo contrario no lo hace. La asociatividad puede ser manejado por hacer una verificación similar:. Si la subexpresión tiene el mismo precedencia que el padre necesita paréntesis si está en el lado equivocado de acuerdo con la asociatividad

Otros consejos

Si una operación con una prioridad más alta es menor en el árbol que no es necesario para su puesta en paréntesis.

No es suficiente conocer la precedencia de las operaciones de embargo. También es necesario conocer el asociatividad de las operaciones. Permite a las operaciones del grupo de la misma precedencia correctamente. Por ejemplo, la sustracción se deja asociativo, por lo A-B-C es igual a (A-B)-C, pero no a A-(B-C).

Simplemente escriba toda la tabla de precedencia y asociatividades para todas sus operaciones y consulte como generar su expresión.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top