Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Lex Sint PDF
Lex Sint PDF
Procesadores de Lenguajes
OBJETIVO
LENGUAJE DE EJEMPLO
Para presentar este tema utilizaremos un lenguaje de programacin hipottico llamado LF.
INSTRUCCIONES
a DEF -1;
b DEF (a+1);
EVAL b;
a DEF 2;
EVAL b;
b DEF b + 1;
z DEF 2*y;
EVAL z;
EVAL b;
Departamento de Lenguajes y Sistemas Informticos 2
Procesadores de Lenguajes
El anlisis lxico-sintctico tiene por objeto reconocer la forma de las sentencias de un lenguaje.
Reconocer la forma de una sentencia implica reconocer sus lexemas y estructuras sintcticas. El
resultado del anlisis lxico-sintctico puede ser un error de reconocimiento o una versin de la
sentencia reconocida en forma de rbol de sintaxis abstracta (asa).
Sentencia
Sentencia
Filtro Filtro
1.1: 1.2: (asa)
(texto) lexemas
s
Analizador Analizador
lxico sintctico
Para reconocer los lexemas de un lenguaje usaremos expresiones regulares y para reconocer
estructuras sintcticas usaremos gramticas independientes de contexto (gramtica en
adelante).
Ejemplo 2. Derivacin.
programa -> variables instrucciones -> VARIABLES idents PyC
instrucciones -> VARIABLES VAR COMA idents PyC instrucciones ->
Si no es posible construir una derivacin que genere la sentencia completa como secuencia de
lexemas entonces dicha sentencia no pertenece al lenguaje especificado en la gramtica.
Una forma de resolver el problema del prefijo comn es usar predicados sintcticos. Los
predicados sintcticos son condiciones aadidas a las alternativas para reconocer de manera
tentativa un determinado prefijo de lexemas. Si es as, se selecciona la alternativa
correspondiente. Si no, se selecciona la siguiente alternativa en la regla (y as sucesivamente).
La siguiente gramtica resuelve el problema de la gramtica original (Ejemplo 1) usando prefijos
comunes.
Departamento de Lenguajes y Sistemas Informticos 4
Procesadores de Lenguajes
Los lexemas o tokens son los smbolos terminales que aparecen en la gramtica y representan
las distintas categoras de palabras y smbolos de puntuacin que podemos encontrar en una
sentencia del lenguaje. Los lexemas de un lenguaje se definen con reglas de la forma:
Las reglas que definen los lexemas del lenguaje LF se muestran a continuacin.
Departamento de Lenguajes y Sistemas Informticos 5
Procesadores de Lenguajes
// Lexemas no auxiliares
;
BTF: (' '|'\t'|NL); //alternativa
NUMERO : (DIGITO)+; // cierre
VAR : (LETRA)+; //cierre
VARIABLES: "VARIABLES"; //concatenacin
INSTRUCCIONES: "INSTRUCCIONES"; //concatenacin
EVAL: "EVAL"; //concatenacin
DEF: "DEF"; //concatenacin
PA : '(' ;//carcter
PC : ')'; //carcter
PyC : ';'; //carcter
COMA : ','; //carcter
MAS : '+' ;//carcter
MENOS : '-'; //carcter
POR : '*' ;//carcter
Para construir un asa tenemos que anotar la gramtica. El siguiente ejemplo muestra la
gramtica del Ejemplo 1 con anotaciones para construir rboles de sintaxis abstracta.
| expr2
;
expr2 : NUMERO
| MENOS^ expr
| VAR
| PA! expr PC!
;
El asa es una expresin #(nodo, subrbol1 , , subarbolk) donde nodo es un asa elemental
formado por un nico lexema y subrbol1, , subarbolk son los asas hijos de nodo.
Cada smbolo no terminal de la gramtica puede sintetizar un asa o una secuencia de asas. Por
ejemplo, el smbolo idents sintetiza una secuencia de asas y el smbolo programa sintetiza un
asa. Cada lexema de la gramtica, por el contrario, slo puede sintetizar un asa con un nico
nodo.
Podemos referenciar los asas sintetizados con etiquetas. Por ejemplo, la regla variables !:
a:VARIABLES b:idents PyC; define dos etiquetas: la etiqueta a para referirse al asa
#[VARIABLES] y la etiqueta b para referirse al asa #idents.
Para referirnos a todos los asas sintetizados por el cuerpo de una regla se tiene la expresin ##.
ANTLR proporciona una biblioteca para programar asas llamada antlr. Esta biblioteca incluye
una interfaz AST para el tipo rbol sintaxis abstracta y la clase CommonAST para implementarlo.
El nodo del asa tiene 2 campos principales: el lexema y el texto asociado el lexema. Podemos
consultar estos campos con las operaciones: getType() y getText().Podemos modificar
estos campos con las operaciones: setType(int) y setText(String).
Las operaciones getFirstChild() y getNextSibling() servirn para visitar los nodos del
asa y las operaciones setFirstChild(AST) and setNextSibling(AST) para construir el
asa.
Departamento de Lenguajes y Sistemas Informticos 7
Procesadores de Lenguajes
ANTLR tambin proporciona una clase ASTFactory que permite hacer una copia de un asa
dupTree(AST) y una copia de una secuencia de asas dupList(AST).
Dado un lenguaje,
Las estructuras alternativas del lenguaje pueden expresarse con cuerpos alternativos. Por
ejemplo, definicion|evaluacion.
Las estructuras repetitivas del lenguaje pueden expresarse con reglas iterativas o recursivas. Por
ejemplo, INSTRUCCIONES (definicion|evaluacion)* y expr : expr1 MAS expr
| expr1 MENOS expr | expr1.
Las piezas elementales de una estructura se formalizan con lexemas. Por ejemplo,
INSTRUCCIONES.
Los cuerpos de las reglas deben ser simples de interpretar. De esta manera, resultar ms
inteligible la estructura sintctica del lenguaje.
Una vez diseada las reglas de la gramtica, nos planteamos si permite realizar anlisis
descendente deterministas. Si no es as, hay que transformar la gramtica haciendo uso de
predicados sintcticos.
Una vez diseada la gramtica se tiene constancia de los lexemas del lenguaje. El diseo de
los lexemas se basa en un conjunto de recomendaciones:
Departamento de Lenguajes y Sistemas Informticos 8
Procesadores de Lenguajes
Los lexemas con formas alternativas de caracteres pueden expresarse con expresiones
regulares alternativas. Por ejemplo, BTF: (' '|'\t'|NL);.
Los lexemas con formas iterativas de caracteres pueden expresarse con expresiones regulares
de tipo cierre. Por ejemplo, NUMERO : (DIGITO)+;.
Los lexemas con partes opcionales pueden expresarse con expresiones regulares de tipo
opcin.
Los lexemas con forma de rango de caracteres pueden expresarse con expresiones regulares de
tipo rango. Por ejemplo, LETRA : 'a'..'z'|'A'..'Z';
Los lexemas con forma de secuencia de caracteres pueden expresarse con expresiones
regulares de tipo concatenacin. Por ejemplo, INSTRUCCIONES: "INSTRUCCIONES";
Los lexemas con 1 carcter pueden expresarse con expresiones regulares de tipo carcter.. Por
ejemplo, MAS : '+' ;.
El uso de lexemas auxiliares facilita la legibilidad de las expresiones regulares. Por ejemplo, VAR
: (LETRA)+; siendo LETRA : 'a'..'z'|'A'..'Z'; un lexema auxiliar.
| PA expr PC
;
options{
importVocab = Anasint;
}
tokens{
VARIABLES="VARIABLES";
INSTRUCCIONES="INSTRUCCIONES";
EVAL="EVAL";
DEF="DEF";
}
protected NL: "\r\n" {newline();} ;
protected DIGITO : '0'..'9';
protected LETRA : 'a'..'z'|'A'..'Z';
BTF: (' '|'\t'|NL) {$setType(Token.SKIP);} ;
NUMERO : (DIGITO)+ ;
VAR : (LETRA)+ ;
PA : '(' ;
PC : ')' ;
PyC : ';' ;
COMA : ',' ;
MAS : '+' ;
MENOS : '-' ;
POR : '*' ;
}catch(FileNotFoundException e)
{System.out.println("Error in file");}
catch(TokenStreamException e)
{System.out.println("Error in lexical analysis");}
catch(RecognitionException e)
{System.out.println("Error in parser analysis");}
catch(IOException e)
{System.out.println("Error in file");}
}
}
Si lo que se quiere testar es slo el analizador lxico entonces el programa de prueba para
hacerlo se muestra en el siguiente ejemplo.
}
}
Una vez testada la primera versin del analizador, se anota la gramtica para que sea capaz
de construir rboles de sintaxis abstracta. Para anotar la gramtica, primero hay que tener
claro cul es la estructura del rbol. El siguiente ejemplo muestra la estructura de asa requerida.
Departamento de Lenguajes y Sistemas Informticos 11
Procesadores de Lenguajes
Ejemplo 11. Parser Antlr para el lenguaje LF con la capacidad de construir ASAs.
class Anasint extends Parser;
options{
buildAST = true; // activar la sntesis de asas durante
// el anlisis.
}
tokens{
PROGRAMA;
}
programa : variables instrucciones EOF!
{#programa = #(#[PROGRAMA, "PROGRAMA"], ##);}
;
variables !: a:VARIABLES b:idents PyC {#variables = #(#a,#b);}
;
idents : (VAR COMA) => VAR COMA! idents
| VAR
Departamento de Lenguajes y Sistemas Informticos 12
Procesadores de Lenguajes
|
;
instrucciones : INSTRUCCIONES^ (definicion|evaluacion)*
;
definicion : VAR DEF^ expr PyC!
;
evaluacion : EVAL^ idents PyC!
;
expr : (expr1 MAS) => expr1 MAS^ expr
| (expr1 MENOS) => expr1 MENOS^ expr
| expr1
;
expr1 : (expr2 POR) => expr2 POR^ expr1
| expr2
;
expr2 : NUMERO
| MENOS^ expr
| VAR
| PA! expr PC!
;