Este documento presenta el análisis sintáctico como la fase del compilador que construye un árbol de sintaxis abstracta (AST) a partir de los tokens generados por el analizador léxico. Explica que el analizador sintáctico detecta errores sintácticos y que herramientas como Yacc, Bison y ANTLR pueden usarse para implementarlo. Finalmente, propone como ejercicio implementar el analizador sintáctico para un lenguaje llamado MiLe usando su gramática dada.
1. Capítulo 4: Análisis Sintáctico
Teoría de Autómatas y Compiladores [ICI-445]
Capítulo 4: Análisis Sintáctico
Dr. Ricardo Soto
[ricardo.soto@ucv.cl]
[http://www.inf.ucv.cl/∼rsoto]
Escuela de Ingeniería Informática
Pontificia Universidad Católica de Valparaíso
Marzo, 2010
Dr. Ricardo Soto Teoría de Autómatas y Compiladores 1/7
2. Capítulo 4: Análisis Sintáctico
1. Introducción
El analizador sintáctico es la fase que sigue al análisis léxico. En esta fase
se construye un AST (árbol de sintaxis abstracta) para capturar la jerarquía
de la entrada.
Programa
Analizador Léxico
Fuente
Analizador Sintáctico
AST
Analizador Semántico
Generador Código
Intermedio
Optimizador Código
Intermedio
Generador Código Programa
Objeto Objeto
Dr. Ricardo Soto Teoría de Autómatas y Compiladores 2/7
3. Capítulo 4: Análisis Sintáctico
2. Funciones del Analizador Sintáctico
Construir un AST a partir de los tokens recibidos por el
análizador léxico.
Token
Analizador Analizador AST Analizador
Programa Léxico Sintáctico Semántico
Fuente Nuevo Token?
Detección de errores sintácticos
Nota
El analizador sintáctico también se conoce como parser.
Dr. Ricardo Soto Teoría de Autómatas y Compiladores 3/7
4. Capítulo 4: Análisis Sintáctico
3. Herramientas para implementar analizadores
sintácticos
Generadores de analizadores sintácticos:
Yacc
(http://dinosaur.compilertools.net/)
Bison
(http://www.gnu.org/software/bison/)
PLY (Python Lex-Yacc)
(http://www.dabeaz.com/ply/)
ANTLR
(http://www.antlr.org/)
...
Dr. Ricardo Soto Teoría de Autómatas y Compiladores 4/7
5. Capítulo 4: Análisis Sintáctico
4. Implementación de analizadores sintácticos en
ANTLR
Definición de tokens y reglas AST
tokens {
PROGRAM
VAR_DEC
ASSIGN
...
}
...
program : VAR_RW! var_dec BEGIN_RW! body END_RW!
{## = #( #[PROGRAM, "PROGRAM"] ,##);};
var_dec : (type IDENT SEMICOLON!)*
{## = #( #[VAR_DEC, "VAR_DEC"] ,##);};
type: NUMERIC_TYPE|STRING_TYPE;
assign : IDENT ASSIG expr SEMICOLON!
{## = #( #[ASSIGN, "ASSIGN"] ,##);};
Dr. Ricardo Soto Teoría de Autómatas y Compiladores 5/7
6. Capítulo 4: Análisis Sintáctico
4. Implementación de analizadores sintácticos en
ANTLR
Definición de tokens y reglas AST
tokens {
PROGRAM
VAR_DEC
ASSIGN
...
}
...
program : VAR_RW! var_dec BEGIN_RW! body END_RW!
{## = #( #[PROGRAM, "PROGRAM"] ,##);};
var_dec : (type IDENT SEMICOLON!)*
{## = #( #[VAR_DEC, "VAR_DEC"] ,##);};
type: NUMERIC_TYPE|STRING_TYPE;
assign : IDENT ASSIG expr SEMICOLON!
{## = #( #[ASSIGN, "ASSIGN"] ,##);};
Dr. Ricardo Soto Teoría de Autómatas y Compiladores 6/7
7. Capítulo 4: Análisis Sintáctico
5. Ejercicios
Implemente el analizador sintáctico del lenguaje MiLe (Micro
Lenguaje)
Gramática
program ::= "var" var_dec "begin" body "end"
var_dec ::= type ident ";"
type ::= "numeric" | "string"
assig ::= ident "=" exp ";"
body ::= assig | st | print | read
st ::= for | if
for ::= "for" for_header "{" body "}"
for_header ::= "(" assign ";" expr ";" number ")"
if ::= "if" "(" cond ")" "{" body "}" else?
else ::= "else" "{" body "}"
read ::= "read" "(" ident ")" ";"
print ::= "print" "(" string "," ident ")" ";"
Dr. Ricardo Soto Teoría de Autómatas y Compiladores 7/7