04 4-SableCC
04 4-SableCC
04 4-SableCC
CIVIL INFORMÁTICA
UNIVERSIDAD DEL BÍO-BÍO
PARSING Bottom Up
(SABLECC)
Luis Gajardo
lgajardo@ubiobio.cl
RECORDANDO - TIPOS DE PARSING
Análisis Sintáctico
(Parsers)
Tokens
…
int
suma
int suma(int x, int y) { int z = x + y;
int z; x
z = x + y; Análisis Análisis
return z; Léxico Sintáctico
int
}
y
)
… {
… Arbol de análisis
} sintáctico
Programa fuente
(cadena de entrada)
…
exp → exp + term ;
…
Gramática Libre de
Autómata Finito Contexto
Determinístico (reglas del lenguaje)
¿QUÉ ES SABLECC?
• SableCC provee:
• Generador de Lexer (analizador léxico) usando AFD.
• Generador de Parser (analizador sintáctico) usando gramáticas LALR(1).
• Genera las clases java que representan el árbol de parsing (o derivación).
• Genera un visitador para el árbol.
• Generador de Pretty-printer
• SableCC es multiplataforma.
• En Windows:
• Descomprimir el archivo en la raíz del disco C (u otro seleccionado)
• Agregar a la variable PATH la siguiente ruta: c:\sablecc-3.7\bin
• Editar el archivo sablecc.bat ubicado dentro de la carpeta bin y escribir
en el la siguiente ruta absoluta:
c:\sablecc-3.7\lib\sablecc.jar
• Ejecutar sablecc desde cualquier directorio.
• En Linux:
• Descomprimir el archivo en HOME
• Agregar a la variable PATH la siguiente ruta: $HOME/sablecc-3.7/bin
• Editar el archivo sablecc ubicado en la carpeta bin y colocar la ruta
absoluta a sablecc.jar.
ETAPAS AL DESARROLLAR CON SABLECC
[<package declaration>]
[<helper declarations>]
[<states declarations>]
[<productions>]
• Permite definir el directorio raíz a partir del cual SableCC generará los
archivos y subdirectorios de nuestro proyecto.
Package tarea.java.cc.simplyc;
• Esta sección del archivo permite definir expresiones que nos ayudan a definir
otras más complejas.
• Ejemplos de tokens:
Tokens
while = 'while';
begin = 'begin';
end = 'end';
do = 'do';
if = 'if';
then = 'then';
else = 'else';
semi = ';';
assign = '=';
whitespace = (' ' | '\t' | '\n')+;
id = ['a'..'z'](['a'..'z']|['0'..'9'])*;
ARCHIVO: IGNORED TOKENS
• Permite indicar cuáles tokens ignorar.
• Ejemplo:
tab = 9
blank cr = 13
comment lf = 10
ignorar los
eol = cr lf | cr | lf espacios en
blank = (‘ ‘ | tab | eol)+ blanco
• Ejemplo:
Productions
expression =
{plus} expression plus number |
{minus} expression minus number | Permite definir alternativas
{number} number;
Otorga un nombre a cada alternativa de la producción
ETAPA1 EJEMPLO
• La clase inicial, será aquella que contenga el método estático main(), nuestro
punto de enlace con el exterior. En este caso la clase se llama Analizer.
$java postfix.Analizer
$(45+36/2)*3+5*2 enter ctrl z enter
• Por ejemplo:
• Permitir que se calcule la expresión aritmética entregando el resultado
final.
• Imprimir el árbol de derivaciones para la expresión
• Un ejemplo del árbol real que se crea en memoria para un programa analizado
es el siguiente:
CLASES CREADAS POR SABLECC
• Las clases generadas automáticamente por SableCC se organizan en 4
directorios:
lexer
contiene la clase Lexer, entre otras, la cual implementa el analizador léxico, este
es el primero que debe ser invocado al comenzar la compilación.
node
contiene todas las clases que representan la gramática, estas clases se utilizan
para construir el árbol de parsing.
parser
contiene la clase Parser, entre otras, la cual permite realizar el análisis
sintáctico (chequeando el programa de entrada contra las producciones de la
gramática).
CLASES DEL ÁRBOL GENERADO
Start
PExpr EOF
• Esta clase posee dos atributos, Una expresión PExpr y un fin de archivo
EOF.
1
TLPar No imprime El recorrido sería el siguiente:
nada
2 3 10
9 Debemos imprimir
5 los operadores
al salir de cada
expresión
8
7
4
6
EJEMPLO: RECORRER EL ÁRBOL GENERADO
class Translation
extends DepthFirstAdapter
DepthFirstAdapter.java Translation.java
• Los métodos que no aparecen aquí no fueron sobre escritos y por lo tanto
permanecen igual que en la clase DepthFirstAdapter.
EJEMPLO: RECORRER EL ÁRBOL GENERADO
• En el método main() de Analizer se instancia e invoca la clase Translation,
así:
...
tree.apply (new Translation());
...
• Compilar:
>javac postfix\Analizer.java
• Ejecutar:
>java postfix.Analizer
Ingrese la expresion aritmetica:
(45+36/2)*3+5*2 infija
^Z
45 36 2 / + 3 * 5 2 * + posfija