Está en la página 1de 17

UNIDAD 3

RASTREO O ANLISIS LXICO Y EL ANLIS


SINTCTICO
OBJETIVO GENERAL: Estudiar con profundidad la forma que trabaja el
compilador en la fase donde realiza el anlisis lxico para comprender la forma
de optimizar los procesos de ejecucin de diferentes programas y aplicaciones.
OBJETIVOS EPECFICOS.
Conocer la forma que trabaja el analizador lxico de un compilador
Estudiar el anlisis sintctico de los compiladores
Aplicar la manera lgica en el cual trabajan los analizadores lxicos y
sintcticos de los compiladores
La fase de rastreo, o anlisis lxico, de un compilador tiene la tarea de leer el
programa fuente como un archivo de caracteres y dividirlo en tokens. Los
tokens son como las palabras de un lenguaje natural: cada token es una
secuencia de caracteres que representa una unidad de informacin en el
programa fuente. Ejemplos tpicos de token son las palabras reservadas, como
if y while, las cuales son cadenas fijas de letras; los identifica dores, que son
cadenas definidas por el usuario, compuestas por lo regular de letras y
nmeros, y que comienzan con una letra; los smbolos especiales, como los
smbolos aritmticos + y *; adems de algunos smbolos compuestos de
mltiples caracteres, tales como > = y <>. En cada caso un token representa
cierto patrn de caracteres que el analizador lxico reconoce, o ajusta desde el
inicio de los caracteres de entrada restantes. Como la tarea que realiza el
analizador lxico es un caso especial de coincidencia de patrones, necesitamos
estudiar mtodos de especificacin y reconocimiento de patrones en a medida
en que se aplican al proceso de anlisis lxico. Estos mtodos son
principalmente los de las expresiones regulares y los autmatas finitos. Sin
embargo, un analizador lxico tambin es la parte del compilador que maneja

la entrada del cdigo fuente, y puesto que esta entrada a menudo involucra un
importante gasto de tiempo, el analizador lxico debe funcionar de manera tan
eficiente como sea posible. Por lo tanto, tambin necesitamos poner mucha
atencin a los detalles prcticos de la estructura del analizador lxico.

EL PROCESO DEL ANLISIS LXICO


El trabajo del analizador lxico es leer los caracteres del cdigo fuente y
formarlos en unidades lgicas para que lo aborden las partes siguientes del
compilador (generalmente el analizador sintctico). Las unidades lgicas que
genera el analizador lxico se denominan tokens. y formar caracteres en
tokens es muy parecido a formar palabras a partir de caracteres en una oracin
en un lenguaje natural como el ingls o cualquier otro y decidir lo que cada
palabra significa. En esto se asemeja a la tarea del deletreo.
Los tokens son entidades lgicas que por lo regular se definen como un tipo
enumerado. Por ejemplo, pueden definirse en C como
typedef enum
{IF,THEN,ELSE,PLUS,MINUS,NtJM,ID,}
TokenType;
Los tokens caen en diversas categoras, una de ellas la constituyen las
palabras reservadas. como IF y THEN, que representan las cadenas de
caracteres if y then. Una segunda categora es la de los smbolos
especiales, corno los smbolos aritmticos MS y MENOS, los que se
representan con los caracteres + y . Finalmente, existen tokens que
pueden repre sentar cadenas de mltiples caracteres. Ejemplos de esto son
NUM e ID. los cuales represen tan nmeros e identificadores.
Los tokens como entidades lgicas se deben distinguir claramente de las
cadenas de caracteres que representan. Por ejemplo, el token de la palabra
reservada IF se debe distinguir de la cadena de caracteres if que representa.

Para hacer clara la distincin, la cadena de caracteres representada por un


