PROCESADORES DEL LENGUAJES Diciembre 2015 NOMBRE: _____________________________________________________________ GRUPO: _______ EL LENGUAJE LP LP es un lenguaje de programación. El programa LP consta de declaraciones de variables e instrucciones. Las variables pueden ser de tipo entero o de tipo pila de enteros. La declaración de una variable de tipo entero inicializa su valor a 0 y la declaración de una pila inicializa su valor a pila vacía. El tipo pila tiene las siguientes operaciones: apilar un entero, desapilar la cima y consultar la cima. Las instrucciones en LP pueden ser de dos tipos: (a) asignación y (b) apilar un entero. La asignación vincula una expresión entera a una variable de tipo entero. Las expresiones enteras se construyen desde números naturales, variables enteras, expresiones desapilar y cima de una pila y sumas, restas y multiplicaciones de expresiones enteras. A continuación se muestra un programa LP de ejemplo. PROGRAMA DECLARACIONES Pila p,q; // p y q son pilas de enteros Entero x,y,z; // x,y,z son variables enteras INSTRUCCIONES p.apilar(3); p.apilar(y+2-p.cima()); x = p.desapilar()+5; y = p.desapilar()*x; q.apilar(2); z = q.cima(); SE PIDE: (1) Análisis Sintáctico. Parser ANTLR para reconocer la sintaxis de cualquier programa LP (2.5 puntos). (2) Análisis Léxico. Lexer ANTLR para reconocer los lexemas de cualquier programa LP (1.5 puntos). PROCESADORES DEL LENGUAJES Diciembre 2015 NOMBRE: _____________________________________________________________ GRUPO: _______ EL LENGUAJE LP LP es un lenguaje de programación. El programa LP consta de declaraciones de variables e instrucciones. Las variables pueden ser de tipo entero o de tipo pila de enteros. La declaración de una variable de tipo entero inicializa su valor a 0 y la declaración de una pila inicializa su valor a pila vacía. El tipo pila tiene las siguientes operaciones: apilar un entero, desapilar la cima y consultar la cima. Las instrucciones en LP pueden ser de dos tipos: (a) asignación y (b) apilar un entero. La asignación vincula una expresión entera a una variable de tipo entero. Las expresiones enteras se construyen desde números naturales, variables enteras, expresiones desapilar y cima de una pila y sumas, restas y multiplicaciones de expresiones enteras. A continuación se muestra un programa LP de ejemplo. PROGRAMA DECLARACIONES Pila p,q; // p y q son pilas de enteros Entero x,y,z; // x,y,z son variables enteras INSTRUCCIONES p.apilar(3); p.apilar(y+2-p.cima()); x = p.desapilar()+5; y = p.desapilar()*x-p.desapilar(); z = q.cima(); q.apilar(2); z = q.cima(); y = p.cima(); //error //error SE PIDE: Análisis Semántico (4 puntos). Construir un analizador semántico capaz de reconocer errores al operar sobre una pila. Se consideran dos tipos de errores: desapilar de una pila vacía y consultar una pila vacía. En caso de error, se debe dar un mensaje por pantalla indicando el número de instrucción, la operación causante del error y la pila que provoca el error. Las instrucciones con error no condicionarán el análisis del resto de las instrucciones, es decir, si durante el análisis se detecta una instrucción con error, ésta instrucción es como si no existiera en el programa. El análisis del programa de ejemplo daría los siguientes errores: Error (instrucción 4): operación desapilar sobre pila vacía p Error (instrucción 5): operación cima sobre pila vacía q Implemente la solución atribuyendo la gramática del siguiente Tree-Parser ANTLR: class Anasint2 extends TreeParser; options{ importVocab=Anasint; } instruccion : asignacion | apilar ; asignacion : #(ASIG ID expresion) programa: #(PROGRAMA declaraciones instrucciones) ; declaraciones: #(DECLARACIONES (variables)*) ; variables: #(PILA vars) | #(ENTERO vars) ; vars: (ID)+ ; instrucciones: #(INSTRUCCIONES (instruccion)*) ; ; apilar : ; #(APILAR ID expresion) expresion : | | | | | | ; #(MAS expresion expresion) #(MENOS expresion expresion) #(POR expresion expresion) #(DESAPILAR ID) #(CIMA ID) ID NUMERO PROCESADORES DEL LENGUAJES Diciembre 2015 NOMBRE: _____________________________________________________________ GRUPO: _______ EL LENGUAJE LP LP es un lenguaje de programación. El programa LP consta de declaraciones de variables e instrucciones. Las variables pueden ser de tipo entero o de tipo pila de enteros. La declaración de una variable de tipo entero inicializa su valor a 0 y la declaración de una pila inicializa su valor a pila vacía. El tipo pila tiene las siguientes operaciones: apilar un entero, desapilar la cima y consultar la cima. Las instrucciones en LP pueden ser de dos tipos: (a) asignación y (b) apilar un entero. La asignación vincula una expresión entera a una variable de tipo entero. Las expresiones enteras se construyen desde números naturales, variables enteras, expresiones desapilar y cima de una pila y sumas, restas y multiplicaciones de expresiones enteras. A continuación se muestra un programa LP de ejemplo. PROGRAMA DECLARACIONES Pila p,q; // p y q son pilas de enteros Entero x,y,z; // x,y,z son variables enteras INSTRUCCIONES p.apilar(3); p.apilar(y+2-p.cima()); x = p.desapilar()+5; y = p.desapilar()*x; q.apilar(2); z = q.cima(); SE PIDE: Intérprete (2 puntos). Construir un intérprete de programas LP sin errores. Implemente la solución atribuyendo la gramática del siguiente Tree-Parser ANTLR: class Anasint2 extends TreeParser; options{ importVocab=Anasint; } instruccion : asignacion | apilar ; asignacion : #(ASIG ID expresion) programa: #(PROGRAMA declaraciones instrucciones) ; declaraciones: #(DECLARACIONES (variables)*) ; variables: #(PILA vars) | #(ENTERO vars) ; vars: (ID)+ ; ; apilar : ; #(APILAR ID expresion) expresion : | | | | | | ; #(MAS expresion expresion) #(MENOS expresion expresion) #(POR expresion expresion) #(DESAPILAR ID) #(CIMA ID) ID NUMERO instrucciones: #(INSTRUCCIONES (instruccion)*) ; Interpretar un programa LP significa interpretar sus declaraciones de variables y después interpretar sus instrucciones secuencialmente. Interpretar declaraciones de variables en LP significa crear una memoria para éstas. Interpretar una asignación en LP significa reducir a constante la expresión de la asignación y actualizar la memoria para la variable asignada. Interpretar una instrucción de tipo apilar significa reducir a constante la expresión a apilar y actualizar la memoria de variables para dicha pila.