Articulo de referencia

Árbol de sintaxis abstracta

Un árbol de sintaxis abstracta para el siguiente código del algoritmo euclidiano : b:\n a := a - b\n else:\n b := b - a\nreturn a"}}"> mientras b != 0 : si a > b : a := a - b si...

Un árbol de sintaxis abstracta para el siguiente código del algoritmo euclidiano :
mientras b != 0 : si a > b : a := a - b sino : b := b - a devolver a

Un árbol de sintaxis abstracta ( AST ) es una estructura de datos utilizada en informática para representar la estructura de un programa o fragmento de código. Es una representación arbórea de la estructura sintáctica abstracta de un texto (a menudo código fuente ) escrito en un lenguaje formal . Cada nodo del árbol denota una construcción presente en el texto. A veces se le denomina simplemente árbol de sintaxis .

La sintaxis es "abstracta" en el sentido de que no representa todos los detalles de la sintaxis real, sino solo los detalles estructurales o relacionados con el contenido. Por ejemplo, los paréntesis de agrupación están implícitos en la estructura de árbol, por lo que no es necesario representarlos como nodos separados. Del mismo modo, una construcción sintáctica como una sentencia condicional (if-condition-then) puede representarse mediante un único nodo con tres ramas.

Esto distingue los árboles de sintaxis abstracta de los árboles de sintaxis concreta, tradicionalmente denominados árboles de análisis sintáctico . Los árboles de análisis sintáctico suelen ser construidos por un analizador sintáctico durante el proceso de traducción y compilación del código fuente . Una vez construidos, se añade información adicional al AST mediante un procesamiento posterior, por ejemplo, el análisis contextual .

Los árboles de sintaxis abstracta también se utilizan en sistemas de análisis y transformación de programas .

Aplicación en compiladores

Los árboles de sintaxis abstracta (AST) son estructuras de datos ampliamente utilizadas en compiladores para representar la estructura del código de un programa. Un AST suele ser el resultado de la fase de análisis sintáctico de un compilador. A menudo sirve como representación intermedia del programa a través de varias etapas que requiere el compilador y tiene un fuerte impacto en el resultado final del mismo.

Motivación

Un AST tiene varias propiedades que ayudan en los pasos adicionales del proceso de compilación:

  • Un árbol de sintaxis abstracta (AST) puede editarse y ampliarse con información como propiedades y anotaciones para cada elemento que contiene. Dicha edición y anotación es imposible con el código fuente de un programa, ya que implicaría modificarlo.
  • En comparación con el código fuente , un AST no incluye signos de puntuación ni delimitadores no esenciales (llaves, puntos y comas, paréntesis, etc.).
  • Un AST suele contener información adicional sobre el programa, debido a las sucesivas etapas de análisis realizadas por el compilador. Por ejemplo, puede almacenar la posición de cada elemento en el código fuente, lo que permite al compilador imprimir mensajes de error útiles.

Los lenguajes suelen ser ambiguos por naturaleza. Para evitar esta ambigüedad, los lenguajes de programación se especifican a menudo como gramáticas libres de contexto (GLC). Sin embargo, existen aspectos de los lenguajes de programación que una GLC no puede expresar, pero que forman parte del lenguaje y están documentados en su especificación. Se trata de detalles que requieren un contexto para determinar su validez y comportamiento. Por ejemplo, si un lenguaje permite declarar nuevos tipos, una GLC no puede predecir los nombres de dichos tipos ni la forma en que deben usarse. Incluso si un lenguaje tiene un conjunto predefinido de tipos, garantizar su uso correcto suele requerir cierto contexto. Otro ejemplo es el tipado dinámico (duck typing ), donde el tipo de un elemento puede cambiar según el contexto. La sobrecarga de operadores es otro caso en el que el uso correcto y la función final dependen del contexto.

Diseño

El diseño de un árbol de sintaxis abstracta (AST) suele estar estrechamente vinculado con el diseño de un compilador y sus características previstas.