token se denomina en ocasiones su valor de cadena o su lexema. Algunos
tokens tienen slo un lexema: las palabras reservadas tienen esta propiedad.
No obstante, un token puede representar un nmero infinito de lexemas. Los
identificadores. por ejemplo, estn todos representados por el token simple ID,
pero tienen muchos valores de cadena diferentes que representan sus
nombres individuales. Estos nombres no se pueden pasar por alto, porque un
compilador debe estar al tanto de ellos en una tabla de smbolos. Por
consiguiente, un rastreador o analizador lxico tambin debe construir los
valores de cadena de por lo menos algunos de los tokens. Cualquier valor
asociado a un token se denomina atributo del token, y el valor de cadena es un
ejemplo de un atributo. Los tokens tambin pueden tener otros atributos. Por
ejemplo, un token NUM puede tener un atributo de valor de cadena como
32767. que consta de cinco caracteres numricos, pero tambin tendr un
atributo de valor numrico que consiste en el valor real de 32767 calculado a
partir de su valor de cadena. En el caso de un token de smbolo especial como
MS (PLUS). no slo se tiene el valor de cadena +. sino tambin la operacin
aritmtica real que est asociada con l mismo. En realidad, el smbolo del
token mismo se puede er simplemente como otro atributo. mientras que el
token se puede visualizar como la coleccin de todos sus atributos.
Un analizador lxico necesita calcular al menos tantos atributos de un token
como sean necesarios para permitir el procesamiento siguiente. Por ejemplo,
se necesita calcular el valor de cadena de un token NUM. pero no es necesario
calcular de inmediato su valor numrico. puesto que se puede calcular de su
valor de cadena. Por otro lado, si se calcula su valor numrico, entonces se
puede descartar su valor de cadena. En ocasiones el mismo analizador lxico
puede realizar las operaciones necesarias para registrar un atributo en el lugar
apropiado, o puede simplemente pasar el atributo a una fase posterior del
compilador. Por ejemplo, un analizador lxico podra utilizar el valor de cadena
de un identifcador para introducirlo a la tabla de smbolos, o podra pasarlo
para introducirlo en una etapa posterior.

Puesto que el analizador lxico posiblemente tendr que calcular varios


atributos para cada token, a menudo es til recolectar todos los atributos en un
solo tipo de datos estructurados, al que podramos denominar corno registro de
token. Un registro as se podra declarar en C corno:
typedef struct
{ TokenType tokenval;
char * stringval;
int numval;
} TokenRecord;
o posiblemente como una unin
typedef struct
{ TokenType tokenval;
union
{ char * stririgval;
int numval;
} attribute;
}TokenRecord;
(lo que supone que el atributo de valor de cadena slo es necesario para
identificadores y el atributo de valor numrico slo para nmeros). Un arreglo
ms comn es que el analizador lxico solamente devuelva el valor del token y
coloque los otros atributos en variables don de se pueda tener acceso a ellos
por otras partes del compilador.
Aunque la tarea del analizador lxico es convertir todo el programa fuente en
una secuencia de tokens, pocas veces el analizador har todo esto de una vez.
En realidad, el analizador lxico funcionar bajo el control del analizador
sintctico, devolviendo el siguiente token simple desde la entrada bajo
demanda mediante una funcin que tendr una declaracin similar a la
declaracin en el lenguaje C

TokenType getToken(void);
La funcin getToken declarada de esta manera devolver, cuando se le llame,
el siguiente token desde la entrada, y adems calcular atributos adicionales,
como el valor de cadena del token. La cadena de caracteres de entrada por lo
regular no tiene un parmetro para esta funcin, pero se conserva en un buffer
(localidad de memoria intermedia) o se proporciona mediante las facilidades de
entrada del sistema.
Como ejemplo del funcionamiento de getToken considere la siguiente lnea de
cdigo fuente en C,:
A[index] = 4 + 2

Suponga que esta lnea de cdigo se almacena en un buffer de entrada como


sigue, con el siguiente carcter de entrada indicado por la flecha:

