PARTE I ANALISIS LEXICO

Documentos relacionados
FORMATO DEL FICHERO CON LA TABLA DE SÍMBOLOS

Comprender las diferencias entre tipos de datos primitivos similares, y aprender a elegir el tipo más conveniente en cada caso.

Todo programa en 'C' consta de una o más funciones, una de las cuales se llama main.

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

Lección 2 Introducción al lenguaje C

abril de 2017 Desarrollo de aplicaciones en Java Tipos de datos primitivos Tipos de datos Elementos de aplicaciones simples

Tema II: Introducción al Lenguaje Funcional

Procesadores de lenguajes Ingeniería Informática Especialidad de Computación Tercer curso, segundo cuatrimestre

TEMA 2. LENGUAJE C. CONCEPTOS BÁSICOS Y PROGRAMACIÓN ELEMENTAL.

Índice general 7. Presentación 15

PRINCIPIOS DE PROGRAMACIÓN. Mtro. en Ingeniería de Software. Especialidad en e-commerce Ismael Jiménez Hernández

Procesadores de lenguajes Ingeniería Informática Especialidad de Computación Tercer curso, segundo cuatrimestre

Apunte Laboratorio ALPI - El lenguaje de programación Pascal

PRÁCTICA DE PROCESADORES DE LENGUAJE EVALUACIÓN ORDINARIA CURSO 2009/2010 OBJETIVO DE LA PRÁCTICA

Elementos de un programa en C

El lenguaje C. 1. Identificadores, constantes y variables

Tema 2: Desarrollo de Algoritmos. E.E. de Algorítmica

Una clasificación de los tipos de datos existentes en los diferentes lenguajes de programación se presenta a continuación:

Sintaxis de C Ing. Jose Maria Sola Dr. Oscar Ricardo Bruno

LABORATORIO DE PROCESADORES DE LENGUAJE Curso: Práctica 2: Analizador léxico/sintáctico/semántico con Flex y Bison

Compiladores e Intérpretes

Tema 2: Análisis léxico

Resolución de Problemas y Algoritmos

4. Operadores Operador asignación

El lenguaje de programación JKL

Definición Es una directiva using que ayuda al compilador a localizar una clase que se usa en la aplicación.

Tema 2: Análisis léxico

ING1310 Introducción a la Computación. Python. Conceptos Básicos. Carlos Reveco

Componentes Básicos. InCo. InCo Componentes Básicos 1 / 28

