Definición de Nodos Abstractos para Árbol de Sintaxis (AST) en Python
Clase 13 de 58 • Curso de Creación de Lenguajes de Programación: Intérpretes
Contenido del curso
- 3

Análisis Léxico: Construcción de un Léxer para Intérpretes
05:36 - 4

Definición de Tokens en Lenguaje de Programación Platzi
11:53 - 5

Desarrollo de un Lexer con Test-Driven Development
15:43 - 6

Pruebas de Operadores, Delimitadores y Fin de Archivo en Lexer Python
10:01 - 7

Lexer: Identificación de Keywords y Tokens Complejos
18:57 - 8

Reconocimiento de Funciones en Lexer de Lenguaje de Programación
07:46 - 9

Implementación de Operadores y Condicionales en Lexer de Platzi
12:38 - 10

Implementación de Operadores de Dos Caracteres en Lexer
12:08 - 11

Creación de un REPL en Python para Lenguaje de Programación
12:35
- 12

Construcción de un Parser para el Lenguaje Platzi
05:22 - 13

Definición de Nodos Abstractos para Árbol de Sintaxis (AST) en Python
09:14 - 14

Desarrollo de un AST en Python: Creación de la Clase Programa
12:49 - 15

Parseo de Let Statements en Lenguaje Platzi
20:21 - 16

Implementación de funciones advanced y expected tokens
08:26 - 17

Manejo de Errores en Parsers con Test Driven Development
11:06 - 18

Parseo de Return Statements en Lenguaje Platzi
12:42 - 19
Técnicas de Parsing: Top-Down y Bottom-Up
01:46 - 20

Pruebas de AST para Let y Return Statements en Parsers
12:06 - 21

Pratt Parsing: Implementación y Registro de Funciones en Python
11:47 - 22

Parseo de Identificadores en Lenguajes de Programación
13:29 - 23

Parseo de Expression Statements en Platzi Parser
16:34 - 24

Parseo de Enteros en Lenguaje Platzi
14:03 - 25

Implementación de Operadores Prefijo en Parsers
16:43 - 26

Operadores InFix en Expresiones: Implementación y Pruebas
10:40 - 27

Implementación de Operadores InFix en un Parser
20:20 - 28

Expresiones Booleanas en el Lenguaje de Programación Platzi
13:00 - 29

Evaluación de Precedencia y Testeo de Booleanos en Parsers
08:39 - 30

Evaluación de Expresiones Agrupadas en un Parser
10:16 - 31

Parseo de Condicionales en Lenguaje Platzi
13:50 - 32

Implementación de Condicionales en Parser de Lenguaje
12:05 - 33

Parsing de Funciones en Lenguaje Platzi: Creación de Nodos AST
15:51 - 34

Construcción de nodos de función en un parser AST
15:43 - 35

Llamadas a Funciones en Lenguajes de Programación
13:05 - 36

Implementación de llamadas a funciones en un parser con AST
12:21 - 37

Parseo de Expresiones en LET y RETURN Statements
07:58 - 38

Implementación de REPL para Árbol de Sintaxis Abstracta
08:59
- 39

Evaluación Semántica en Lenguajes de Programación
03:42 - 40

Estrategias de Evaluación en Lenguajes de Programación
09:18 - 41

Representación de Nodos AST y Objetos en Python
14:17 - 42

Evaluación de Expresiones en JavaScript y Python
19:39 - 43

Implementación del Patrón Singleton para Booleanos y Nulos
11:52 - 44

Evaluación de Prefijos en Lenguaje de Programación Platzi
14:41 - 45

Evaluación de Expresiones Infix en Lenguaje Platzi
18:07 - 46

Evaluación de Condicionales en Lenguaje de Programación Platzi
13:50 - 47

Evaluación y Uso del Return Statement en Programación
14:42 - 48

Manejo de Errores Semánticos en Lenguaje Platzi
21:05 - 49