a [

n d e x

Una llamada a getToken necesitar ahora saltarse los siguientes cuatro


espacios en blanco, reconocer la cadena a compuesta del carcter nico a
como el token siguiente, y devolver el valor de token ID como el token
siguiente, dejando el buffer de entrada como aprecia a continuacin:
a [

n d e x

De esta manera, una llamada posterior a getToken comenzar de nuevo el


proceso de reconocimiento con el carcter de corchete izquierdo.

Volveremos ahora al estudio de mtodos para definir y reconocer patrones en


cadena de caracteres.

EXPRESIONES REGULARES
Las expresiones regulares representan patrones de cadenas de caracteres.
Una expresin reguIar r se encuentra completamente definida mediante el
conjunto de cadenas con las q concuerda. Este conjunto se denomina lenguaje
generado por la expresin regular y escribe como L(r). Aqu la palabra lenguaje
se utiliza slo para definir conjunto de cadenas y no tiene (por lo menos en
esta etapa) una relacin especfica con un lenguaje de programacin. Este
lenguaje depende, en primer lugar, del conjunto de caracteres que se
encuentra disponible. En general. estamos hablando del conjunto de caracteres
ASCII o de algn subconjunto del mismo. En ocasiones el conjunto ser ms
general que el conjunto de caracteres ASCII, en cuyo caso los elementos del
conjunto se describirn como smbolos. E conjunto de smbolos legales se
conoce como alfabeto y por lo general se representa mediante el smbolo
griego sigma (sumatoria).
Una expresin regular r tambin contendr caracteres del alfabeto, pero esos
caracteres tendrn un significado diferente: en una expresin regular todos los
smbolos indican patrones.
Por ltimo, una expresin regular r puede contener caracteres que tengan
significados especiales. Este tipo de caracteres se llaman metacaracteres o
metasmbolos. y por lo general no pueden ser caracteres legales en el alfabeto,
porque no podramos distinguir su uso como metacaracteres de su uso como
miembros del alfabeto. Sin embargo. a menudo no es posible requerir tal
exclusin, por lo que se debe utilizar una convencin para diferenciar los dos
usos posibles de un metacarcter. En muchas situaciones esto se realiza
mediante el USO de un carcter de escape que desactiva el significado
especial de un metacarcter. Unos caracteres de escape comunes son la
diagonal inversa y las comillas. Advierta que los caracteres de escape, si

tambin son caracteres legales en el alfabeto, son por s mismos


metacaracteres.
Definicin de expresiones regulares
Ahora estamos en posicin de describir el significado de las expresiones
regulares al establecer cules lenguajes genera cada patrn. Haremos esto en
varias etapas. Comenzaremos por describir el conjunto de expresiones
regulares bsicas, las cuales se componen de smbolos individuales.
Continuaremos con la descripcin de las operaciones que generan nuevas
expresiones regulares a partir de las ya existentes. Esto es similar a la manera
en que se construyen las expresiones aritmticas: las expresiones aritmticas
bsicas son los nmeros, tales como 43 y 2.5. Entonces las operaciones
aritmticas, como la suma y la multiplicacin. se pueden utilizar para formar
nuevas expresiones a partir de las existentes, como en el caso de:
43 * 2.5 y 43 * 2.5 + 1.4.
El grupo de expresiones regulares que describiremos aqu es mnimo, ya que
slo con tiene los metasmbolos y las operaciones esenciales. Despus
consideraremos extensiones a este conjunto mnimo.
Expresiones regulares bsicas stas son precisamente los caracteres
simples del alfabeto, los cuales se corresponden a s mismos. Dado cualquier
carcter a del alfabeto, indicamos que la expresin regular a corresponde al
carcter a escribiendo L(a) = { a }. Existen otros dos smbolos que
necesitaremos en situaciones especiales. Necesitamos poder indicar una
concordancia con la cadena vaca, es decir, la cadena que no contiene ningn
carcter. Utiliza remos el smbolo s (psilon) para denotar la cadena vaca, y
definiremos el metasmbolo c (s en negritas) estableciendo que L(e) = { s }.
Tambin necesitaremos ocasionalmente ser capaces de describir un smbolo
que corresponda a la ausencia de cadenas, es decir, cuyo lenguaje sea el
conjunto vaco, el cual escribiremos como { }. Emplearemos para esto el
smbolo y escribiremos L( = { }. Observe la diferencia entre { } y {z}: el conjunto

no contiene ninguna cadena, mientras que el conjunto (E } contiene la cadena


simple que no se compone de ningn carcter.
Operaciones de expresiones regulares Existen tres operaciones bsicas en
las expresiones regula res: 1) seleccin entre alternativas, la cual se indica
mediante el metacarcter 1 (barra ver tical); 2) concatenacin, que se indica
mediante yuxtaposicin (sin un metacarcter). y 3) repeticin o cerradura, la
cual se indica mediante el metacarcter. Analizaremos cada una por turno,
proporcionando la construccin del conjunto correspondiente para los lenguajes
de cadenas concordantes.
Seleccin entre alternativas Si r y s son expresiones regulares, entonces r | s
es una expresin regular que define cualquier cadena que concuerda con r o
con o. En trminos de len guajes, el lenguaje de r | s es la unin de los
lenguajes de r y s, o L(r | s) = L(r) L(s). Como un ejemplo simple, considere la
expresin regular a | b: sta corresponde tanto al carcter a como al carcter b,
es decir, L(a I b) = L(a) L(b) = {a} { h} = {a, b}. Como segundo ejemplo, la
expresin regular a r corresponde tanto al carcter simple a como a la cadena
vaca (que no est compuesta por ningn carcter). En otras palabras. L(a l =)
a, a}.
La seleccin se puede extender a ms de una alternativa, de manera que. por
ejemplo, L(a I b | c I d) = a, b, c, d}. En ocasiones tambin escribiremos largas
secuencias de selecciones con puntos, como en a I b |. . . | z, que corresponde
a cualquiera de las letras minsculas de la a a la z.