Estructura de un programa en Java. Tipos de datos básicos. class miprimerprograma{ // comentario, no es parte del programa

Introducción a la Programación

Informática General 2018 Cátedra: Valeria Drelichman, Pedro Paleo, Leonardo Nadel, Norma Morales

Fundamentos de Programación

Tema: Análisis Semántico

Curso de Programación Avanzada en C

GUÍA DE ESTILO EN JAVA

Datos Elementales y formato de un programa en Java

LABORATORIO DE PROCESADORES DE LENGUAJE Curso: Práctica 2: Analizador léxico/sintáctico/semántico con Flex y Bison

2. EXPRESIONES 3. OPERADORES Y OPERANDOS 4. INDENTIFICADORES COMO LOCALIDADES DE MEMORIA

Manual de turbo pascal

Tema#2. Tipos de Datos 10

Las expresiones son combinaciones de constantes, variables, símbolos de operación, paréntesis y nombres de funciones especiales.

Repaso Lenguaje C Área de Servicios Programación (Ing. Elect. y Prof. Tec.), Programación I (TUG y TUR) y Electrónica programable (TUE)

Características de JavaScript

Informática General 2016 Cátedra: Valeria Drelichman, Pedro Paleo, Leonardo Nadel, Norma Morales

TEMA 02 TIPOS, OPERADORES Y EXPRESIONES

PROGRAMACIÓN ORIENTADA A OBJETOS (L40629) Sabino Miranda-Jiménez

Curso de Java Introducción a la Programación II

Informática General Cátedra: Valeria Drelichman Pedro Paleo Leonardo Nadel Norma Morales

Java. Introducción a la Programación Orientada a Objetos

GLOSARIO 1. Qué es bit y byte? Bit: Es la unidad mínima de información. Puede ser 0 o 1. Byte: Es el conjunto de 8 bits. Ejemplo:

Introducción a PL/SQL

LENGUAJE. Tema 2 Elementos de un programa

Principios de Computadoras II

UNIDAD 2 Descripción de un programa

PHP: Lenguaje de programación

Operadores y Expresiones

UIT-T Z.314 SECTOR DE NORMALIZACIÓN DE LAS TELECOMUNICACIONES DE LA UIT

Compiladores e Intérpretes Análisis Léxico

JavaScript: Operadores

PROCESADORES DE LENGUAJE. Hoja de ejercicios de FLEX

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

UNIVERSIDAD DE SEVILLA PRÁCTICAS DE LABORATORIO ANÁLISIS LÉXICO (1) LENGUAJES FORMALES Y AUTÓMATAS CURSO 2006/2007

Programación Orientada a Objetos

CAPÍTULO IV: 4.1 Introducción a la. Programación Funcional

Yacc/Bison. Introducción

Algoritmo, Estructuras y Programación I Ing. Marglorie Colina

Tema 2. Concepto de Algoritmo

Bison. Introducción. Índice. Introducción Uso de Bison con Flex. Formato del fichero de especificación de Bison

UNIVERSIDAD MODULAR ABIERTA FACULTAD DE CIENCIAS ECONOMICAS

3.3 Conceptos Básicos del Lenguaje Java

Operadores. Java es un lenguaje rico en operadores, que son casi idénticos a los de C/C++.

Procesamiento de Lenguajes (PL) Curso 2015/2016. Práctica 5: traductor a código m2r

Los parámetros: son los campos que se comunican a los métodos de los objetos.

Introducción a Haskell. Cecilia Manzino

Tema 05: Elementos de un programa en C

JavaScript Básico. Elementos Básicos: Comentarios: Literales: Valores que puede tomar una variable o una constante.

VARIABLES, CONSTANTES Y EXPRESIONES ASIGNACIÓN. TIPOS ELEMENTALES. PRECEDENCIA DE LOS ESTRUCTURAS DE CONTROL. CONDICIONAL E

Autoestudio 2: Variables y Operadores

Ejercicio 1 Funciones de SQL

µ-c: Manual de referencia del lenguaje Micro-C

Introducción a Java. Introducción a Java. Programación I

Programación en java. Estructuras algorítmicas

Tema 2: Elementos básicos de un programa. Tipos de datos, variables y constantes Asignación Operadores y expresiones

Variables, expresiones y sentencias

Informática. JavaScript: Lenguaje de programación. Fco J. Martín Mateos Carmen Graciani

PHP Programming. Learn how PHP works Learn the basic syntax of PHP Learn to create dynamic interactive pages with PHP

Un calculadora avanzada... y algo más!

Tema 2.- Objetos y mensajes

Instituto Tecnológico de Celaya

Gramaticas Independientes del Contexto, ejemplos y ejercicios

Proyecto Unico Interpretador de MiniLogo

INTRODUCCIÓN...9 CAPÍTULO 1. ELEMENTOS DE UN PROGRAMA INFORMÁTICO...11

Generación de Código Intermedio

Transcripción:

PARTE I ANALISIS LEXICO Un cierto lenguaje de programación está formado, entre otros elementos, por los siguientes: 1. Palabras clave: alias, check, class, creation, do, else, elseif,, ensure, feature, if, implies, indexing, infix, inspect, invariant, is, loop, obsolete, old, once, require, result, select, then, until, variant, when. 2. Identificadores: secuencias de uno o más caracteres que obligatoriamente debe comenzar por letra. El resto, si es que los hay, pueden ser letras, dígitos decimales o caracteres de subrayado. Es importante reseñar que este lenguaje distingue entre mayúsculas y minúsculas. Así por ejemplo, los identificadores Value y value se considerarían diferentes. 3. Operadores libres: secuencias de una o más letras o dígitos que comienzan por uno de los siguientes caracteres: @ # &. Ejemplos: @Suma2Matrices, #LogaritmoEnBase son siempre binarios, por lo que se utilizarían del siguiente modo: MResult := M1 @Suma2Matrices M2 ; Aux := 180 #LogaritmoEnBase 10 ; 4. Las constantes se representan según su formato: a. Hexadecimales: secuencia de dos o más caracteres, donde el primero es obligatoriamente un dígito y el resto son dígitos o letras entre la A y la F, todo ello seguido por el indicador de formato hexadecimal (la letra X). Tanto para las letras A-F como para el indicador de hexadecimal, se pueden usar indistintamente mayúsculas o minúsculas, si bien se recomia el uso de mayúsculas: 2AX, 231E1X. b. Enteros: secuencia de dígitos y de símbolos de subrayado. Si un número incluye símbolos de subrayado, a la derecha de cada subrayado debe haber obligatoriamente 3 dígitos y además no podrá haber secuencias de cuatro o más dígitos consecutivos sin subrayado (esta limitación no se aplica si no hay ningún símbolo de subrayado dentro del número). Ejemplos: 2_127_413_648, 4231234, 2_000_000. c. Caracteres, que pueden ser un carácter imprimible entre comillas simples excepto el símbolo de porcentaje (%) y la comilla simple ( ): a, f, #, 9. 1 de 8

d. Binarios: secuencia de ceros y unos seguida por el carácter B (recomado) o b : 100110B, 101B. e. Cadenas: secuencia de caracteres entre comillas dobles: Cadena made in UOC. 5. Una línea se considera un comentario cuando comienza por dos guiones seguidos (--), sio ignorado a partir de ese punto todo carácter hasta el final de la línea. 6. El fichero fuente, puede además tener los caracteres siguientes: :=, =, /=, <, >, <=, >=,,, ;, (, ), +, -, *, /, ^ Se pide crear, utilizando JLex, un analizador léxico para este lenguaje que incluya las siguientes características: El programa analizador se denominará ToyLex. El fichero fuente será un fichero de texto en ASCII-Exted, cuya extensión deberá ser obligatoriamente toy. Los ficheros que no cumplan este formato deben ser rechazados. ToyLex aceptará el nombre del fichero fuente a analizar como parámetro en línea: $ java ToyLex entrada.toy Deben detectarse los errores léxicos del código fuente sin interrumpir el análisis, en la medida de lo posible. Deben ignorarse los comentarios. Cuando el analizador léxico detecte la utilización de una b minúscula en un número binario, debe indicar al usuario mediante un mensaje de advertencia que se trata de un modo de utilización no recomado y que debería utilizar una B mayúscula. Debe hacerse lo mismo para las constantes hexadecimales (recomar el uso de mayúsculas). Una vez finalizado el análisis del archivo de entrada, el analizador mostrará por pantalla una tabla de símbolos con los identificadores encontrados, junto con información sobre la línea y columna de su primera aparición en el fichero fuente. Como parte de la información a mostrar tras el análisis, debe emitirse un informe que incluya: número de errores léxicos identificados (con información sobre la línea en que aparecen), número de identificadores, número de mensajes de advertencia (warnings) sobre faltas relacionadas con el formato de mayúsculas/minúsculas y finalmente una relación de operadores libres. Ejemplo de salida de un programa correcto: [Line 15] Warning: Binary constant 10011b in non recommed form. Use B instead of b. [Line 38] Warning: Hexadecimal constant expression 32af6X in non recommed form. The use of capital letters is recommed. Symbols found in the source file (symbol table): 2 de 8

No free operators were defined in the source file. Lexical errors found: 0 Warnings: 2 Identifiers found: 3 Ejemplo de salida de un programa con errores: [Line 12] Error: invalid character found. [Line 38] Warning: Hexadecimal constant expression 32af6X in non recommed form. The use of capital letters is recommed. [Line 56] Error: integer constant 2_12 format is not correct. Symbols found in the source file (symbol table): Free operators defined in the source file: Lexical errors found: 2 Warnings: 1 Identifiers found: 1 Symbol name line column Alumno 25 10 Nombre 27 15 Apellido 28 15 Symbol name line column x 32 14 Operator line column @Suma2Matrices 53 10 #LogaritmoEnBase 217 12 PARTE II ANALISIS SINTÁCTICO A partir de la especificación léxica generada para la Parte I, se desea crear un analizador sintáctico para el lenguaje de programación Toy con las siguientes reglas: 1. Un programa está formado por una lista de clases y sus correspondientes elementos de indexación que, como se verá más adelante, sirven para posteriormente documentar el código. La sintaxis para la creación de un archivo en el lenguaje Toy es la siguiente: [ indexación ] DeclaraciónDeClase [ [ indexación2 ] DeclaraciónDeClase2... ] 2. Una clase está formada por un conjunto de una o más características (features), que pueden ser características estáticas (atributos) o características dinámicas (métodos). Un método especial de toda clase es el constructor de la misma, que se denota mediante la palabra clave creation. Sintacticamente, las clases tienen el siguiente formato: class identificador creation identifieroftheconstructor 3 de 8

feature [DeclaraciónDeAtributo DeclaraciónDeMétodo] [DeclaraciónDeAtributo DeclaraciónDeMétodo]... invariant condicion 3. Las declaraciones de atributos deben seguir la siguiente sintaxis: Ejemplos: Identificador : tipo [ is valorinicial ] firstname : STRING is "John" salary : REAL Los tipos del lenguaje son STRING, CHAR, HEXADECIMAL, BINARY y REAL. 4. En cuanto a la declaración de métodos, el formato es el siguiente: identificador [ (lista_de_parámetros) ] is [require < expresión > ] [local < declaraciones de variables > ] do < sentencias > La parte de prerrequisitos del método (require) es opcional, igual que la parte de declaraciones de variables locales (local), por lo que deben considerarse correctos aquellos códigos fuente que omitan una o las dos. 5. Las listas de parámetros (que pueden ser vacías, en cuyo caso se omiten también los paréntesis) siguen el siguiente formato: [ declaracióndeparámetro1 [, declaracióndeparámetro2 [,... ] ] ] donde cada declaración de parámetro tiene la forma: identificador : tipo La información sobre tipos es la ya reseñada: HEXADECIMAL, BINARY, REAL, STRING y CHAR. 6. Las expresiones de las cláusula require deben ser expresiones lógicas, es decir, expresiones en que intervienen dos operandos y un operador relacional (ver punto 8.b). Ejemplo: require 4 de 8

x /= 0 7. Pueden declararse variables locales a un método mediante una cláusula local. La sintaxis de estas cláusulas es similar a la declaración de atributos pero no trá parte is de inicialización: Ejemplo: local identificador : tipo identificador2 : tipo2... local x1: STRING x2: CHAR 8. Las instrucciones de un método están incluidas entre la palabra clave do y la palabra clave. Esta parte puede estar formada por un conjunto de una o más sentencias, cada una de las cuales termina en salto de línea. Éstas pueden ser de los siguientes tipos: a. Sentencias de asignación: Identificador := expresión Donde una expresión será cualquier combinación de variables y operadores definidos que se atenga a las reglas siguientes: Operando Operador_binario Operando Operador_ unario Operando Pudiéndose utilizar los paréntesis para agrupar subexpresiones. b. Las expresiones pueden contener los siguientes operadores: Aritméticos: suma ( + ), resta ( - ), multiplicación ( * ), división ( / ), operador unario positivo ( + ) y operador unario negativo ( - ) Relacionales: <, >, <=, >=, =, /=. Operadores libres (definidos en la Parte I). Todos los operadores son asociativos por la izquierda, sio su orden de precedencia el siguiente: Operadores aritméticos unarios Operadores aritméticos binarios Operadores lógicos Mayor precedencia Menor precedencia c. Sentencias alternativas simples: 5 de 8

Ejemplo: if expresión then listadesentencias [ elseif expresión listadesentencias] [ elseif expresión listadesentencias] [ else listadesentencias ] if x = 0 then x1 := x1 @Play x2 elseif x > 10_60 x1 := x2 #Play x1 else x1 := x2 @Play x2 d. Sentencias alternativas múltiples: Ejemplo: inspect expresión when expresión then listadesentencias [ when expresión then listadesentencias] [ else listadesentencias ] inspect mark when 10 then grade := 'A' when 9 then grade := 'A' when 8 then grade := 'B'... else grade := 'D' 9. Las cláusulas para invariantes especifican una condición que debe cumplirse durante toda ejecución de un objeto de la clase. Su formato es: invariant condicion Donde condición es una expresión lógica (ver punto 6). Ejemplo: invariant x1 <= exp En consecuencia, se pide: 1. Crear, utilizando el software CUP, el analizador sintáctico que reconozca la corrección sintáctica de cualquier fichero fuente escrito en el lenguaje descrito. 2. Crear una tabla de símbolos que contenga las diferentes variables declaradas en el programa fuente. Los datos que se incluirán en la tabla de símbolos son: nombre de la variable, tipo y línea del fichero fuente en la que se ha declarado. 6 de 8

3. Este analizador deberá contabilizar todos los posibles errores sintácticos presentes en el archivo fuente y mostrar su número tras el análisis. Por tanto, el analizador deberá intentar la recuperación ante errores sintácticos. 4. En el caso de que el fichero fuente no contenga ningún error sintáctico, tras el análisis se mostrará por pantalla el contenido de la tabla de símbolos (una secuencia de [nombre, tipo, núm. línea] separados por un salto de línea). Enlazar el código del analizador léxico con el del sintáctico para permitir a este último actualizar la tabla de símbolos con información sobre el tipo de datos de los identificadores. PARTE III ANALISIS SEMÁNTICO Una vez completada la parte II, se pide además: a) Verificar que el tipo de las variables y valores (en su caso) que participan en las declaraciones de variable con inicialización, es el mismo. Para la comprobación de tipos en inicializaciones, únicamente nos centraremos en los tipos: INTEGER, CHAR y STRING. Por tanto, sólo veremos declaraciones con inicialización del estilo de las siguientes: x : STRING is Hi y : CHAR is D z : INTEGER is 200 b) Detectar la declaración de identificadores duplicados, así como el uso de identificadores no declarados con anterioridad en el código. En ambos casos debe mostrarse un mensaje de error donde aparezca la causa del error, la línea donde se produjo y el nombre del identificador implicado. A continuación se muestran dos posibles mensajes de error: "Error en línea 20: el identificador 'x' no ha sido declarado" "Identificador duplicado en línea 25: ya existe otro identificador llamado 'y' " Debe tenerse en cuenta que además de los tipos básicos (STRING, CHAR, etc.), Toy considera como nombres válidos de tipos aquellos identificadores de clases de las que se tenga constancia antes o durante el análisis del archivo fuente actual. Es decir, el siguiente código es correcto: class Ejemplo1 class Ejemplo2 feature x : Ejemplo1 Con respecto a la visibilidad de los nombres: 7 de 8

El nombre de una clase es visible en todo el fichero. El nombre de un feature (atributo/método) es visible sólo dentro de la clase donde está declarado, a partir del punto de declaración. El nombre de una variable local es visible sólo dentro de la función donde se declara. Para la declaración de constructor (CREATION), hay que garantizar que el nombre del constructor es el nombre de uno de los features declarados dentro del cuerpo de esa clase. Con respecto a la duplicidad de nombres: No puede haber dos clases con el mismo nombre. El nombre de un feature (atributo/método) debe ser único dentro de cada clase, pero puede repetirse en clases diferentes. El nombre de una variable local deber ser único dentro del método en que se declara, pero puede repetirse en métodos diferentes. Las variables locales, features y clases pueden usar el mismo identificador en un punto del programa sin que sea motivo de error. INSTRUCCIONES GENERALES Para superar la práctica debéis: a) Entregar los ficheros JLex y CUP correspondientes. b) Incluir en un documento aparte (word o PDF) comentarios sobre las decisiones tomadas para resolver cada tarea. 8 de 8