Los requisitos básicos incluyen lo siguiente:

  • Es necesario conservar los tipos de variables, así como la ubicación de cada declaración en el código fuente.
  • El orden de las instrucciones ejecutables debe estar representado de forma explícita y bien definido.
  • Los componentes izquierdo y derecho de las operaciones binarias deben almacenarse e identificarse correctamente.
  • Los identificadores y sus valores asignados deben almacenarse para las sentencias de asignación.

Estos requisitos pueden utilizarse para diseñar la estructura de datos del AST.

Algunas operaciones siempre requerirán dos elementos, como los dos términos de la suma. Sin embargo, algunas construcciones del lenguaje requieren un número arbitrariamente grande de elementos secundarios, como las listas de argumentos que se pasan a los programas desde la línea de comandos . Por lo tanto, un árbol de sintaxis abstracta (AST) utilizado para representar código escrito en dicho lenguaje debe ser lo suficientemente flexible como para permitir la adición rápida de una cantidad desconocida de elementos secundarios.

Para facilitar la verificación del compilador, debería ser posible convertir un AST a código fuente. El código fuente resultante, tras la recompilación, debería ser suficientemente similar al original en apariencia e idéntico en ejecución. El AST se utiliza intensivamente durante el análisis semántico , donde el compilador comprueba el uso correcto de los elementos del programa y del lenguaje. Durante este análisis, el compilador también genera tablas de símbolos basadas en el AST. Un recorrido completo del árbol permite verificar la corrección del programa.

Tras verificar su corrección, el AST sirve de base para la generación de código . El AST se utiliza a menudo para generar una representación intermedia (IR), a veces denominada lenguaje intermedio , para la generación de código .

Otros usos

Diferenciación de AST

La comparación de AST, o simplemente comparación de árboles, consiste en calcular la lista de diferencias entre dos AST. [ 1 ] [ 2 ] Esta lista de diferencias se suele denominar script de edición. El script de edición hace referencia directa al AST del código. Por ejemplo, una acción de edición puede resultar en la adición de un nuevo nodo AST que representa una función.

Detección de clones

Un AST es una abstracción poderosa para realizar la detección de clones de código . [ 3 ]

Definición

Aridades

DejarS{\displaystyle S}ser un conjunto de algún tipo , una aridad es una tupla(s1,,snorte,s){\displaystyle (s_{1},\dots ,s_{n},s)}, paras1,,snorte,sS{\displaystyle s_{1},\dots ,s_{n},s\in S}, también escrito como(s1,,snorte)s{\displaystyle (s_{1},\dots ,s_{n})s}. Más precisamente,Arity(S):=nortenorteSnorte+1{\displaystyle \mathrm {Aridad} (S):=\coprod _{n\in \mathbb {N} }S^{n+1}}.

DejarO={Oα}αArity(S){\displaystyle {\mathcal {O}}=\{{\mathcal {O_{\alpha }}}\}_{\alpha \in \mathrm {Arity} (S)}}frijolArity(S){\displaystyle \mathrm {Aridad} (S)}Familia indexada de conjuntos disjuntos de operadores . Sio{\displaystyle o}es una aridad de operador(s1,,snorte)s{\displaystyle (s_{1},\dots ,s_{n})s}decimos queo{\displaystyle o}tiene tipos{\displaystyle s}y tienenorte{\displaystyle n}discusiones de algún tipos1,,snorte{\displaystyle s_{1},\dots ,s_{n}}.

AST

ArreglarS{\displaystyle S}ser un conjunto finito de algún tipo, yO{\displaystyle {\mathcal {O}}}unArity(S){\displaystyle \mathrm {Aridad} (S)}Familia indexada de conjuntos disjuntos de operadores . Seaincógnita={incógnitas}sS{\displaystyle {\mathcal {X}}=\{{\mathcal {X}}_{s}\}_{s\in S}}frijolS{\displaystyle S}Familia indexada de conjuntos disjuntos de variables. La familiaA[incógnita]={A[incógnita]s}sS{\displaystyle {\mathcal {A}}[{\mathcal {X}}]=\{{\mathcal {A}}[{\mathcal {X}}]_{s}\}_{s\in S}}de árboles de sintaxis abstracta , o AST , es el más pequeñoS{\displaystyle S}Familia indexada de conjuntos disjuntos cerrada bajo las siguientes condiciones:

  1. Las variables son AST: siincógnitaincógnitas{\displaystyle x\in {\mathcal {X}}_{s}}, entoncesincógnitaA[incógnita]s{\displaystyle x\in {\mathcal {A}}[{\mathcal {X}}]_{s}}.
  2. Los operadores combinan AST: Sio{\displaystyle o}es un operador de aridad(s1,,snorte)s{\displaystyle (s_{1},\dots ,s_{n})s}, yaiA[incógnita]si{\displaystyle a_{i}\in {\mathcal {A}}[{\mathcal {X}}]_{s_{i}}}a pesar de1inorte{\displaystyle 1\leq i\leq n}, entonceso(a1;;anorte)A[incógnita]s{\displaystyle o(a_{1};\dots ;a_{n})\in {\mathcal {A}}[{\mathcal {X}}]_{s}}.