LAS GRAMATICAS LIBRES DE CONTEXTO Y EL ANLISIS SINTCTICO


El anlisis gramatical es la tarea de determinar la sintaxis, o estructura, de un
programa.
Por esta razn tambin se le conoce como anlisis sintctico. La sintaxis de un
lenguaje de programacin por lo regular se determina mediante las reglas
gramaticales de una gramtica libre de contexto, de manera similar como se

determina mediante expresiones regulares la estructura lxica de los tokens


reconocida por el analizador lxico. En realidad, una gramtica libre de
contexto utiliza convenciones para nombrar y operaciones muy similares a las
correspondientes en las expresiones regulares. Con la nica diferencia de que
las reglas de una gramtica libre de contexto son recursivas. Por ejemplo, la
estructura de una sentencia if debe permitir en general que otras sentencias if
estn anidadas en ella, lo que no se permite en las expresiones regulares. Este
cambio aparentemente elemental para el poder de la representacin tiene
enormes consecuencias. La clase de estructuras reconocible por las
gramticas libres de contexto se incrementa de manera importante en relacin
con las de las expresiones regulares. Los algoritmos empleados para
reconocer estas estructuras tambin difieren mucho de los algoritmos de
anlisis lxico, ya que deben utilizar llamadas recursivas o una pila de anlisis
sintctico explcitamente administrada. Las estructuras de datos utilizadas para
representar la estructura sintctica de un lenguaje ahora tambin deben ser
recursivas en lugar de lineales (como lo son para lexemas y tokens). La
estructura bsica empleada es por lo regular alguna clase de rbol, que se
conoce como rbol de anlisis gramatical o rbol sintctico.
Necesitamos estudiar la teora de las gramticas libres de contexto antes de
abordar los algoritmos de anlisis sintctico y los detalles de los analizadores
sintcticos reales que utilizan estos algoritmos. Sin embargo, al contrario de lo
que sucede con los analizadores lxicos, donde slo existe, en esencia un
mtodo algortmico (representado por los autmatas finitos), el anlisis
sintctico involucra el tener que elegir entre varios mtodos diferentes, cada
uno de los cuales tiene distintas propiedades y capacidades. De hecho existen
dos categoras generales de algoritmos: de anlisis sintctico descendente y de
anlisis sintctico ascendente (por la manera en que construyen el rbol de
anlisis gramatical o rbol sintctico).

