¿Cuál es el ejemplo más simple para explicar la diferencia entre los árboles Parse y los árboles de sintaxis abstracta?

14

A mi entender, un analizador crea un árbol de análisis y luego lo descarta. Sin embargo, también puede mostrar un árbol de sintaxis abstracta, que supuestamente utiliza el compilador.

Tengo la impresión de que tanto el árbol de análisis como el árbol de sintaxis abstracta se crean en la etapa de análisis. Entonces, ¿alguien podría explicar por qué son diferentes?

Combinator Logic
fuente
3
¿Por qué tienen que ser diferentes? ¿No pueden ser lo mismo desde dos puntos de vista ligeramente diferentes?
S.Lott
1
No estoy seguro de entender estos dos "puntos de vista ligeramente diferentes" :-(
Combinator Logic
Ese es el punto. Son lo mismo, de ahí la confusión. Solo tiene diferentes palabras según su punto de vista: análisis vs. generación de código (o ejecución, en el caso de un intérprete).
S.Lott
No hay diferencia. Con un poco de imaginación, uno puede inventar una representación de sintaxis para cualquier posible árbol de sintaxis abstracta. Con falta de imaginación, las expresiones S de Lisp serían una sintaxis predeterminada adecuada para todo.
SK-logic
1
Todos deberían haber leído la respuesta antes de comentar. Hay una diferencia, pero tenerlos separados o combinados es un problema de implementación.
Paul

Respuestas:

20

Un árbol de análisis también se conoce como árbol de sintaxis concreta.

Básicamente, el árbol abstracto tiene menos información que el árbol concreto. El árbol concreto contiene cada elemento en el lenguaje, mientras que el árbol abstracto ha desechado las piezas poco interesantes.

Por ejemplo la expresión: (2 + 5) * 8

El concreto se ve así

  ( 2  + 5 )  * 8
  |  \ | / |  | |
  |   \|/  |  | |
   \___|__/   | |
       \______|/

Mientras que el árbol abstracto tiene:

2  5 
 \/   
  +  8
   \/
   *

En los casos concretos, los paréntesis y todas las partes del lenguaje se han incorporado al árbol. En el caso abstracto, los paréntesis han desaparecido porque su información se ha incorporado a la estructura de árbol.

Winston Ewert
fuente
Olvidó mencionar en qué compilador para qué idioma se implementa de esta manera. Porque, ya sabes, no tienes que ... el analizador también podría tirar el paréntesis de inmediato.
Ingo
1
@Ingo, nada en mi respuesta tiene nada que decir cuando un compilador tira los paréntesis. Se pregunta cuál es la diferencia entre un árbol de análisis concreto y un árbol de análisis abstracto.
Winston Ewert
Entonces, seguramente, ¿puede nombrar una fuente para su reclamo? ¿O es solo tu definición privada?
Ingo
1
@ingo, docs.google.com/document/d/…
Winston Ewert
0

Lo primero que debes entender es que nadie te obliga a escribir un analizador o compilador de cierta manera. Específicamente, no es necesariamente el caso que el resultado de un analizador debe ser un árbol. Puede ser cualquier estructura de datos que sea adecuada para representar la entrada.

Por ejemplo, el siguiente idioma:

prog:
      definition 
    | definition ';' prog
    ;

definition: .....

se puede representar como una lista de definiciones. (Nitpickers señalará que una lista es un árbol degenerado, pero de todos modos).

En segundo lugar, no es necesario retener el árbol de análisis (o cualquier estructura de datos que haya devuelto el analizador). Por el contrario, los compiladores generalmente se construyen como una secuencia de pasadas, que transforman los resultados de la pasada anterior. Por lo tanto, el diseño general de un compilador podría ser así:

parser :: String             -> Maybe [Definitions]      -- parser
pass1  :: [Definitions]      -> Maybe DesugaredProg      -- desugarer
pass2  :: DesugaredProg      -> Maybe TypedProg          -- type checker
pass3  :: TypedProg          -> Maybe AbstractTargetLang -- code generation
pass4  :: AbstractTargetLang -> Maybe String             -- pretty printer

compiler :: String           -> Maybe String    -- transform source code to target code
compiler source = do
   defs  <- parser source
   desug <- pass1 defs
   typed <- pass2 desug
   targt <- pass3 typed
   pass4 targt

Conclusión: Si se oye hablar de árboles de análisis sintáctico , árboles abstractos Syntac , los árboles de sintaxis concretas etc., siempre sustituyen por estructura de datos adecuada para el propósito dado , y ya está bien.

Ingo
fuente
2
¿Cómo es esta una respuesta a la pregunta?
Winston Ewert
@ WinstonEwert Afirmo que "árbol de análisis" y "árbol de sintaxis abstracta" son abstracciones y no significan nada más que "estructuras de datos adecuadas". Entonces, la respuesta es que la pregunta en general no tiene sentido, a menos que pregunte la diferencia entre el tipo de retorno del analizador y el tipo de retorno de algún otro pase en el compilador XY del lenguaje L.
Ingo