Sunteți pe pagina 1din 16

Lenguajes de Programacin FCC-BUAP Primavera 2003

una palabra clave que designa el tipo de enunciado: READ, IF, WHILE, etctera.
El anlisis sintctico durante la traduccin se facilita usando palabras reservadas. La adicin de una nueva palabra reservada al
lenguaje significa que todo programa antiguo que utilice ese identificador como nombre de variable (u otro nombre) ya no es
sintcticamente correcto, no obstante que no ha sido modificado.

Palabras pregonadas. Las palabras pregonadas son palabras opcionales que se insertan en los enunciados para mejorar la
legibilidad. COBOL ofrece muchas opciones de este tipo. Por ejemplo, en el enunciado goto, que se escribe GO TO rtulo, se requiere
la palabra clave GO, pero TO es opcional; no transmite informacin y slo se usa para mejorar la legibilidad.

Comentarios. La inclusin de comentarios en un programa es una parte importante de su documentacin. Un lenguaje puede
permitir comentarios de varias maneras: (1) renglones de comentarios por separado en el programa, como en FORTRAN; (2)
delimitados por marcadores especiales, como los /* y */ de C sin que importen los lmites de rengln; o (3) comenzando en cualquier
punto de un rengln pero ya concluidos al final del mismo, como el - en Ada, / / en C++ o ! en FORTRAN 90.

Espacios en blanco. Las reglas sobre el uso de espacios en blanco varan ampliamente entre los lenguajes. En algunos, los espacios
en blanco no son significativos en cualquier parte excepto en datos literales de cadena de caracteres. Otros lenguajes usan espacios en
blanco como separadores, de modo que desempean un papel sintctico importante.

Delimitadores y corchetes. Un delimitador es un elemento sintctico que se usa simplemente para sealar el principio o el final de
alguna unidad sintctica, como un enunciado o expresin. Los corchetes son delimitadores apareados, por ejemplo, parntesis o
parejas de begin ... end. Los delimitadores se pueden usar simplemente para mejorar la legbildad o simplificar el anlisis sintctico,
pero con ms frecuencia tienen el importante propsito de eliminar ambigedades definiendo explcitamente los lmites de una
construccin sintctica particular.

Formatos de campos libres y fijos. Una sintaxis es de campo libre si los enunciados de programa se pueden escribir en cualquier
parte de un rengln de entrada sin que importe la posicin sobre el rengln o las interrupciones entre renglones. Una sintaxis de
campo fijo utiliza la posicin sobre un rengln de entrada para transmitir informacin. La sintaxis de campo fijo estricta, donde cada
elemento de un enunciado debe aparecer dentro de una parte dada de un rengln de entrada, se observa ms a menudo en lenguajes
ensambladores.

Expresiones. Las expresiones son funciones que acceden a objetos de datos en un programa y devuelven algn valor. Las
expresiones son los bloques sintcticos bsicos de construccin a partir de los cuales se construyen enunciados (y a veces programas).
En lenguajes imperativos como C, las expresiones constituyen las operaciones bsicas que permiten que cada enunciado modifique el
estado de mquina. En lenguajes aplicativos como ML o LISP, las expresiones forman el control bsico de secuencia que dirige la
ejecucin de programas.

Enunciados. Los enunciados constituyen el componente sintctico ms destacado en los lenguajes imperativos. Su sintaxis tiene un
efecto decisivo sobre la regularidad, legibilidad y facilidad de escritura generales del lenguaje. Ciertos lenguajes adoptan un formato
nico de enunciado bsico, mientras que otros emplean diferente sintaxis para cada tipo distinto de enunciado. El primer enfoque hace
nfasis en la regularidad, en tanto que el segundo resalta la legibilidad. La ventaja de usar diversas estructuras sintcticas, por
supuesto, es que se puede hacer que cada una exprese de manera natural las operaciones que intervienen.
Una diferencia ms importante en las estructuras de enunciado es la que existe entre los enunciados estructurados o anidados y los
enunciados simples. Un enunciado simple no contiene otros enunciados incrustados. Un enunciado estructurado puede contener
enunciados incrustados.

Estructura de conjunto de programas y subprogramas

La organizacin sintctica global de las definiciones de programa principal y subprogramas es tan variada como los otros aspectos de
la sintaxis de los lenguajes.

Definiciones individuales de subprogramas. FORTRAN ilustra una organizacin de conjunto en la cual cada definicin de
subprograma se trata como una unidad sintctica individual. Cada subprograma se compila por separado y los programas compilados
se vinculan durante la carga. El efecto de esta organizacin se hace particularmente manifiesto cuando se requiere que cada
subprograma contenga declaraciones completas de todos los elementos de datos, incluso para aquellos que estn en bloques
COMUNES (COMMON) y se comparten con otros subprogramas. Estas declaraciones son necesarias porque se supone una
compilacin por separado. La unidad bsica de subprograma representa una estructura que por lo general proporciona funcionalidad
afn. Por ejemplo, los subprogramas podran representar operaciones de arreglos, operaciones de interfaz de usuario o alguna funcin
interna de procesamiento de datos.

CAP 3 - 1
Lenguajes de Programacin FCC-BUAP Primavera 2003

Definiciones individuales de datos. Un modelo alternativo consiste en agrupar todas las operaciones que manipulan un objeto de
datos determinado. Por ejemplo, un subprograma puede consistir en todas las operaciones que se ocupan de un formato especfico de
datos dentro del programa, operaciones para crear el registro de datos, operaciones para imprimir el registro de datos y operaciones
para cmputo con el registro de datos. Este es el enfoque general del mecanismo de class (clase) en lenguajes como C++ y Smalltalk.

Definiciones de subprograma anidadas. El Pascal ilustra una estructura de programa anidada donde las definiciones de
subprograma aparecen como declaraciones dentro del programa principal y ellas mismas pueden contener otras definiciones de
subprograma anidadas dentro de sus definiciones a cualquier profundidad. Los enunciados estructurados se introducen en primer
trmino para suministrar una notacin natural para las divisiones jerrquicas comunes en la estructura de los algoritmos, pero las
definiciones de subprograma anidadas sirven en vez de ello para proveer un entorno no local de referimiento para subprogramas que
se define durante la compilacin y que, en esta forma, permite la verificacin esttica de datos y la com pilacin de cdigo ejecutable
eficiente para subprogramas que contienen referencias no locales. Sin el anidamiento de definiciones de subprograma, es necesario ya
sea proporcionar declaraciones para variables no locales dentro de cada definicin de subprograma (como se hace en FORTRAN) o
diferir toda la verificacin de tipos para referencias no locales hasta el tiempo de ejecucin. El anidamiento tambin cumple la menos
importante funcin de permitir que los nombres de subprograma tengan un alcance menor que el global.