EL PROCESO DEL ANLISIS SINTCTICO

La tarea del analizador sintctico es determinar la estructura sintctica de un


programa a partir de los tokens producidos por el analizador lxico y, ya sea de
manera explcita o implcita, construir un rbol de anlisis gramatical o rbol
sintctico que represente esta estructura. De este modo, se puede ver el
analizador sintctico como una funcin que toma como una entrada la
secuencia de tokens producidos por el analizador lxico y que produce como
salida el rbol sintctico.

Analizador sintctico
Secuencia de tokens

rbol sintctico

La secuencia de tokens por lo regular no es un parmetro de entrada explcito.


pero el analizador sintctico llama a un procedimiento del analizador lxico,
como getToken para obtener el siguiente token desde la entrada a medida que
lo necesite durante el proceso anlisis sintctico. De este modo, la etapa de
anlisis sintctico del compilador se reduce a una llamada al analizador lxico
de la manera siguiente:
syntaxTree = parse();
En un compilador de una sola pasada el analizador sintctico incorporar todas
las otras fases de un compilador, incluyendo la generacin del cdigo. y no es
necesario construir ningn rbol sintctico explcito (las mismas etapas del
analizador sintctico representara de manera implcita al rbol sintctico), y. por
consiguiente, una llamada parse (); lo har. Por lo comn, un compilador ser
de mltiples pasadas, en cuyo caso las pasadas adicionales utilizarn el rbol
sintctico como su entrada.
La estructura del rbol sintctico depende en gran medida de la estructura
sintctica particular del lenguaje. Este rbol por lo regular se define como una
estructura de datos dinmica, en la cual cada nodo se compone de un registro
cuyos campos incluyen los atributos necesarios para el resto del proceso de

compilacin (es decir, no slo por aquellos que calcula el analizador sintctico).
A menudo la estructura de nodos ser un registro variante para ahorrar
espacio. Los campos de atributo tambin pueden ser estructuras que se
asignar de manera dinmica a medida que se necesite, como una herramienta
adicional para ahorrar espacio.
Un problema ms difcil de resolver para el analizador sintctico que para el
analiza lxico es el tratamiento de los errores. En el analizador lxico, si hay un
carcter que no puede ser parte de un token legal, entonces es suficientemente
simple generar un token de error y consumir el carcter problemtico. (En cierto
sentido, al generar un token de error, el analizador lxico transfiere la dificultad
hacia el analizador sintctico.) Por otra parte, el analizador sintctico no slo
debe mostrar un mensaje de error, sino que debe recuperarse del error y
continuar el anlisis sintctico (para encontrar tantos errores como sea
posible). En ocasiones, un analizador sintctico puede efectuar reparacin de
errores, en la cual infiere una posible versin de cdigo corregida a partir de la
versin incorrecta que se le haya presentado. (Esto por lo regular se hace slo
en casos simples.) Un aspecto particularmente importante de la recuperacin
de errores es la exhibicin de mensajes de errores significativos y la
reanudacin del anlisis sintctico tan prximo al error real como sea posible.
Esto no es fcil, puesto que el analizador sintctico puede no descubrir un error
sino hasta mucho despus de que el error real haya ocurrido. Como las
tcnicas de recuperacin de errores dependen del algoritmo de anlisis
sintctico que se haya utilizado en particular.
GRAMITICAS LIBRES DE CONTEXTO
Una gramtica libre de contexto es una especificacin para la estructura
sintctica de un lenguaje de programacin. Una especificacin as es muy
similar a la especificacin de la estructura lxica de un lenguaje utilizando
expresiones regulares, excepto que una gramtica libre de contexto involucra
reglas de recursividad. Como ejemplo de ejecucin utilizaremos expresiones

aritmticas simples de enteros con operaciones de suma, resta y multiplicacin.


Estas expresiones se pueden dar mediante la gramtica siguiente:

exp

exp op exp | ( exp ) | nmero


op

+||*

Comparacin respecto a la notacin de una expresin regular


Consideremos cmo se compara la gramtica libre de contexto de muestra
anterior con las reglas de la expresin regular.