Véase también

Referencias

  1. Fluri, Beat; Wursch, Michael; PInzger, Martin; Gall, Harald (2007). "Change Distilling: Tree Diffrencing for Fine-Grained Source Code Change Extraction" . IEEE Transactions on Software Engineering . 33 (11): 725–743 . Bibcode : 2007ITSEn..33..725F . doi : 10.1109/tse.2007.70731 . ISSN 0098-5589 . S2CID 13659557 .  
  2. Falleri, Jean-Rémy; Morandat, Floréal; Blanc, Xavier; Martinez, Matias; Monperrus, Martin (2014). «Comparación precisa y detallada del código fuente». Actas de la 29.ª Conferencia Internacional ACM/IEEE sobre Ingeniería de Software Automatizada . págs. 313–324 . doi : 10.1145/2642937.2642982 . ISBN  978-1-4503-3013-8.
  3. Koschke, Rainer; Falke, Raimar; Frenzel, Pierre (2006). "Detección de clones mediante árboles de sufijos de sintaxis abstracta" . 13.ª Conferencia de Trabajo sobre Ingeniería Inversa de 2006. IEEE. págs. 253–262 . doi : 10.1109/wcre.2006.18 . ISBN  0-7695-2719-1. S2CID 6985484 . 

Lecturas adicionales

  • Jones, Joel. "Modismos de implementación de árboles de sintaxis abstracta" (PDF) . Archivado del original (PDF) el 21 de julio de 2024. Recuperado el 9 de noviembre de 2011 .(Descripción general de la implementación de AST en varias familias de lenguajes)
  • Neamtiu, Iulian; Foster, Jeffrey S.; Hicks, Michael (17 de mayo de 2005). Comprensión de la evolución del código fuente mediante la coincidencia de árboles de sintaxis abstracta . MSR'05. Saint Louis, Missouri: ACM. CiteSeerX 10.1.1.88.5815 . 
  • Würsch, Michael. Mejora de la detección de cambios en el código fuente basada en árboles de sintaxis abstracta (tesis de diploma).
  • Lucas, Jason (16 de agosto de 2006). "Reflexiones sobre el árbol de sintaxis abstracta (AST) de Visual C++" .
  • Robert Harper (2016). Fundamentos prácticos de los lenguajes de programación (Segunda edición). Cambridge University Press.
  • AST View : un complemento de Eclipse para visualizar un árbol de sintaxis abstracta de Java.
  • "Árbol de sintaxis abstracta y manipulación de código Java en el IDE Eclipse" . eclipse.org .
  • "Representación CAST" . cs.utah.edu .
  • Proyecto eli : Análisis sintáctico de árboles de sintaxis abstracta
  • "Modernización impulsada por la arquitectura — ADM: Metamodelado de árbol de sintaxis abstracta — ASTM" .( Estándar OMG ).
  • JavaParser : La biblioteca JavaParser proporciona un árbol de sintaxis abstracta (AST) de su código Java. La estructura del AST le permite trabajar con su código Java de forma programática y sencilla.
  • Spoon : Una biblioteca para analizar, transformar, reescribir y transcompilar código fuente Java. Analiza los archivos fuente para construir un AST bien diseñado con una potente API de análisis y transformación.
  • AST Explorer : Un sitio web para ayudar a visualizar AST en varios lenguajes populares como Go, Python, Java y JavaScript.