Definiciones individuales de interfaz. La estructura de FORTRAN permite la fcil compilacin de subprogramas individuales,
pero tiene la desventaja de que los datos que se usan a travs de diferentes subprogramas pueden tener definiciones distintas que el
compilador no podr detectar durante la compilacin. Por otra parte, Pascal permite al compilador tener acceso a todas estas
definiciones para ayudar a encontrar errores, pero tiene la desventaja de que el programa completo, incluso si tiene una longitud de
muchos miles de enunciados, se debe volver a compilar cada vez que se necesita cambiar un solo enunciado. C, ML, y Ada utilizan
aspectos de las dos tcnicas anteriores para mejorar el comportamiento de compilacin. En estos lenguajes, una implementacin de
lenguaje consiste en varios subprogramas que deben interactuar juntos. Todos estos componentes, llamados mdulos, se enlazan entre
s, como en FORTRAN, para crear un programa ejecutable, pero slo es necesario volver a com pilar cada vez los componentes que
han cambiado. Por otra parte, los datos que se pasaron entre los procedimientos de un componente deben tener declaraciones comunes
como en Pascal, lo que permite su verificacin eficiente por parte del compilador. Sin embargo, para pasar informacin entre dos
componentes compilados por separado, se requieren datos adicionales. Esto es manejado por un componente de especificacin del
programa. En C, el enfoque consiste en incluir ciertas operaciones de archivo de sistema operativo en el lenguaje per mitiendo que el
programa incluya archivos que contengan estas definiciones de interfaz. Los archivos ".h" de C constituyen los componentes de
especificacin y los archivos ".c" del programa fuente son los componentes de implementacin. El programa make de UNIX se usa
para determinar cules archivos ".c" y ".h" han sido alterados para recompilar slo los componentes del sistema que han cambiado. En
Ada, el planteamiento consisti en integrar estas caractersticas directamente en el lenguaje. Los programas se definen en
componentes llamados paquetes, los cuales contienen ya sea la especificacin de las definiciones de interfaz o la implementacin del
programa fuente (en el cuerpo del paquete) que va a usar estas definiciones.

Descripciones de datos separadas de enunciados ejecutables. COBOL contiene una forma anticipada de estructura de
componentes. En un programa en COBOL, las declaraciones de datos y los enunciados ejecutables para todos los subprogramas se
dividen en divisiones de datos y divisiones de procedimientos de programa individuales. Una tercera divisin de entorno consiste en
declaraciones que conciernen al entorno externo de operacin. La divisin de procedimientos de un programa se organiza en
subunidades que corresponden a cuerpos de subprograma, pero todos los datos son globales para todos los subprogramas, y nada hay
que corresponda a los datos locales comunes de un subprograma. La ventaja de la divisin centralizada de datos que contiene todas las
declaraciones de datos, es que hace valer la independencia lgica de los formatos de datos y los algoritmos de la divisin de
procedimientos. Tambin es conveniente tener las descripciones de datos reunidas en un lugar en vez de dispersas por todos los
subprogramas.

Definiciones de subprograma no separadas. SNOBOL4 representa el extremo en cuanto a organizacin (o falta de organizacin)
de conjunto de programas. No se hace distincin sintctica alguna en SNOBOL4 entre los enunciados del programa principal y los
enunciados de subprograma. Un programa, sin considerar el nmero de subprogramas que contiene, es sintcticamente slo una lista
de enunciados. Los puntos donde los subprogramas comienzan y terminan no se distinguen sintcticamente. Los programas
simplemente se ejecutan y la ejecucin de una llamada de funcin inicia un nuevo subprograma; la ejecucin de una funcin
RETURN (devolver) termina un subprograma. El comportamiento del programa es totalmente dinmico. De hecho, cualquier
enunciado puede ser parte del programa principal y tambin parte de cualquier nmero de subprogramas al mismo tiempo, en el
sentido de que se puede ejecutar en un punto durante la ejecucin del programa principal y ms tarde volverse a ejecutar como parte.
de la ejecucin de un subprograma. Esta organizacin ms bien catica del programa es valiosa slo en cuanto a que permite
traduccin en tiempo de ejecucin y ejecucin de nuevos enunciados y subprogramas con mecanismos relativamente sencillos.

CAP 3 - 2
Lenguajes de Programacin FCC-BUAP Primavera 2003
ETAPAS DE TRADUCCIN

El proceso de traduccin de un programa, de su sintaxis original a una forma ejecutable, es medular en toda implementacin de
lenguajes de programacin. La traduccin puede ser bastante sencilla, como en el caso de los programas en Prolog o LISP, pero, con
frecuencia, el proceso puede ser bastante complejo. Casi todos los lenguajes se podran implementar con slo una traduccin trivial si
uno estuviera dispuesto a escribir un intrprete de software y a aceptar velocidades lentas de ejecucin. En la mayora de los casos, sin
embargo, la ejecucin eficiente es un objetivo tan deseable que se hacen esfuerzos importantes para traducir los programas a
estructuras ejecutables con eficiencia, en especial cdigo de mquina interpretable por hardware. El proceso de traduccin se vuelve
gradualmente ms complejo a medida que la forma ejecutable del programa se aleja ms en cuanto a estructura respecto al programa
original. En el extremo, un compilador optimizador para un lenguaje complejo como Ada puede alterar de manera radical las
estructuras del programa para obtener una ejecucin ms eficiente. Estos compiladores se cuentan entre los programas ms complejos
que existen.
Desde el punto de vista lgico, la traduccin se puede dividir en dos partes principales: el anlisis del programa fuente de entrada
y la sntesis del programa objeto ejecutable. Dentro de cada una de estas partes existen divisiones adicionales, como se ver en
seguida. En casi todos los traductores, estas etapas lgicas no estn claramente separadas, sino que se mezclan de manera que se
alterna el anlisis con la sntesis, a menudo sobre la base de enunciado por enunciado. La figura 3.1 ilustra la estructura de un
compilador tpico.

Fig. 3.1 Estructura de un Compilador

