1er Informe - Analizador Sintactico

UNIVERSIDAD NACIONAL MAYOR DE SAN MARCOS (Universidad del Perú, DECANA DE AMÉRICA) ‘LENGUAJES Y TRADUCTORES’ INFORME N°

Views 136 Downloads 5 File size 941KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

UNIVERSIDAD NACIONAL MAYOR DE SAN MARCOS (Universidad del Perú, DECANA DE AMÉRICA)

‘LENGUAJES Y TRADUCTORES’ INFORME N°1 PROFESOR : JAIME PARIONA

INTEGRANTES:

Espinoza Benavides Cesar Augusto

08200096

Soria Linares, Héctor J.

10200230

Ciudad Universitaria, Junio 2013

U.N.M.S.M ELABORACION DE UN ANALIZADOR LEXICOGRAFICO Y SINTACTICO PARA UN LENGUAJE DEFINIDO USANDO LA HERRAMIENTA JAVACC TRADUCTOR Un traductor es un programa que toma como entrada un texto escrito en un lenguaje, llamado fuente, y da como salida otro texto en un lenguaje denominado objeto. Si el lenguaje fuente es un lenguaje de programación de alto nivel y el objeto es un lenguaje de bajo nivel (ensamblador o código de maquina), a dicho traductor se le denomina compilador. Un ensamblador es un compilador cuyo lenguaje fuente es el lenguaje ensamblador. Un intérprete no genera un programa equivalente, sino que toma una sentencia del programa fuente en un lenguaje de alto nivel y la traduce al código equivalente y al mismo tiempo lo ejecuta. Una tarea frecuente en las aplicaciones de las computadoras es el desarrollo de programas de interfaces e intérpretes de comandos, que son más pequeños que los compiladores pero utilizan las mismas técnicas. En los traductores, en forma general, se deben seguir una serie de etapas que difieren muy poco con respecto a las etapas de un compilador; solo en la etapa de síntesis puede haber variaciones porque la traducción final no siempre es hacia un bajo nivel. FASES Y ETAPAS DEL COMPILADOR En general todo compilador debe tener una etapa de análisis y una de síntesis. La primera realiza toda la evolución y verificación del código fuente y la síntesis es donde se realiza la traducción final (Ver Figura 1). En la fase de análisis léxico se revisa o se examina el programa fuente como una cadena de izquierda a derecha y se generan los componentes léxicos o token a partir de una secuencia de caracteres que tenga un significado valido. Luego, en la fase de análisis sintáctico, recibe todos los componentes léxicos reconocidos en la etapa anterior y los agrupa en forma jerárquica a través de la gramática independiente del contexto (define si está bien escrito). Seguidamente, en la etapa de análisis semántico, el compilador intenta detectar construcciones que tengan la estructura sintáctica correcta pero que no tengan significado para la operación implicada y por último en la generación de código se toma el programa y se crea un código intermedio que generalmente lo traen todos los compiladores. La fase de análisis léxico se constituye en la fase de estudio necesaria para la construcción del analizador lexicográfico en cuestión.

Figura 1. Fases de un Compilador JAVACC (Java Compiler Compiler – Meta Compilador en Java ) Se trata de una herramienta que facilita la construcción de analizadores léxico y sintáctico por el método de las funciones recursivas, aunque permite una notación muy relajada parecida a la BNF (abreviatura en inglés de Forma de Backus – Naur). De esta manera, los analizadores generados utilizan la técnica descendente a la hora de obtener el árbol sintáctico. JavaCC integra en una misma herramienta al analizador lexicográfico y al sintáctico, y el código que genera es independiente de cualquier biblioteca externa, lo que le confiere una interesante propiedad de independencia respecto al entorno. A grandes rasgos, sus principales características son las siguientes:

INFORME DE LENGUAJES Y TRADUCTORES

U.N.M.S.M  

Las especificaciones léxicas y sintácticas se ubican en un solo archivo. Admite el uso de estados léxicos y la capacidad de agregar acciones léxicas incluyendo un bloque de código Java para el identificador de un token.  Incorpora distintos tipos de tokens: normales (TOKEN), especiales (SPECIAL_TOKEN), espaciadores (SKIP) y de continuación (MORE). Ello facilita trabajar con especificaciones más claras, a la vez que permite una mejor gestión de los mensajes de error y advertencia por parte de JavaCC en tiempo de metacompilación.  La especificación léxica puede definir tokens de manera tal que no se diferencien las mayúsculas de las minúsculas bien a nivel global, bien en un patrón concreto.  También es considerado altamente eficiente, lo que lo hace apto para entornos profesionales y lo ha convertido en uno de los metacompiladores más extendidos (quizás el que más, por encima de JFlex/Cup). La estructura básica de un programa en JavaCC es como se aprecia en la Figura 2.

Figura 2. Estructura de un programa en JavaCC

LENGUAJE PROPUESTO int a = 2 , b double c = 1 complejo x (2 , 3) , y complejo r imprime x , y y = x + (4 , 3) x=x+y y=x*r if ( a > 1) imprime x endif while (c < 3) y = y + (2 , 4) imprime y wend

INFORME DE LENGUAJES Y TRADUCTORES

U.N.M.S.M

𝑞1

𝑞2

,

,

𝑞4

(

)

𝑞11

𝑞10

$ $

𝑞15

)

𝑞23 INFORME DE LENGUAJES Y TRADUCTORES

𝑞24

*

=

𝑞14

𝑞22

𝑞𝑓

$ 𝑞13

$

𝑞9

,

$

$

,

𝑞8

𝑞7

𝑞6 ,

𝑞0 imprime 𝑞 12

𝑞3 ,

𝑞5

=

𝑞21

𝑞16 ,

+

𝑞20 𝑞19

𝑞17 (

$

𝑞25

𝑞18

$

U.N.M.S.M GRAMATICA





< decl>





if else endif

while wend

( )



λ





,

< id > < id > = λ

complejo



,

< id > < id > ( , )

imprime

< id > , < id >





< id >

+ * < id >

INFORME DE LENGUAJES Y TRADUCTORES

U.N.M.S.M

0|1|2|3|4|5|6|7|8|9

< id >



< id >

< id >

int | float | double < |> |=

λ

a | b | c ….. | z

ESTRUCTURA DEL PROGRAMA EN JAVACC Los programas en JavaCC siguen esta estructura general: options{ ... } PARSER_BEGIN( Nombre ) public class Nombre{ ... ... } PARSER_END( Nombre ) Producción En la parte de options se colocan las opciones de JavaCC, es opcional, a partir de PARSER_BEGIN hasta PARSER_END es la declaración del programa en Java, por último, en la parte de producción se colocan las Gramáticas y Expresiones Regulares. PARSER_BEGIN (Complejos) // Aquí estará la clase main que va crear el objeto parser, acá también se ingresaran las líneas de sentencias y se ejecutara la clase programa definida en la gramática. PARSER_END (Complejos) // Acá estarán las clases y las reglas de producción definidas en la gramática, Estarán clases para crear numero complejo, imprimir y las operaciones de suma y multiplicación entre complejos, cada una con su regla de producción respectiva.

INFORME DE LENGUAJES Y TRADUCTORES