nmero = dgito dgito*


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

En las reglas de la expresin regular bsica tenemos tres operaciones:


seleccin (dada por el metasmbolo de la barra vertical). Concatenacin (dada
sin un metasmbolo) y repeticin (dada por el metasmbolo del asterisco).
Tambin empleamos el signo de igualdad para re presentar la definicin de un
nombre para una expresin regular, y escribimos el nombre en itlicas para
distinguirlo de una secuencia de caracteres reales.
Las reglas gramaticales utilizan notaciones semejantes. Los nombres se
escriben en cursivas o itlicas (pero ahora con una fuente diferente, de modo
que podamos distinguirlas de los nombres para las expresiones regulares). La
barra vertical todava aparece como el metasmbolo para seleccin. La
concatenacin tambin se utiliza como operacin estndar. Sin embargo. no
hay ningn metasmbolo para la repeticin (como el * de las expresiones
regulares), un punto al cual regresaremos en breve. Una diferencia adicional en
la notacin es que ahora utilizamos el smbolo de la flecha

en lugar del

de igualdad para expresar las definiciones de los nombres. Esto se debe a que

ahora los nombres no pueden simplemente ser reemplazados por sus


definiciones, porque est implicado un proceso de definicin ms complejo.
Como resultado de la naturaleza recursiva de las definiciones. En nuestro
ejemplo la regla para exp es recursiva en el sentido que el nombre exp aparece
a la derecha de la flecha.
Advierta tambin que las reglas gramaticales utilizan expresiones regulares
como componentes. En las reglas para exp y op se tienen en realidad seis
expresiones regulares representando tokens en el lenguaje. Cinco de stas son
tokens de carcter simple: +. -, *, (y). Una es el nombre nmero, el nombre de
un token representando secuencias de dgitos.
De manera similar a la de este ejemplo, las reglas gramaticales se usaron por
primera vez en la descripcin del lenguaje Algol6O. La notacin fue
desarrollada por John Back.. adaptada por Peter Naur para el informe Algol6O.
De este modo, generalmente se dice que las reglas gramaticales en esta forma
estn en la forma Backus-Naur, o BNF (Bac Naur Form).

Especificacin de las reglas de una gramtica libre de contexto


Como las expresiones regulares, las reglas gramaticales estn definidas sobre
un alfabeto, o conjunto de smbolos. En el caso de expresiones regulares,
estos smbolos por lo regular caracteres. En el caso de reglas gramaticales, los
smbolos son generalmente tokens que representan cadenas de caracteres.
En el caso en que un token sea un smbolo fijo, como en la palabra reservada
while - - smbolos especiales como + o := escribiremos la cadena en s en la
fuente de cdigo. En el caso de tokens tales como identificadores y nmeros
representan ms de una cadena, utilizaremos la fuente de cdigo en itlicas,
justo como si el token fuera un nombre para una expresin regular (lo que por
lo regular representa) Por ejemplo, representaremos el alfabeto de tokens para
el lenguaje TINY como el conjunto