Los traductores se agrupan en forma burda de acuerdo con el nmero de pasos que efectan sobre el programa fuente. El
compilador estndar (si es que se puede usar ese trmino) emplea tpicamente dos pasos sobre el programa fuente. El primer paso de
anlisis descompone el programa en los componentes que lo constituyen y obtiene informacin, como el uso de nombres de variable
del programa. El segundo paso genera tpicamente un programa objeto a partir de esta informacin recogida.
Si la velocidad de compilacin es importante (como en un compilador educativo), se puede emplear una estrategia de un paso. En
este caso, conforme el programa se analiza, se convierte de inmediato en cdigo objeto. Pascal fue proyectado de modo que se pudiera
desarrollar un compilador de un paso para el lenguaje. Sin embargo, si la velocidad de ejecucin tiene mxima importancia, se puede
desarrollar un compilador de tres pasos (o ms). El primer paso analiza el programa fuente, el segundo paso reescribe el programa

CAP 3 - 3
Lenguajes de Programacin FCC-BUAP Primavera 2003
fuente en una forma ms eficiente usando diversos algoritmos de optimizacin bien definidos, y el tercer paso genera el cdigo objeto.
Conforme la tecnologa de compiladores ha mejorado, la relacin entre el nmero de pasos y la velocidad del compilador ha perdido
claridad. Lo que es ms importante es la complejidad del lenguaje ms que el nmero de pasos que se necesitan para analizar el
programa fuente.

Anlisis del programa fuente

Para un traductor, el programa fuente se presenta inicialmente como una serie larga y no diferenciada de smbolos, compuesta de
miles o decenas de miles de caracteres. Desde luego, un programador que ve un programa as lo estructura casi de inmediato en
subprogramas, enunciados, declaraciones, etc. Para el traductor nada de esto es manifiesto. Durante la traduccin se debe construir
laboriosamente, carcter por carcter, un anlisis de la estructura del programa.

Anlisis lxico. La fase fundamental de cualquier traduccin es agrupar esta serie de caracteres en sus constituyentes elementales:
identificadores, delimitadores, smbolos de operadores, nmeros, palabras clave, palabras pregonadas, espacios en blanco,
comentarios, etc. Esta fase se conoce como anlisis lxico, y las unidades bsicas de programa que resultan del anlisis lxico se
llaman elementos (o componentes) lxicos. Tpicamente, el analizador lxico (o revisor) es la rutina de entrada para el traductor; lee
renglones sucesivos del programa de entrada, los descompone en elementos lxicos individuales y alimenta estos elementos lxicos a
las etapas posteriores del traductor para su uso en los niveles superiores de anlisis. El analizador lxico debe identificar el tipo de
cada elemento lxico (nmero, identificador, delimitador, operador, etc.) y adjuntar una marca de tipo. Adems, se suele hacer la
conversin a una representacin interna de elementos como nmeros (que se convierten a forma binaria interna de punto fijo o
flotante) e identificadores (que se guardan en una tabla de smbolos y se usa la direccin de la entrada de la tabla de smbolos en lugar
de la cadena de caracteres). El modelo bsico que se usa para proyectar analizadores lxicos es el autmata de estados finitos, el cual
se describe en forma breve mas adelante.
Si bien el concepto de anlisis lxico es sencillo, esta fase de la traduccin suele requerir una mayor proporcin del tiempo de
traduccin que cualquier otra. Este hecho se debe en parte simplemente a la necesidad de explorar y analizar el programa fuente
carcter por carcter. Tambin es cierto que en la prctica a veces es difcil determinar dnde se encuentran los lmites entre elementos
lxicos sin algoritmos bastante complejos y dependientes del contexto. Por ejemplo, los dos enunciados en FORTRAN:

DO 10 I = 1,5 y DO 10 I = 1.5

tienen estructuras lxicas completamente distintas. El primero es un enunciado DO y el segundo es una asignacin, pero este hecho no
se puede descubrir sino hasta que se lee el carcter ya sea , o ., puesto que FORTRAN no toma en cuenta los espacios en blanco.

Anlisis sintctico. La segunda etapa de la traduccin es el anlisis sintctico (parsing). En ella se identifican las estructuras de
programa ms grandes (enunciados, declaraciones, expresiones, etc.) usando los elementos lxicos producidos por el analizador
lxico. El anlisis sintctico se alterna ordinariamente con el anlisis semntico. Primero, el analizador sintctico identifica una serie
de elementos lxicos que forman una unidad sintctica como una expresin, enunciado, llamada de subprograma o declaracin. Se
llama entonces a un analizador semntico para que procese esta unidad. Por lo comn, el analizador sintctico y el semntico se comu -
nican usando una pila. El analizador sintctico introduce en la pila los diversos elementos de la unidad sintctica hallada, y el
analizador semntico los recupera y los procesa. Gran cantidad de investigacin se ha enfocado al descubrimiento de tcnicas
eficientes de anlisis sintctico, en particular tcnicas basadas en el uso de gramticas formales.

Anlisis semntico. El anlisis semntico es tal vez la fase medular de la traduccin. Aqu, se procesan las estructuras sintcticas
reconocidas por el analizador sintctico y la estructura del cdigo objeto ejecutable comienza a tomar forma. El anlisis semntico es,
por tanto, el puente entre las partes de anlisis y de sntesis de la traduccin. En esta etapa tambin ocurre un cierto nmero de otras
funciones subsidiarias importantes, entre ellas el mantenimiento de tablas de smbolos, la mayor parte de la deteccin de errores, la
expansin de macros y la ejecucin de enunciados de tiempo de compilacin. El analizador semntico puede producir en efecto el
cdigo objeto ejecutable en traducciones sencillas, pero es ms comn que la salida de esta etapa sea alguna forma interna del
programa ejecutable final, la cual es manipulada luego por la etapa de optimizacin del traductor antes que se genere efectivamente
cdigo ejecutable.
El analizador semntico se divide ordinariamente en un conjunto de analizadores semnticos ms pequeos, cada uno de los cuales
maneja un tipo particular de construccin de programa. Los analizadores semnticos interactan entre ellos mismos a travs de
informacin que se guarda en diversas estructuras de datos, en particular en la tabla central de smbolos. Por ejemplo, un analizador
semntico que procesa declaraciones de tipo para variables sencillas suele poder hacer poco ms que introducir los tipos declarados en
la tabla de smbolos. Un analizador semntico posterior que procesa expresiones aritmticas puede usar luego los tipos declarados para
generar las operaciones aritmticas apropiadas especficas de tipo para el cdigo objeto. Las funciones exactas de los analizadores
semnticos varan considerablemente, segn el lenguaje y la organizacin lgica del traductor. Algunas de las funciones ms comunes
se pueden describir como sigue:

CAP 3 - 4
Lenguajes de Programacin FCC-BUAP Primavera 2003

