He estado interesado en el diseño/implementación de compiladores/intérpretes durante todo el tiempo que he estado programando (solo 5 años) y siempre me ha parecido la "magia" detrás de escena de la que nadie habla realmente (lo sé de al menos 2 foros para el desarrollo de sistemas operativos, pero no conozco ninguna comunidad para el desarrollo de compiladores/intérpretes/idiomas). De todos modos, recientemente decidí comenzar a trabajar por mi cuenta, con la esperanza de ampliar mi conocimiento de la programación en general (y bueno, es muy divertido :). Entonces, basado en la limitada cantidad de material de lectura que tengo, y Wikipedia, desarrollé este concepto de los componentes para un compilador/intérprete:¿Qué es un árbol sintáctico abstracto/¿Es necesario?
Código fuente -> Análisis léxico -> Árbol de sintaxis abstracto -> Análisis sintáctico -> Análisis semántico -> Generación de código -> Código ejecutable.
(sé que hay más a la generación de código y el código ejecutable, pero no he llegado tan lejos :)
Y con ese conocimiento, he creado un léxico muy básico (en Java) para tomar entrada de un archivo de origen, y la salida de los tokens en otro archivo. Un ejemplo de entrada/salida se vería así:
de entrada:
int a := 2
if(a = 3) then
print "Yay!"
endif
de salida (de léxico):
INTEGER
A
ASSIGN
2
IF
L_PAR
A
COMP
3
R_PAR
THEN
PRINT
YAY!
ENDIF
En lo personal, creo que sería muy fácil ir desde allí a el análisis sintáctico/semántico, y posiblemente incluso la generación de código, lo que me lleva a preguntar: ¿Por qué usar un AST, cuando parece que mi lexer está haciendo un trabajo tan bueno? Sin embargo, el 100% de mis fuentes que utilizo para investigar este tema parecen inflexibles de que esta es una parte necesaria de cualquier compilador/intérprete. ¿Me estoy perdiendo el sentido de lo que realmente es un AST (un árbol que muestra el flujo lógico de un programa)?
TL; DR: Actualmente en camino a desarrollar un compilador, terminé el lexer, me parece que la salida facilitaría el análisis sintáctico/el análisis semántico, en lugar de hacer un AST. Entonces, ¿por qué usar uno? ¿Me estoy perdiendo el punto de uno?
Gracias!
Hay muchos recursos orientados al compilador y al lenguaje. Comience con http://lambda-the-ultimate.org/ –