{if,then,else,end,repeat,until,read,write,
identificador, nmero, +, -, , 1, =, <, (,),;,:=}
en lugar del conjunto de tokens (comoo se definieron en el analizador lxico de
TINY:
{IF,THEN,ELSE,END,REPEAT,UNTIL,READ,WRITE, ID,NUM,
PLUS,MINIJS, TIMES, OVER, EQ, LT, LPAREN, RPAREN, SEMI,ASSIGN}
Dado un alfabeto, una regla gramatical libre de contexto en BNF se compone
de

una cadena de smbolos. El primer smbolo es un nombre para una

estructura. El segundo smbolo es el metasmbolo

. Este smbolo est

seguido por una cadena de smbolos, cada uno de los cuales es un smbolo del
alfabeto, un nombre para una estructura o el metasmbol |.
En trminos informales, una regla gramatical en BNF se interpreta como sigue.
La regla define la estructura cuyo nombre est a la izquierda de la flecha. Se
define la estructura de manera que incluya una de las selecciones en el lado
derecho separada por las barras verticales. Las secuencias de smbolos y
nombres de estructura dentro de cada seleccin definen el diseo de la
estructura. Por ejemplo, considere las reglas gramaticales de nuestro ejemplo
anterior:
exp

exp op exp | (exp ) | nmero


op

+|-|*

La primera regla define una estructura de expresin (con nombre exp)


compuesta por una expresin seguida por un operador y otra expresin. por
una expresin dentro de parntesis o bien por un nmero. La segunda define
un operador (con nombre op) compuesto de uno de los smbolos +. -,*.

Los metasmbolos y convenciones que usamos aqu son semejantes a los de


uso generalizado, pero es necesario advertir que no hay un estndar universal
para estas convenciones.
En realidad, las alternativas comunes para el metasmbolo de la flecha

incluyen = (el signo de igualdad), : (el signo de dos puntos) y ::= (signo de
dos puntos doble y el de igualdad). En archivos de texto normales tambin es
necesario hallar un reemplazo para el uso de las itlicas. Esto se hace
frecuentemente encerrando los nombres de estructura con picoparntesis
<. . . > y escribiendo los nombres de token en itlicas con letras maysculas.
De este modo, con diferentes convenciones, las reglas gramaticales anteriores
podran aparecer como
<exp> ::= <exp> <op> <exp> | (<exp>) | NMERO
<op> ::= + | - | *

Cada autor tambin tendr otras variaciones en estas notaciones. Varias de las
ms importantes (algunas de las cuales utilizaremos ocasionalmente). Sin
embargo, vale la pena analizar de inmediato dos pequeas cuestiones adiciona
les sobre la notacin.
En ocasiones, aunque los parntesis son tiles para reasignar la precedencia
en las expresiones regulares, conviene incluir parntesis en los metasmbolos
de la notacin BNF. Por ejemplo, se puede volver a escribir las reglas
gramaticales anteriores como una sola regla gramatical de la manera siguiente:
exp

* exp (+| | *) exp | ( exp ) | nmero

En esta regla los parntesis son necesarios para agrupar las opciones de los
operadores entre las expresiones en el lado derecho, puesto que la
concatenacin tiene precedencia sobre la seleccin (como en las expresiones
regulares). De este modo, la regla siguiente tendra un significado diferente (e
incorrecto):

exp

* exp +| | * exp | ( exp ) | nmero

Advierta tambin que, cuando se incluyen los parntesis como metasmbolo, es


necesario distinguir los tokens de parntesis de los metasmbolos, lo que
hicimos ponindolos entre comillas, como hacamos en el caso de expresiones
regulares. (Para mantener la consistencia tambin encerramos los smbolos de
operador entre comillas.)
Los parntesis no son absolutamente necesarios como metasmbolos en BNF,
ya que siempre es posible separar las partes entre parntesis en una nueva
regla gramatical. De hecho la operacin de seleccin que da el metasmbolo de
la barra vertical tampoco es necesaria en reglas gramaticales, si permitimos
que el mismo nombre aparezca cualquier nmero de veces a la izquierda de la
flecha. Por ejemplo, nuestra gramtica de expresin simple podra escribirse
como se aprecia a continuacin:
exp

exp op exp

exp

( exp )

exp

nmero

op

op

op

Sin embargo, por lo regular describiremos reglas gramaticales de manera que


todas las selecciones para cada estructura estn enumeradas en una sola
regla, y cada nombre de estructura aparezca slo una vez a la izquierda de la
flecha.

ACTIVIDADES
1. Realice un anlisis profundo de los anlisis sintcticos y lxico, mirando
sus caractersticas ms importantes y disctalo con un profesional del
rea de sistemas y las conclusiones comprtalas con su tutor.
2. Realice un programa en C++, donde se lean 10 nmeros en un vector y
como resultado, muestre el vector ordenado. Mire como trabaja el
compilador los anlisis sintctico y lxico, sus mensajes, errores entre
otros.
Realice un listado de estos mensajes y las ayudas que le da al
programador el compilador.