1 . Mantenimiento de tablas de smbolos. Una tabla de smbolos es una de las estructuras de datos medulares de todo traductor. La
tabla de smbolos contiene tpicamente una entrada por cada identificador diferente encontrado en el programa fuente. El
analizador lxico efecta las introducciones iniciales conforme explora el programa de entrada, pero los analizadores semnticos
tienen la responsabilidad principal a partir de ese momento. La entrada de tabla de smbolos contiene ms que slo el identificador
mismo; contiene datos adicionales respecto a los atributos de ese identificador: su tipo (variable simple, nombre de arreglo,
nombre de subprograma, parmetro formal, etc.), tipo de valores (enteros, reales, etc.), entorno de referimiento, y cualquier otra
informacin disponible a partir del programa de entrada a travs de declaraciones y uso. Los analizadores semnticos introducen
esta informacin en la tabla de smbolos conforme procesan declaraciones, encabezados de programa y enunciados de programa.
Otras partes del traductor usan esta informacin para construir cdigo ejecutable eficiente. La tabla de smbolos de los traductores
para lenguajes compilados se suele desechar al final de la traduccin. Sin embargo, puede retenerse durante la ejecucin, por
ejemplo, en lenguajes que permiten crear nuevos identificadores durante la ejecucin o como ayuda para la depuracin. Todas las
implementaciones de ML, Prolog y LISP utilizan una tabla de smbolos creada inicialmente durante la traduccin como una
estructura de datos central definida por el sistema en tiempo de ejecucin. Dbx es un programa de UNIX que utiliza una tabla de
smbolos en tiempo de ejecucin para depurar programas en C.

2. Insercin de informacin implcita. A menudo, en los programas fuente, la informacin est implcita y debe hacerse explcita en
los programas objeto de nivel ms bajo. La mayor parte de esta informacin implcita se sita abajo del encabezado de
convenciones predeterminadas, interpretaciones que se proveen cuando el programador proporciona una especificacin no
explcita. Por ejemplo, una variable en FORTRAN que se usa pero no se declara se provee automticamente de una declaracin
tipo que depende de la inicial de su nombre.

3. Deteccin de errores. Los analizadores sintcticos y semnticos deben estar preparados para manejar programas tanto incorrectos
como correctos. En cualquier punto, el analizador lxico puede enviar al analizador sintctico un elemento sintctico que no encaja
en el contexto circundante (por ejemplo, un delimitador de enunciado en medio de una expresin, una declaracin a la mitad de
una serie de enunciados, un smbolo de operador donde se espera un identificador). El error puede ser ms sutil, como una variable
real donde se requiere una variable entera o una referencia de variable de subndice con tres subndices cuando se declar que el
arreglo tena dos dimensiones. En cada paso de la traduccin puede ocurrir una multitud de errores de este tipo. El analizador
semntico no slo debe reconocer estos errores cuando se presentan y generar un mensaje de error apropiado, sino tambin, en
todos los casos excepto en los ms drsticos, determinar la manera apropiada de continuar con el anlisis sintctico del resto del
programa.

4. Procesamiento de macros y operaciones en tiempo de compilacin. No todos los lenguajes incluyen capacidades para macros o
recursos para operaciones en tiempo de compilacin. Cuando estn presentes, sin embargo, el procesamiento se maneja comn -
mente durante el anlisis semntico. Una macro, en su forma ms sencilla, es un trozo de texto de programa que se ha definido por
separado y que se va a insertar en el programa durante la traduccin siempre que se encuentre una llamada de macro en el
programa fuente. As pues, una macro se parece mucho a un subprograma, excepto que en vez de traducirla y llamarla durante la
ejecucin (es decir, el enlace del nombre del subprograma con su semntica tiene lugar en tiempo de ejecucin), su cuerpo se
sustituye simplemente por cada llamada durante la traduccin del programa (es decir, el enlace ocurre en tiempo de traduccin).
Las macros pueden ser slo simples cadenas que se van a sustituir, por ejemplo, la sustitucin de 3.1416 por PI siempre que se
hace referencia a PI. Es ms comn que se parezcan mucho a los subprogramas, con parmetros que se deben procesar antes que se
haga la sustitucin de la llamada de macro.

Cuando se permiten macros, los analizadores semnticos deben identificar la llamada de macro. dentro del programa fuente y
establecer la sustitucin apropiada de la llamada por el cuerpo de la macro. Esta tarea suele hacer necesario interrumpir a los analiza-
dores lxico y sintctico y ponerlos a trabajar analizando la cadena que representa el cuerpo de la macro antes de continuar con el
resto de la cadena fuente. Alternativamente, el cuerpo de la macro puede haber sido ya parcialmente traducido, de modo que el ana -
lizador semntico puede procesarlo directamente insertando el cdigo objeto apropiado y asentando las entradas de tabla apropiadas
antes de continuar con el anlisis del programa fuente.
Una operacin en tiempo de compilacin es una operacin que se va a llevar a cabo durante la traduccin para controlar la
traduccin del programa fuente. C suministra un cierto nmero de operaciones de esta clase. La "#define" de C permite evaluar las
constantes o expresiones antes de compilar el programa. La construccin "#ifdef" (si se define) permite compilar secuencias
alternativas de cdigo de acuerdo con la presencia o ausencia de ciertas variables. Estos conmutadores permiten al programador alterar
el orden de los enunciados que se compilan. Por ejemplo, un archivo fuente comn se puede usar para compilar versiones alternativas
de un programa, como se muestra:

#define pc /* Fijar a versin PC o UNIX del programa */


