Documente Academic
Documente Profesional
Documente Cultură
Agenda
Introduccin a los compiladores
Definicin de compilador Tipos de compiladores Anlisis del programa fuente Fases de un compilador El agrupamiento de fases Herramientas para la construccin de compiladores
Sintaxis
Procesamiento de lenguajes naturales y mtodos formales Anlisis sintctico
1. Cualquier identificador es una expresin. 2. Cualquier nmero es una expresin. 3. Si expresin1 y expresin2 son expresiones, entonces tambin lo son: expresin1 + expresin2 expresin1 * expresin2 (expresin1)
Sintaxis
Definicin y generalidades
La sintaxis de un lenguaje de programacin es una definicin de lo que constituye un programa gramaticalmente vlido en dicho lenguaje. La sintaxis queda especificada por un conjunto de reglas. Una definicin de la sintaxis clara, concisa y formal es especialmente importante en los lenguajes de programacin.
May 15, 2012 Ing. Rubn Daro Garca Guzmn
Sintaxis
Procesamiento de lenguajes y mtodos formales
Un Metalenguaje es un lenguaje usado para definir otros lenguajes. Backus-Naur Form o BNF es uno de ellos. BNF desarrollado por Noam Chomsky, es altamente usada en la definicin de lenguajes de programacin. Es til para describir de forma precisa las cadenas que son programas legtimos y aislar todas las dems (las que tienen errores sintcticos de varios tipos) Las expresiones regulares tambin es un Metalenguaje
Sintaxis
BNF y el anlisis lxico una sintaxis BNF sencilla es mostrada en la figura.
Sintaxis
El Anlisis Lxico y el proceso de compilacin
Todos los programas deben ser analizados para comprobar su correccin sintctica antes de ser interpretados o traducidos a cdigo mquina. Al nivel ms elemental, el proceso de anlisis lxico separa los caracteres individuales del programa en una cadena de tokens que se analiza sintcticamente, de uno en uno, hasta un nivel de anlisis superior. Las etapas de anlisis semntico y de optimizacin analizan la consistencia semntica (comprobando, por ejemplo, la utilizacin consistente de operadores y tipos de datos) y transforman el texto de forma que pueda utilizar de forma eficiente la arquitectura en la que se ejecutar el programa. Para terminar, la etapa de generacin de cdigo utiliza la representacin abstracta resultante como base para la generacin de cdigo mquina ejecutable.
Sintaxis
Las expresiones regulares y el anlisis lxico
Las Expresiones regulares son una herramienta muy utilizada en el diseo de lenguajes para especificar formalmente cada clase de token. Estas permiten conceptos como una o ms apariciones de un dgito. Es ms, se puede crear de forma similar una expresin regular para definir el significado de un ldentificador: [a-zA-Z] [a-zA-Z0-9]* lo que significa una letra seguida por una o ms apariciones de una letra o un dgito. Las expresiones regulares se han convertido en una herramienta muy popular del diseo de lenguajes, porque admiten la generacin automtica de analizadores lxicos sin problemas. Dos generadores bastante utilizados son el Lex (que genera cdigo de C) y el JLex (que genera cdigo de Java).
May 15, 2012 Ing. Rubn Daro Garca Guzmn
Sintaxis
El Anlisis sintctico
La sintaxis completa de un lenguaje de programacin utiliza el resultado del anlisis lxico como base para la definicin de la estructura de todas las partes diferentes de programa que aparecen por encima del nivel lxico La sintaxis de un lenguaje utiliza BNF como herramienta principal para proporcionar una definicin precisa y una gua estricta para que la fase de anlisis sintctico detecte errores sintcticos y desarrolle una interpretacin abstracta a partir de un flujo de tokens. Consideremos las categoras sintcticas Asignacin y Expresin, que definen todas las secuencias de Pasos de testigo que describen los clculos aritmticos y asignaciones de resultados a una variable. la Figura 2.8 muestra una derivacin de la Expresin x+2*y.
Sintaxis
Ambigedad
Una gramtica es ambigua si permite que una cadena se convierta en uno o ms rboles sintcticos diferentes. Por ejemplo, la gramtica ambigua, AmbExp, para expresiones con enteros y sustracciones.
AmbEx Integer | AmbExp AmbExp
Esta gramtica permite que una expresin tenga dos interpretaciones distintas en tiempo de ejecucin. Por ejemplo, consideremos el fragmento de programa 2 - 3 - 4.
Sintaxis
Variaciones de BNF para el anlisis sintctico
El BNF extendido (EBNF) fue introducido para simplificar la especificacin de la recursividad en las reglas de gramtica y para introducir la idea de una parte opcional en la parte derecha de una regla.
Expression Term | Expression + Term | Expression -Term Term Factor | Term * Factor | Term / Factor
(*) significa cero o ms apariciones de los smbolos que estn entre llaves { } inmediatamente antes de l. Los corchetes [ y ] encierran una serie de alternativas, de las que debemos elegir una. Para terminar, el asterisco (*) indica que la multiplicacin est entre comillas ('), para distinguirla de la utilizacin metalingstica del asterisco como un operador EBNF.
Los diagramas sintcticos se usan para clarificar el significado de varias construcciones de lenguajes cuando se ensean a los programadores noveles.
La semntica axiomtica
Es particularmente til en la exploracin de las propiedades formales de los programas. A los programadores que deben escribir programas correctos a partir de un conjunto de especificaciones preciso, les resulta particularmente til este estilo semntico.
La semntica denotativa
Es valiosa porque su estilo funcional lleva la definicin semntica de un lenguaje a un nivel alto de precisin matemtica. A travs de ella, los diseadores de lenguajes obtienen una definicin funcional del significado de la elaboracin de cada lenguaje que es independiente de cualquier arquitectura de equipo en particular.
Donde cada vi indica una Variable y cada ti indica su Tipo declarado. Un ejemplo de mapa de tipos para un programa que tiene tres variables declaradas; i y j con tipo int y p con tipo boolean:
tm = {i, int, j, int, ... , p, boolean}
May 15, 2012
Por ejemplo, supongamos que queremos definir la idea de que una lista de declaraciones es vlida si todas sus variables tienen identificadores nicos entre s. Podemos expresar esta idea de manera precisa del siguiente modo:
El entorno es un conjunto de pares que une variables especficas con ubicaciones de memoria. La memoria, es un conjunto de pares que une ubicaciones especficas con valores. Las ubicaciones, en cada caso, son los nmeros naturales N. Por ejemplo, supongamos que tenemos variables i y j con valores 13 y -1. Supongamos que las ubicaciones de memoria estn numeradas en serie comenzando por el 0 y que, las variables i y j estn asociadas con las ubicaciones de memoria 154 y 155.
Aqu, cada vi indica una variable y cada vali indica su valor asignado actualmente. Antes de que el programa comience su ejecucin,
= {v1, undef, v2, undef, ..., vm, undef}.
Tambin utilizamos la expresin (v) para indicar la funcin que recupera el valor de la variable v del estado actual.
Si e es una constante, (e) es sencillamente el valor de esa constante en el dominio semntico subyacente. Si e es una variable, (e) es el valor de esa variable en el estado actual . La segunda convencin de notacin de la semntica operacional es una regla de ejecucin. Una regla de ejecucin tiene la forma
La semntica axiomtica se basa en la nocin de asertos, que es un predicado que describe el estado de un programa en cualquier momento de su ejecucin. El aserto Qm max(a,b) define el significado de la funcin max(a,b). Para demostrar que la el programa calcula realmente la funcin max, hay que demostrar que la expresin lgica Q es equivalente al significado de ese programa. Q es la poscondicin del programa max. La semntica axiomtica permite derivar lgicamente una serie de predicados razonando sobre el comportamiento de cada instruccin individual en el programa. Comenzando por la postcondicin Q y trabajando hacia atrs.
La utilizacin de la semntica denotativa para la definicin del significado tiene ventajas y desventajas. Una ventaja es que podemos utilizar las denotaciones funcionales del significado de un programa como base para especificar un intrprete para el lenguaje. la semntica denotativa es muy utilizada y permite definir el significado de un programa abstracto como una serie de transformaciones de estado resultante de la aplicacin de una serie de funciones M. Estas funciones definen individualmente el significado de cada clase de elementos que nos podemos encontrar en el rbol de sintaxis abstracta de un programa (Program, Block, Conditional, Loop, Assignment, etc.).