¿La salida de un analizador tiene que ser un árbol o también podría ser un gráfico general?
Además, ¿hay algún lenguaje existente o plausible que use la representación gráfica general en lugar de árboles para su sintaxis?
¿La salida de un analizador tiene que ser un árbol o también podría ser un gráfico general?
Además, ¿hay algún lenguaje existente o plausible que use la representación gráfica general en lugar de árboles para su sintaxis?
Respuestas:
La salida de un analizador no necesita ser un árbol. De hecho, cuando considera cosas como referencias del USO de una variable a su DEFINICIÓN superpuesta en el árbol de sintaxis abstracta, inmediatamente tiene un gráfico.
La cuestión es que el análisis generalmente está diseñado para tener lugar en una sola pasada; esto importó por razones históricas, como la falta de espacio y la velocidad del procesador, pero también porque es más sencillo razonar. Luego, las fases posteriores decoran el árbol de análisis con información adicional.
Hay cosas como las gramáticas de gráficos, aunque no sé si se usan para analizar lenguajes de programación.
La pregunta del OP está un poco al revés. Por supuesto, un algoritmo de análisis puede generar lo que quiera. La pregunta es más para comprender para qué sirve el análisis y si el analizador genera un resultado que cumple con este objetivo. Entonces uno puede preguntarse cuál es la representación apropiada para eso, por ejemplo, un árbol o un gráfico.
Bueno, supongo que un analizador es un algoritmo que le dará la estructura sintáctica de una oración dada como entrada, de acuerdo con una definición formal dada de la sintaxis del lenguaje.
Tenga en cuenta que las personas pueden estar en desacuerdo sobre lo que constituye la sintaxis del idioma. Algunos pueden limitar eso a una columna vertebral de lenguaje formal puro, mientras que otros pueden introducir consideraciones ligeramente más semánticas como tipo, género, número u otras más complejas (no estoy distinguiendo NLP o lenguajes de programación). La mayoría de los idiomas tienen características que requieren la representación de gráficos, pero depende del "implementador" (por falta de una mejor palabra) decidir si quiere incluir eso en la sintaxis.
Entonces, según lo que defina la sintaxis, es posible que deba generar un tipo diferente de estructura formal.
En el caso simple de análisis puro sin contexto, un árbol de análisis puede funcionar, excepto por el problema de ambigüedad que se aborda a continuación, o por el hecho de que es posible que desee modificarlo un poco para obtener un AST (ver más abajo).
Sin embargo, en casos más complejos, es posible que necesite diferentes estructuras, a menudo representadas por enlaces en el árbol, lo que conduce a una estructura gráfica. Esto depende mucho de su definición de la sintaxis del lenguaje.
Además, qué árbol debe generar no es obvio. Si considera el caso de las gramáticas adyacentes a los árboles (TAG), funcionan de tal manera que el árbol de sintaxis no es el mismo que el árbol de derivación, aunque el primero puede derivarse del segundo. Lo que desea generar puede ser una pregunta relevante.
También hay otro problema con respecto a la ambigüedad. Una oración dada, aunque pertenece a su idioma, puede hacerlo de muchas maneras diferentes, se le puede asignar una estructura sintáctica de muchas maneras diferentes.
Luego puede optar por generar solo una de estas estructuras, elegida al azar o de acuerdo con un criterio bien definido (similitud, por ejemplo). También puede optar por generar varios o todos ellos. Si desea generar varios, generalmente es conveniente empacarlos en una estructura única que compartirá lo que tienen en común. Esto ahorra espacio y tiempo de computación, y la complejidad puede ser un problema real.
Cuando elige generarlos todos, no tiene más remedio que compartir, porque puede haber un número infinito de análisis posibles. E infinitamente puede ser reprimido finitamente solo teniendo de alguna manera un ciclo en un gráfico. Entonces tienes que producir una estructura gráfica en general. Pero las propiedades de esta estructura gráfica están relacionadas con el tipo de sintaxis formal que ha elegido.
Ahora la pregunta también era sobre árboles de sintaxis abstracta. Me salté la parte "abstracta" ya que traería confusión, en mi humilde opinión. De hecho, la pregunta ya es confusa en sus diversas reformulaciones.
Con respecto a AST en perspectiva histórica, se originan con el lenguaje Lisp y los sistemas de manipulación de programas en los años 1960-1970. La idea era considerar los programas como expresiones grandes, como fórmulas matemáticas, tanto para fines de manipulación como para analizar propiedades o definir semántica de manera formal, lo que los matemáticos saben hacer en fórmulas. Como fórmulas, estaban naturalmente estructuradas en árbol, pero podían decorarse con diversa información que convertía estos árboles en gráficos. Esto era conveniente tanto formal como pragmáticamente y fue utilizado por compiladores y sistemas de programación.
Básicamente, un AST es un árbol, como lo implica el nombre, pero puede llevar más información. El resto está en las elecciones del implementador y en los ojos del espectador. ¿Es un gráfico o un árbol decorado? Sin embargo, el árbol AS básico es importante, porque ese es el andamiaje sobre el que construye tanto en teoría como en programación.
Tenga en cuenta que la AST era distinta del árbol de análisis (la sintaxis se basaba en el contexto libre) como la producida por el algoritmo de análisis como se estudia en la teoría del lenguaje formal. La razón era que el diseño de la sintaxis estaba limitado por la tecnología de análisis de la época, limitada por la baja potencia de cómputo disponible. El resultado fue que los árboles de sintaxis solo eran variantes torturadas de lo que naturalmente se consideraría la estructura del programa, y se tuvo que realizar un procesamiento posterior, que no formaba parte del proceso de análisis formal básico, para obtener la versión más simple y limpia llamada AST.
Sin embargo, la representación de los árboles en la computadora, ya sea abstracta o no, está algo limitada cuando se desea representar todas las estructuras de una oración ambigua. En particular, esto oculta problemas de complejidad. La preservación de las ambigüedades en una estructura gráfica, mientras que la traducción de los árboles de análisis a los árboles AS también puede ser un problema. Sin embargo, si le preocupa eso, a menudo es posible definir su sintaxis concreta de tal manera que el árbol de análisis pueda servir como AST. Esto está permitido por los algoritmos muy generales que manejan la ambigüedad y por el poder de las computadoras actuales.
Si analiza usando el análisis GLR (LR generalizado), y si el análisis de la entrada es ambiguo (hay varias formas posibles de analizar la entrada), entonces el resultado del análisis puede considerarse como un DAG de análisis, en lugar de un analizar el árbol El análisis DAG codifica de forma compacta muchos análisis posibles: múltiples árboles de análisis posibles.
Sin embargo, la conclusión es que si tiene una gramática libre de contexto, y si su cadena de entrada es analizable sin ambigüedades (solo hay una derivación única en la gramática que produce esta cadena de entrada), y si el trabajo de análisis es producir esa derivación ... entonces, en estas condiciones, la salida del análisis siempre será necesariamente un árbol de análisis, porque cualquier producción de una gramática libre de contexto tiene inherentemente una estructura de árbol.
Una vez escribí un intérprete para C en el que el "AST" para el operador + = (por ejemplo) no era un árbol. Considere a[i++] += d
dónde a[i++]
está int
y d
está double
. Las operaciones implícitas de conversión y recuperación fueron explícitas en el árbol, por lo que el problema es dónde colocar la recuperación a[i++]
y la conversión al doble. Nuestra solución fue abandonar los árboles. El "ASG" resultante se veía así
+=
/ | \
/ | \
/ | \
/ convert \
| | \
| fetch fetch
| / |
index d
/ \
a postinc
|
i
Esto me dejó perplejo, hasta que me di cuenta de que no es el árbol lo abstracto, ni se trata de algún "árbol de sintaxis" abstracto, sino de la sintaxis. es abstracta.
Entonces, para responder a su pregunta, concluyo que un árbol de sintaxis abstracta, así como un árbol de sintaxis concreta o un árbol de decisión, o cualquier otro árbol, debería ser mejor un árbol.
Por otro lado, nada debería impedir que alguien use un gráfico de sintaxis abstracta, o un diagrama de sintaxis abstracta, o un cubo de sintaxis abstracta, o una especificación de sintaxis abstracta.
Supongo que un árbol de sintaxis abstracta de "árbol de sintaxis abstracta" me habría ayudado a evitar la confusión.