ProgramWrite(...
#ifdef pc /* Si se define entonces se necesita cdigo PC

CAP 3 - 5
Lenguajes de Programacin FCC-BUAP Primavera 2003
/* Hacer cdigo de versin PC */
/* p. ej. escribir salida Windows Microsoft
#else
/* Hacer cdigo de versin UNIX */
/* p. ej. escribir salida Windows Motif X
#endif'

Sntesis del programa objeto

Las etapas finales de la traduccin se ocupan de la construccin del programa ejecutable a partir de las salidas que produce el
analizador semntico. Esta fase implica necesariamente generacin de cdigo y tambin puede incluir optimizacin del programa
generado. Si los subprogramas se traducen por separado, o si se emplean subprogramas de biblioteca, se necesita una etapa final de
vinculacin y carga para producir el programa completo listo para ejecutarse.

CAP 3 - 6
Optimizacin. El analizador semntico produce ordinariamente como salida el programa ejecutable
traducido representado en algn cdigo intermedio, una representacin interna como una cadena de
operadores y operandos o una tabla de series de operador/operando. A partir de esta representacin interna, los
generadores de cdigo pueden crear el cdigo objeto de salida con el formato apropiado. Sin embargo, antes
de la generacin de cdigo, se lleva a cabo ordinariamente cierta optimizacin del programa en la
representacin interna. Tpicamente, el analizador semntico genera la forma del programa interno de manera
irregular, conforme se analiza cada segmento del programa de entrada. El analizador semntico no tiene que
preocuparse en general acerca del cdigo circundante que ya se ha generado. Al elaborar esta salida poco
sistemtica, sin embargo, se puede producir cdigo extremadamente deficiente; por ejemplo, un registro
interno se puede guardar al final de un segmento generado y volverse a cargar de inmediato, a partir de la
misma localidad, al principio del prximo segmento. Por ejemplo, el enunciado: A=13+C+D puede generar el
cdigo intermedio:

(a) Templ = B + C
(b) Temp2 = Templ + D
(c) A = Temp2

el cual puede generar el cdigo sencillo aunque ineficiente:

1. Cargar registro con B (a partir de (a))


2. Sumar C al registro
3. Guardar registro en Templ
4. Cargar registro con Templ (a partir de (b))
5. Sumar D al registro
6. Guardar registro en Temp2
7. Cargar registro con Temp2 (a partir de (c))
8. Guardar registro en A

Las instrucciones 3 y 4, as como las 6 y 7, son redundantes, puesto que todos los datos se pueden
conservar en el registro antes de guardar el resultado en A. Suele ser deseable permitir que los analizadores
semnticos generen secuencias de cdigo deficientes y luego, durante la optimizacin, reemplazar estas
secuencias por otras mejores que evitan ineficiencias obvias.
Muchos compiladores van mucho ms all de esta clase de optimizacin simple y analizan el programa en
busca de otras mejoras susceptibles de llevarse a cabo, por ejemplo, cmputo de subexpresiones comunes una
sola vez, eliminacin de operaciones con constantes de las iteraciones, optimizacin del uso de registros
internos y del clculo de frmulas de acceso a arreglos.

Generacin de cdigo. Despus que se ha optimizado el programa traducido en la representacin interna,


se debe transformar en los enunciados en lenguaje ensamblador, cdigo de mquina u otra forma de programa
objeto que va a constituir la salida de la traduccin. Este proceso implica dar el formato apropiado a la salida
con base en la informacin que contiene la representacin interna del programa. El cdigo de salida puede ser
directamente ejecutable o puede haber otros pasos de traduccin por seguir, por ejemplo, ensamblado o
vinculacin y carga.

Vinculacin y carga. En la etapa final optativa de la traduccin, los fragmentos de cdigo que son
resultado de las traducciones individuales de subprogramas se funden en el programa final ejecutable. La
salida de las fases de traduccin precedentes consiste tpicamente en programas ejecutables en una forma casi
final, excepto cuando los programas hacen referencia a datos externos u otros subprogramas. Estas
ubicaciones incompletas en el cdigo se especifican en las tablas de cargador anexas que produce el traductor.
El cargador vinculador (o editor de vnculos) carga los diversos segmentos de cdigo traducido en la memoria
y luego usa las tablas de cargador anexas para vincularlos correctamente entre s introduciendo datos y direc -
ciones de subprograma en el cdigo segn se requiere. El resultado es el programa ejecutable final listo para
usarse.
MODELOS FORMALES DE TRADUCCION

La definicin formal de la sintaxis de un lenguaje de programacin se conoce ordinariamente como una


gramtica, en analoga con la terminologa comn para los lenguajes naturales. Una gramtica se compone de
un conjunto de reglas (llamadas producciones) que especifican las series de caracteres (o elementos lxicos)
que forman programas permisibles en el lenguaje que se est definiendo. Una gramtica formal es
simplemente una gramtica que se especifica usando una notacin definida de manera estricta. Las dos clases
de gramticas tiles en tecnologa de compiladores incluyen la gramtica BNF (o gramtica libre del
contexto) y la gramtica normal.

Gramticas BNF

Cuando se considera la estructura de una oracin en espaol, se le describe por lo general como una
secuencia de categoras. Es decir, una oracin sencilla se suele dar como. sujeto / verbo / complemento de lo
cual son ejemplos:
La nia / corri / a casa.
El muchacho / prepara / la comida.

Cada categora se puede dividir an ms. En los ejemplos anteriores, el sujeto est representado por
artculo y nombre, por lo que la estructura de estas oraciones es:

artculo / nombre / verbo / complemento

Existen otras estructuras de oracin posibles adems de las declarativas simples que se han citado. Las
oraciones interrogativas (preguntas) simples suelen tener esta sintaxis:

verbo auxiliar / sujeto / predicado


como en:
Estaba / la nia / corriendo a casa?
Est / el muchacho / preparando la comida?

Podemos representar estas oraciones por un conjunto de reglas. Podemos decir que una oracin puede ser
una oracin declarativa simple o una oracin interrogativa simple, o, de manera notativa, como:

<oracin> ::= <declarativa> | <interrogativa>

donde ::= significa "se define como" y | significa "o". Cada tipo de oracin se puede definir adicionalmente
como:

<declarativa> := <sujeto> <verbo> <complemento).


<sujeto> ::= <artculo> <nombre>
<interrogativa>::= <verbo auxiliar) <sujeto> <predicado>?

Esta notacin especfica se conoce como BNF (Backus Naurform; forma de Backus Naur) y fue
desarrollada para la definicin sintctica de ALGOL por John Backus a finales de la dcada de 1950 como
una forma de expresar estas ideas para lenguajes de programacin. Peter Naur era presidente del comit que
desarroll ALGOL. Al mismo tiempo, el lingista Noam Chomsky desarroll una forma gramatical similar, la
gramtica libre del contexto para la definicin de la sintaxis de lenguajes naturales. La BNF y la gramtica
libre del contexto son equivalentes; las diferencias corresponden slo a la notacin. Por esta razn, los
trminos gramtica BNF y gramtica libre del contexto son ordinariamente intercambiables en el estudio de
la sintaxis.

Sintaxis

Una gramtica BNF se compone de un conjunto finito de reglas de gramtica BNF, las cuales definen un
lenguaje, que en nuestro caso es un lenguaje de programacin. Puesto que la sintaxis se ocupa slo de la
forma y no del significado, un lenguaje (de programacin), considerado desde el punto de vista sintctico, se
compone de un conjunto de programas sintcticamente correctos, cada uno de los cuales es simplemente una
serie de caracteres. Un programa sintcticamente correcto no necesita tener sentido semnticamente; por
ejemplo, si se ejecutara, no tendra que computar algo til, o nada en absoluto, para el caso. Por ejemplo,
considerando nuestras oraciones declarativas e interrogativas simples precedentes, la sintaxis
<sujeto><verbo><complemento> tambin se satisface con la secuencia:

La casa /corri / a nia

que no tiene sentido con las interpretaciones normales de estas palabras.


En el caso de la sintaxis de lenguajes de programacin, esta falta de preocupacin por el significado se
lleva un paso ms adelante: Un lenguaje es cualquier conjunto de cadenas de caracteres (de longitud finita)
con caracteres elegidos de algn alfabeto finito fijo de smbolos. Bajo esta definicin, todos los siguientes son
lenguajes:

1. El conjunto de todos los enunciados de asignacin en C


2. El conjunto de todos los programas en C
3. El conjunto de todos los tomos en LISP
4. El conjunto compuesto de secuencias de letras a y b donde todas las a anteceden a todas las b (por
ejemplo, ab, aab, abb, ...)

Un lenguaje puede consistir en slo un conjunto finito de cadenas (por ejemplo, el lenguaje compuesto de
todos los delimitadores de Pascal: begin, end, if, then, etc.), o puede contener un nmero infinito de cadenas
(por ejemplo, la cadena de letras a y b dada como nmero 4 en la lista anterior). La nica restriccin a un
lenguaje es que cada cadena que contenga debe ser de longitud finita e incluir caracteres elegidos de algn
alfabeto finito fijo de smbolos.
El estudio de la lista anterior de lenguajes de muestra indica algunos de los problemas en el uso del
lenguaje natural (espaol en este caso) para describir lenguajes de programacin. Considrese una vez ms el
nmero 4. Es b por s misma un miembro de este lenguaje? Es verdad que todas las a (ninguna en este caso)
anteceden a todas las b de la cadena, pero, debe una cadena contener al menos una a? De manera similar,
est a por s misma en el lenguaje? Tal como se ha expresado, la descripcin es incompleta.
Este problema se resuelve proporcionando un conjunto matemtico formal de reglas para determinar con
exactitud cules cadenas estn en el lenguaje. En el caso ms sencillo, una regla gramatical puede
simplemente enumerar los elementos de un lenguaje finito. Por ejemplo:

<digito> ::= 0 |1 |2 |3 |4 |5|6 |7 |8|9

Esta regla define un lenguaje compuesto de las 10 cadenas de un solo carcter 0, 1, 2, 3, 4, 5, 6, 7, 8 y 9


enumerando un conjunto de alternativas. La regla gramatical precedente se lee como "Un digito es ya sea un
'0' o un 'l' o un '2' ... o un 0. El trmino dgito se conoce como una categora sintctica o un no terminal;
sirve como nombre para el lenguaje que define la regla gramatical. Los smbolos que componen cadenas en
nuestro lenguaje, en este caso los dgitos del 0 al 9, se llaman smbolos terminales o tokens. El smbolo ::= se
suele dar como --->, en especial si las categoras sintcticas se escriben como letras maysculas solas (por
ejemplo, la regla <X> ::= <B> | <C> se suele escribir como X ---> B | C ).
Una vez que se ha definido un conjunto bsico de categoras sintcticas, se pueden usar para construir
cadenas ms complejas. Por ejemplo, la regla:

<enunciado condicional> ::=


lf <expresin booleana> then <enunciado>
else <enunciado) |
lf <expresin booleana) then <enunciado>

define el lenguaje compuesto de construcciones de <enunciado condicional> y que emplea las categoras
sintcticas <expresin booleana) y <enunciado>, las cuales se deben definir a su vez usando otras reglas
gramaticales. Obsrvese que la regla anterior muestra dos formas alternativas de enunciado condicional
(separadas por el smbolo | ). Cada alternativa se construye a partir de la concatenacin de varios elementos,
que pueden ser cadenas literales (por ejemplo, if o else) o categoras sintcticas. Cuando se designa una
categora sntctica, significa que en ese punto se puede usar cualquier cadena del sublenguaje definida por
esa categora.. Por ejemplo, si se supone que expresin booleana consiste en un conjunto de cadenas que
representan expresiones booleanas vlidas, la regla anterior permite insertar cualquiera de estas cadenas entre
el if y el then de un enunciado condicional.
La categora sintctica que define la regla puede usarse ella misma en esa regla para especificar repeticin.
Esta clase de regla se conoce como regla recursiva. Por ejemplo, la regla recursiva:

<entero sin signo> ::= <digito> | <entero sin signo><digito>

define un entero sin signo como una serie de dgitos. La primera alternativa de <digito> define un entero sin
signo como un solo dgito, mientras que la segunda alternativa agrega un segundo dgito a este dgito inicial,
un tercer dgito al segundo, y as sucesivamente.
Una gramtica BNF completa es tan solo un conjunto de esta clase de reglas gramaticales, las cuales
definen en conjunto una jerarqua de sublenguajes que conduce a la categora sintctica de nivel mximo, la
cual, para un lenguaje de programacin, es por lo comn la categora sintctica <programa>. A continuacion
se ilustra una gramtica ms compleja que define la sintaxis de una clase de enunciados de asignacin
simples, la cual supone que ya se han definido las categoras sintcticas bsicas <identificador) y <nmero>.

<enunciado de asignacin> ::= <variable> = <expresin aritmtica>


<expresin aritmtica> ::= <trmino> | <expresin aritmtica> + <trmino>
<expresin aritmtica) - <trmino>
<trmino> ::= <factor) <trmino> * <factor> | <trmino>|
<factor>
<factor> ::= <variable> <nmero> | <expresin aritmtica>
<variable> ::= <identificador> | <identificador> [<lista de subndices>]
<lista de subndices> ::= <expresin aritmtica> | <lista de subndices>, <expresin
aritmtica>

Listado 3.1 Notacion BNF para enunciados de asignacin simples


Arboles de anlisis sintctico

El uso de una gramtica formal para definir la sintaxis de un lenguaje de programacin es importante tanto
para el usuario del lenguaje como para el implementador del mismo. El usuario puede consultarla para
responder preguntas sutiles acerca de forma, puntuacin y estructura del programa. El implementador puede
usarla para determinar todos los casos posibles de estructuras de programa de entrada que se permiten y, en
esta forma, con cul de ellas puede tener que vrselas el traductor. Y tanto el programador como el
implementador tienen una definicin comn acordada que se puede usar para dirimir disputas acerca de
construcciones sintcticas permisibles. Una definicin sintctica formal tambin ayuda a eliminar diferencias
sintcticas menores entre implementaciones de un lenguaje.
Para determinar si una cadena dada representa de hecho un programa sintcticamente vlido en el lenguaje
definido por una gramtica BNF, se deben usar las reglas gramaticales para construir un anlisis sintctico de
la cadena. Si la cadena se puede analizar sintcticamente en forma satisfactoria, entonces est en el lenguaje.
Si no se puede encontrar alguna forma de analizar sintacticamente la cadena con las reglas gramaticales
dadas, entonces la cadena no esta en el lenguaje. En la figura 3.2 se ilustra el rbol de Anlisis Sintctico
resultante del anlisis sintctico del enunciado W = Y + (U + V) usando la gramatica BNF para enunciados de
asignacin simples ( Listado 3.1).
Una gramtica BNF asigna una estructura (un rbol) a cada cadena que esta en el lenguaje definido por la
gramtica, como se ve en la figura 3.2. Cada hoja del rbol de anlisis sintctico es un solo carcter o
elemento lxico de la cadena de entrada. Cada punto intermedio de bifurcacin del rbol est marcado con
una categora sintctica que designa la clase a la cual pertenece el subrbol que est abajo de l. El nodo raz
del rbol est marcado con la categora sintctica que designa al lenguaje completo, en este caso la categora
(enunciado de asignacin).

Figura 3.2. rbol de anlisis sintctico para un enunciado de asignacin.

La gramtica BNF, a pesar de su estructura simple, se puede usar para definir la sintaxis de casi todos los
lenguajes de programacin. Las reas de sintaxis que no pueden definirse con una gramtica BNF son
aquellas que implican dependencia contextual. Por ejemplo, las restricciones "el mismo identificador no se
puede declarar dos veces en el mismo bloque", "todo identificador se debe declarar en algn bloque que
encierre el punto de su uso", y "un arreglo para el que se ha declarado que tiene dos dimensiones no puede ser
referido con tres subndices" son todas no especificables usando slo una gramtica BNF. Las restricciones de
este tipo se deben definir por medio de un apndice a la gramtica BNF formal.

Extensiones a la notacin BNF

Las gramticas BNF, no son adecuadas para representar construcciones sintcticas de elementos
optativos, elementos alternativos y elementos repetidos dentro de una regla gramatical. Por lo que se requiere
una notacion mas versatil.

Notacin BNF extendida. Para ampliar la BNF, las extensiones de notacin siguientes no modifican el
poder de la gramtica BNF pero dan cabida a descripciones ms fciles de los lenguajes:

Se puede indicar un elemento optativo encerrando el elemento entre parntesis rectangulares, [ ... ].

Una seleccin de alternativas puede usar el simbolo | dentro de una sola regla, opconalmente
encerrado entre parntesis ( [ , ] ) si es necesario.

Una serie arbitraria de casos de un elemento se puede indicar encerrando el elemento entre llaves
seguidas de un asterisco, { ... }*.

Son ejemplos de esta notacin:

enteros con signo: <entero con signo> ::= [ + | - ]<dgito>{<dgito>}*


identificador: <identificador>::= <letra>{<letra> | <digito>>}*

Como un ejemplo ms, las expresiones aritmticas, como las que se describen en Listado 3.1, se pueden
describir de manera ms intuitiva usando BNF extendida. Las reglas como:

<expresin aritmtica> ::= <trmino> | <expresin aritmtica> + <trmino>

reflejan la relacin de que una expresin aritmtica es en realidad un nmero arbitrario de trminos y se puede
expresar usando BNF extendida como:

<expresin aritmtica> ::= <trmino> { + <trmino>}*

La expresin gramatical completa se puede replantear en BNF extendida como se muestra en el Listado 3.2

<enunciado de asignacin> ::= <variable> = <expresin aritmtica>


<expresin aritmtica> ::= <trmino>{ [ + | - ]<trmino> }*
<trmino> ::= <factor> { [ | / ]<factor>}*
<factor> ::= <variable> | <nmero> | <expresin aritmtica>
<variable> ::= <identificador> | <identificador> [<lista de
subndices>]
<lista de subndices> ::= <expresin aritmtica> {, <expresin
aritmtica>}*

Listado 3.2. BNF extendida para enunciados de asignacin simples.


.
Diagramas de sintaxis. Un diagrama de sintaxis es una forma grfica de expresar reglas de BNF extendida.
Cada regla est representada por un camino que va de la entrada a la izquierda a la salida a la derecha.
Cualquier trayecto vlido de entrada a salida representa una cadena generada por esa regla. Si representamos
las otras reglas con cuadros y los smbolos terminales con crculos, podernos representar la gramtica del
listado 3.2 con los diagramas de sintaxis de la figura 3.3.
Por ejemplo, la produccin <trmino> es satisfecha por cualquier camino que pase a travs de <factor> y
salga por la derecha, o pase a travs de <factor>, luego forme una iteracin o ms a travs de uno de los
operadores y despus pase de nuevo a travs de <factor>, es decir, la regla de BNF extendida:

<trmino> ::= <factor> { [ | / ] <factor> }*

Modelado semntico

Un manual para un lenguaje de programacin debe definir el significado de cada construccin en el


lenguaje, tanto sola como en conjunto con otras construcciones de lenguaje. El problema es bastante parecido
al problema de definicin de sintaxis. Un lenguaje suministra una variedad de construcciones diferentes, y
tanto el usuario como el implementador del lenguaje requieren una definicin precisa de cada construccin. El
programador necesita la definicin para poder escribir programas correctos y para ser capaz de predecir el
efecto de la ejecucin sobre cualquier enunciado del programa. El implementador necesita la definicin para
poder construir una implementacin correcta del lenguaje.

Figura 3.3. Diagramas de sintaxis para enunciados de asignacin simples.

En casi todos los manuales de lenguajes, la definicin de semntica se da en prosa ordinaria. Tpicamente,
se da una regla (o conjunto de reglas) de una BNF u otra gramtica formal para definir la sintaxis de una
construccin, y luego se proporcionan unos cuantos prrafos y algunos ejemplos para definir la semntica. Por
desgracia, la prosa suele tener un significado ambiguo, de manera que los diferentes lectores se llevan
distintas interpretaciones de la semntica de una construccin de lenguaje. Un programador puede entender
mal lo que un programa va a hacer cuando se ejecute, y un implementador puede implementar una
construccin de manera diferente que otros implementadores del mismo lenguaje. Como en el caso de la
sintaxis, se necesita algn mtodo para proporcionar una definicin legible, precisa y concisa de la semntica
de un lenguaje completo.
El problema de la definicin semntica ha sido objeto de estudio terico durante tanto tiempo como el
problema de la definicin sintctica, pero ha sido mucho ms difcil encontrar una solucin satisfactoria. Se
han desarrollado muchos mtodos diferentes para la definicin formal de la semntica. Los siguientes son
algunos de ellos:
Modelos gramaticales. En algunos de los primeros intentos para agregar semntica a un lenguaje de
programacin intervino la adicin de extensiones a la gramtica BNF que defina el lenguaje. Dado un rbol
de anlisis sintctico para un programa, se poda extraer informacin adicional de ese,rbol. En breve se
analizarn las gramticas de atributos como una forma de extraer esta informacin adicional.

Modelos imperativos u operativos. Una definicin operativa de un lenguaje de programacin es una


definicin que especifica cmo se ejecutan los programas en el lenguaje en una computadora virtual.
Tpicamente, la definicin de la computadora virtual corresponde a la de un autmata. El autmata tiene un
estado interno que corresponde al estado interno de un programa cuando se est ejecutando; es decir, el estado
contiene todos los valores de las variables, el programa ejecutable mismo y las diversas estructuras de datos
de mantenimiento definidas por el sistema. Se usa un conjunto de operaciones formalmente definidas para
especificar cmo puede cambiar el estado interno del autmata, en correspondencia con la ejecucin de una
instruccin del programa. Una segunda parte de la definicin especifica cmo se traduce un texto de programa
a un estado inicial para el autmata. A partir de este estado inicial, las reglas que definen el autmata
especifican cmo pasa el autmata de un estado a otro hasta que se alcanza un estado final. Una definicin
operativa de un lenguaje de programacin como sta puede representar una abstraccin bastante directa de
cmo se podra implementar efectivamente el lenguaje, o puede representar un modelo ms abstracto que
podra constituir la base para un intrprete de software para el lenguaje, pero no para una implementacin de
produccin real.

Modelos aplicativos. Una definicin aplicativa de un lenguaje intenta construir de manera directa una
definicin de la funcin que computa cada programa escrito en el lenguaje. Esta definicin se construye
jerrquicamente a travs de la definicin de la funcin que computa cada construccin de programa
individual. Este mtodo es un enfoque aplicativo (funcional) hacia el modelado semntico.
Cada operacin primitiva y definida por el programador que hay en un programa representa una funcin
matemtica. Las estructuras de control de secuencia del lenguaje se pueden usar para integrar estas funciones
en secuencias ms grandes, representadas en el texto del programa por expresiones y enunciados. Las series
de enunciados y la bifurcacin condicional se representan fcilmente como funciones construidas a partir de
la funciones que representan sus componentes individuales. La funcin que se representa por una iteracin se
define por lo comn de manera recursiva, como una funcin recursiva construida a partir de los componentes
del cuerpo de la iteracin. En ltimo trmino, se obtiene un modelo funcional completo de todo el programa.

Modelos axiomticos. Este mtodo ampla el clculo de predicados para incluir programas. Se puede
definir la semntica de cada construccin sintctica en el lenguaje como axiomas o reglas de inferencia que se
pueden usar para deducir el efecto de la ejecucin de esa construccin. Para entender el significado del
programa completo, se usan los axiomas y reglas de inferencia un poco como en las pruebas ordinarias en
matemticas. A partir del supuesto inicial de que los valores de las variables de entrada satisfacen ciertas
restricciones, los axiomas y reglas de inferencia se pueden usar para deducir las restricciones que satisfacen
los valores de otras variables despus de la ejecucin de cada enunciado de programa. En ltimo trmino, se
prueba que los resultados del programa satisfacen las restricciones deseadas de sus valores en relacin con los
valores de entrada. Es decir, se prueba que los valores de salida representan la funcin correcta computada a
partir de los valores de entrada.

Modelos de especificacin. En el modelo de especificacin se describe la relacin entre las diversas


funciones que implementan un programa. En tanto se pueda demostrar que una implementacin obedece esta
relacin entre cualesquiera dos funciones, se afirma que la implementacin es correcta respecto a la
especificacin.

Gramticas de atributos

Uno de los primeros intentos para desarrollar un modelo semntico de un lenguaje de progra macin fue el
concepto de gramticas de atributos, desarrollado por Knuth en 1968. La idea era asociar una funcin con
cada nodo del rbol de anlisis sintctico de un programa dando el contenido semntico de ese nodo. Las
gramticas de atributos se crearon agregando funciones (atributos) a cada regla de una gramtica.
Un atributo heredado es una funcin que relaciona valores no terminales de un rbol con valores no
terminales ms arriba en el rbol. O, en otras palabras, el valor funcional para los no terminales a la derecha
de cualquier regla es una funcin del no terminal del lado izquierdo.
Un atributo sintetizado es una funcin que relaciona el no terminal del lado izquierdo con. los valores de
los no terminales del lado derecho. Estos atributos pasan informacin hacia arriba del rbol, es decir, fueron
"sintetizados" a partir de la informacin de la parte baja del rbol.
Considrese esta gramtica sencilla para expresiones aritmticas:

E T | E + T
T P| T P
P I | (E)

Se puede definir la "semntica" de este lenguaje por medio de un conjunto de relaciones entre los no
terminales de la gramtica. Por ejemplo, las funciones siguientes producen el valor de cualquier expresin
generada por esta gramtica:

Produccin Atributo
EE+T valor(E1) = valor(E 2) + valor(T)
E T valor(E) = valor(T)
TT P valor(T1) = valor(T2) valor(P)
TP valor(T) = valor(P)
P I valor(P) = valor del nmero I
P (E) valor(P) = valor(E)

donde se rotularon X1, y X2 para ser la primera o segunda referencia del no terminal X de la produccin. La
figura 3.4 muestra un rbol con atributos que da el valor de la expresin 2 + 4 (1 + 2).
Las gramticas de atributos se pueden usar para transmitir informacin semntica por todo el rbol
sintctico. Por ejemplo, las producciones de declaraciones de un lenguaje pueden recoger informacin de
declaraciones y esa informacin de tabla de smbolos se puede transmitir hacia abajo del rbol para usarse en
la generacin de cdigo para expresiones.
Figura 3.14. Ejemplo de valores de atributos.

S-ar putea să vă placă și