Declaración y Gestión de Variables en Lenguajes de Programación
13:55 - 50

Manejo de Ambientes y Variables en Lenguajes de Programación
11:57 - 51

Declaración de Funciones en Lenguaje de Programación Platzi
12:26 - 52

Implementación de Llamadas a Funciones en PlatziLang
23:55
¿Cómo definir los primeros nodos de un AST?
Comprender la estructura de los nodos en un AST (Árbol de Sintaxis Abstracta) es crucial para entender la programación que subyace en el análisis de un lenguaje de programación. Al comenzar a trabajar en un AST, es necesario definir estos nodos de forma abstracta, lo que permitirá que otros nodos más específicos se deriven de ellos. Exploraremos los principios básicos para crear nodos en un AST usando Python, enfocándonos en la distinción entre statements y expressions.
¿Qué son los statements y las expressions?
Primero, es fundamental comprender la diferencia entre statements y expressions:
- Statements: Son instrucciones completas que conforman un programa. Pueden no devolver un valor. Un ejemplo de un
statementes una declaración de variable. - Expressions: Estas devuelven un valor, lo cual es una de sus principales características. En otras palabras, una expresión es cualquier fragmento de código que termina generando o filtrando un valor final.
Consideremos un pequeño programa que declare tres variables:
variable x es igual a 5
variable y es igual a 10
variable resultado es igual a suma de x más y
En este programa, cada línea representa un statement.
¿Qué es un nodo en un AST?
En el contexto del AST, los nodos representan estructuras sintácticas que se utilizan para modelar aspectos del programa. Los nodos pueden ser de diferentes tipos, y en programación orientada a objetos, suelen tener una jerarquía. En Python, podemos usar clases abstractas para definir comportamientos comunes que deben ser implementados por todas las subclases.
¿Cómo implementar nodos en Python?
La implementación comienza con la creación de una clase abstracta, a partir de la cual derivarán las clases de nodos. Aquí se usa la clase ABC de Python y el decorador @abstractmethod:
from abc import ABC, abstractmethod
class ASTNode(ABC):
@abstractmethod
def token_literal(self):
pass
@abstractmethod
def __str__(self):
pass
ASTNode define dos métodos abstractos que todas las subclases deben implementar: token_literal y __str__. Estos métodos ayudan, entre otras cosas, a hacer debugging y representar el nodo como una cadena.
¿Cómo implementar los tipos statement y expression?
Los statements y expressions son específicos tipos de nodos en un AST. Siguen teniendo sólo un toque abstracto ya que nunca se inicializarán directamente:
class Statement(ASTNode):
def __init__(self, token):
self.token = token
def token_literal(self):
return self.token.literal
class Expression(ASTNode):
def __init__(self, token):
self.token = token
def token_literal(self):
return self.token.literal
Ambos extienden ASTNode y comparten similitudes en su implementación, particularmente en la función token_literal. Estas clases sirven para construir una base para que otros nodos más específicos dentro del AST hereden y expandan su funcionalidad.
Cómo iniciar el desarrollo del programa
Ahora, estamos listos para crear un archivo llamado AST.py en el que guardaremos las definiciones de los nodos del AST. Este archivo se convertirá en la piedra angular de las estructuras sintácticas en nuestro programa. Cada definición del nodo se diseñará para manejar operaciones específicas, como declaraciones let o condicionales en un lenguaje de programación.
Con esta base sólida, podemos proceder a crear nodos específicos como el nodo de program, pero eso será explorado más adelante. Al establecer una jerarquía clara de nodos, podemos manejar de manera efectiva la complejidad de cualquier programa al representarlo de forma abstracta y perspicaz.
Aprender sobre AST y su implementación práctica en Python es un viaje que requiere una profunda comprensión del diseño de software, pero con cada paso avanzas en un fascinante camino de aprendizaje. ¡Sigue explorando y desarrollando tus habilidades!