Vous êtes sur la page 1sur 23

ÁREA DE ENERGÍA, LAS INDUSTRIAS Y DE LOS RECURSOS

NATURALES NO RENOVABLES

CARRERA DE INGENIERÍA EN SISTEMAS


IX MÓDULO “A”

COMPILADORES

TEMA:

“Teoría de Compiladores”

AUTOR:

Ramiro Ricardo Merchán Mora

COORDINADOR:

Ing. Luis Chamba

LOJA – ECUADOR
2009
U NIV E RS IDA D NA CIONA L D E LOJA 2

CAPITULO 1: INTRODUCCIÓN A LOS COMPILADORES

INTRODUCCIÓN

La construcción de un compilador es una de las tareas más gratas con las que un
informático puede encontrarse a lo largo de su carrera profesional.

Aunque no resulta sensato pensar que una labor tal pueda formar parte de la actividad
cotidiana de la mayoría de estos profesionales, sí es cierto que, con cierta frecuencia, suele
aparecer la necesidad de analizar un fichero de texto que contiene información distribuida
según algún patrón reconocible: ficheros XML, ficheros de inicialización .ini, ficheros con
comandos del sistema operativo, los propios programas fuente, etc.

Es más, el concepto de análisis de un texto puede ser útil para ahorrar trabajo en
situaciones que están fuera del ámbito profesional informático, como por ejemplo la
generación de índices analíticos en archivos de texto escritos con procesadores que no
admiten esta opción.

Pero a pesar de la indudable utilidad de los conceptos generales relacionados con la teoría y
práctica de los análisis de textos, el crear un compilador introduce al informático en un
nuevo mundo en el que el control sobre el ordenador es absoluto y le lleva al paroxismo de
la omnipotencia sobre la máquina. Y es que resulta imprescindible un pleno conocimiento de
todos los conceptos intrínsecos al ordenador: dispositivos de E/S, código máquina utilizado
por el microprocesador, comunicación a bajo nivel entre éste y el resto de sus periféricos,
distribución de la memoria, mecanismos de uso de memoria virtual, etc.

Aunque pocas personas tendrán la oportunidad de crear, mantener, diseñar o formar parte
de un equipo que se dedique a los compiladores, las técnicas utilizadas en el diseño de estos
pueden emplearse con éxito en otras áreas del desarrollo de programas.

A lo largo de la historia de los compiladores han existido algunos eventos importantes,


entre los que destacamos:
U NIV E RS IDA D NA CIONA L D E LOJA 3

 1958, Strong y otros proponen una solución al problema de que un compilador fuera
portable, y esta era dividir al compilador en dos fases “front end” (analiza el programa
fuente) y “back end” (genera código objeto para la máquina objeto).

 El puente de unión era un lenguaje intermedio denominado UNCOL (no funcionó)

 1959, Rabin y Scott proponen el empleo de AFD y AFN para el reconocimiento


lexicográfico de los lenguajes.

 Aparece BNF (Backus-1960, Naur-1963, Knuth-1964) como una guía para el desarrollo
del análisis sintáctico

 En 1959, Sheridan describe un método de parsing de FORTRAN para introducir


paréntesis en una expresión

 En 1975, aparece LEX generador automático de analizadores léxicos a partir de


expresiones regulares bajo UNIX

 A mitad de los 70’s Johnson crea YACC para UNIX (generador de analizadores
sintácticos)

 El último lenguaje de programación de amplia aceptación es JAVA (es interpretado)

Para escribir un compilador necesitamos:

Algoritmos
Lenguajes de Programación
Lenguajes Formales
Arquitectura del Computador
Ingeniería de Software

Partes Fundamentales:

El léxico, la sintaxis y la semántica →Lenguaje fuente a ser compilado.


La estructura interna del compilador
La arquitectura de la computadora y su conjunto de instrucciones.
U NIV E RS IDA D NA CIONA L D E LOJA 4

Ventajas de compilar vs a interpretar

Se compila una vez, se ejecuta n veces


En ciclos, la compilación genera código equivalente, interpretándolo se traduce
tantas veces una línea como veces se repite el ciclo
El compilador tiene un visión global del programa

Ventajas del intérprete vs el compilador

Un intérprete necesita menos memoria que un compilador


Permiten una mayor interactividad con el código en tiempo de desarrollo

Diferencias entre Traductor y un Compilador

Traductor: - Análisis Léxico Compilador: - Análisis Léxico


- Análisis Sintáctico - Análisis Sintáctico
- Análisis Semántico - Análisis Semántico
- Generación de código intermedio
- Código máquina
- Fase de optimización

Equivalencias código máquina

FASES DE UN COMPILADOR

Programa Programa
fuente COMPILADOR objeto

Mensaje de error

Análisis: - Análisis Léxico: Descomposición programa fuente en componentes léxicos


- Análisis Sintáctico: Agrupa componentes léxicos en frases gramaticales
- Análisis Semántico: Comprobación de validez semántica

Síntesis: - Generación de lenguaje objeto


- Generación de código
U NIV E RS IDA D NA CIONA L D E LOJA 5

- Optimización de código

Herramientas: Generador de análisis léxico, sintáctico y semántico.

Estructura de un compilador
U NIV E RS IDA D NA CIONA L D E LOJA 6

GRAMÁTICAS INDEPENDIENTES DEL CONTEXTO (GIC)

GRAMÁTICAS REGULARES GRAMÁTICAS INDEPENDIENTES DEL


CONTEXTO
- En el lado derecho existe un nodo terminal seguido de - Poseen variables A, B, C
un no terminal, o un solo terminal, y en el lado izquierdo - Poseen cadenas de caracteres.
existe un nodo no terminal. - Genera lenguaje de tipo 2 o lenguaje
- Poseen constantes a, b, c. independiente de contexto.
- Genera lenguaje de tipo 3 o lenguaje regular. - No tiene restricciones con respecto a sus
- Su importancia reside en que los lenguajes generados reglas de escritura, su lado izquierdo de
por ellas son exactamente aquellos que reconocen los cada regla sea un no terminal: S →aMa.
autómatas finitos. - Se utilizan cuando un autómata finito no
- Existe exactamente un no terminal reconoce ciertos lenguajes.
- La parte de la cadena no generada siempre aparece al - Se escriben frecuentemente utilizando una
final. notación conocida con BNF (Backus-Naur).
- Proporciona un plantilla o patrón para las cadenas de - Para determinar si están bien escritas se
lenguajes. utilizan los árboles de análisis sintáctico.
- Si en cada regla α→β cumple: - Cualquier gramática libre de contexto que no
α ϵ Vn, y contenga la cadena vacía puede ser
β ϵ Vt, p generado: L – {λ} ó L.
β ϵ (Vt * Vn) - El no terminal puede ser uno o varios que
- Gramáticas Lineales - A::=α puede tomar.
por la izquierda → - A::=Va - Proporcionar un mecanismo simple y exacto
- S::=λ para describir los métodos por los cuales las
- Se clasifican en: - Gramáticas Lineales - A::=a frases (lenguaje natural) son construidas de
por la derecha → - A::=aV bloques más pequeñas.
- S::=λ - Si cada regla: α→β cumple α ϵ Vn.
- Cumple los requerimientos para ser una
gramática tipo 1.
- Cumple con los requerimientos para ser una gramática
de tipo 2.

1.1. EJERCICIOS

 S → AA
A → AAA | a | bA |Ab

Determinar la cadena b2aba2ba → bbabaaba

S →AA→ bAA → bbAA → bbaA → bbabA → bbabAAA → bbabaAA → bbabaAbA→ bbabaabA → babaaba

Arboles de derivación

 S → AB
U NIV E RS IDA D NA CIONA L D E LOJA 7

A → aA | a
B → bB | b

Determinar la cadena aabbb

 S →AB→ aAB → aaB →aabB → aabbB → aabbb


 S → AB → aAbB → aabbB → aabbb
 S → AB → abB → AbbB → Abbb → aAbbb →aabbb

A B

a A b B

a b B

 S → SbS | ScS | a

Determinar la cadena abaca

 S → SbS → abS → abScS → abaca


 S → SbS → SbScS → abaca
 S → ScS → SbScS → abaca

1 y 2) S 3) S

S b S S c S

a S c S S b S a

a a a a
Derivación por la izquierda

 S → ScS → SbScS → abScS → abacS → abaca


U NIV E RS IDA D NA CIONA L D E LOJA 8

El no terminal se expande siempre del extremo izquierdo.

Derivación por la derecha

 S → ScS → SbSca → Sbaca → abaca

El no terminal es el que se expande por la derecha.

 La presencia de dos derivaciones por la izquierda distintos se corresponde con la


existencia de dos árboles de derivación distintos por lo tanto una gramática ambigua
se caracteriza por tener dos o más derivaciones por la izquierda para la misma
cadena.
 Toda derivación es una gramática regular, es a la vez una derivación por la izquierda
y por la derecha sin tener en cuenta si tenemos una gramática regular por la
derecha o por la izquierda.

2. SIMPLIFICACIÓN D GRAMÁTICAS INDEPENDIENTES DE CONTEXTO

Para realizar la simplificación de estas gramáticas debemos hacer lo siguiente:

- Cuando no derivan ninguna cadena terminal


1. Eliminar los no terminales que resulten inútiles
- Cuando no son alcanzables desde S (inicio)

 S → | Aa | B | D S → Aa |B
B→b B→b
A → aA | bA | B A → aA | bA | B
C → abd

2. Eliminar las producciones en donde se encuentre contenida la palabra vacía (ε ó λ).

 S → ABA S → ABA | λ
A → aA |λ A → aA | a
B → bB | λ B → bB | b

3. Eliminar las producciones unitarias


U NIV E RS IDA D NA CIONA L D E LOJA 9

 S → A | Aa 1. Unitario (S) → {S, A, B, C, D} 2. S → Aa | b |ab


A→B Unitario (A) → {A, B, C, D} A → b | ab
B →C | b Unitario (B) → {B, C, D} B → b | ab
C → D | ab Unitario(C) → {C, D} C → ab | b
D →b Unitario (D) → {D} D→d

2.1. EJERCICIOS

 G = ({0,1}, {A, A, B, C}, S, P)


P S → AB |0S1| A |CX
A → 0AB | λ
B → B1 | λ

1. Eliminar los no terminales inútiles 2. Eliminar producciones vacías λ


S → AB |0S1| A S → AB |0S1|A|B| λ
A → 0AB | λ A → OAB |0A|OB| O
B → B1 | λ B → B1 | 1

3. Eliminar producciones unitarias


S → AB |0S1|OAB|OA|OB|O|B1|1| λ
A → OAB |0A|OB| O
B → B1 | 1

 G = ({i,+}, {Z, E, F, G, P, Q, S, T}, Z, P)


P Z→E+T|T
E→E|S+F|T
F → F | FP | P
P→G
G → G | GG | F
T→T+i|i
Q→E|E+F|T|S
S→i

1. Eliminar los no terminales inútiles 2. Eliminar producciones vacías λ


Z→ E + T Z→ E + T
E→E|S+F|T E→T
F → F | FP | P T→T+i|i
P→G
G → | GG | F
T→T+i|i
S→i
U NIV E RS IDA D NA CIONA L D E LOJA 10

3. Eliminar producciones unitarias


Z→T+T Z→T+T
T →T+i|i ó E→T+i|i
T→T+i|i

3. FORMA NORMAL DE CHOMSKY

Se aplica: A → BC No se puede aplicar cuando:


A→a - Hay producciones vacías
A, B, C ϵ V, a ϵ ∑ - Hay producciones unitarias

3.1. EJERCICIO

 B → aBC
E → aBEd

1. Eliminar producciones vacías λ 2. Reemplazamos en la gramática


Da → a B → DaBC
Dd → d E → DaBEDd

Base (2) → Longitud de la parte derecha sea mayor que dos


A → CBFH A → D1FH
D1 → CB
A → D1D2
D2 → FH

Expresión regular → letra+_numero+letra+ | _letra*


L

L → (a – z)
2
-----
N → (1 – 9)

1 L
L L N
---- N L
3 4 5 6
<inicio> → _ <guion>
<inicio> → l <letra>
<guion> → l <letra> | n <numero>
<letra> → n <numero> | l_<guion> | λ
<numero> → l <letra>

Determinar la derivación de la cadena _a


U NIV E RS IDA D NA CIONA L D E LOJA 11

<inicio> → _<guion> <inicio>


<guion> → _a <letra>
<letra> → _a λ _ <guion>
<letra> → _a
a <letra>

 S → A | Aa
A→B
B→C|b
C → D | ab
D→b
1. Unitario(S) → {S, A, B, C, D} 2. S → Aa | b | ab 3. S → Aa | b | ab
Unitario (A) → {A, B, C, D} A → b | ab A→ b | ab
Unitario (B) → {B, C, D} C → ab | b
Unitario (C) → {C, D} D→d

 S → bA | aB S → DbA | DaB
A → bAA | aS |a A → DbD1 | DaS |Da
B → aBB | bS | b B →DaD2 | bS | b
Da → a
Db → b
D1→ AA
D2 → BB
 S → AB| Cb
A → f | Al
B → t | CF
D→a|t

1. Términos no Generativos 2. Términos no Alcanzables


S → AB S → AB
A → f | Al A → f | Al
B→t B→t
D→a|t

 S → aA| λ
A → aA | bB | λ
B → bB

1. Producciones vacías 2. Términos no Generativos 3 Términos no alcanzables


S → aA| λ S → aA| λ S → aA| λ
U NIV E RS IDA D NA CIONA L D E LOJA 12

A → aA | bB | a A → aA | a A → aA | a
B → bB B → bB

 S → a| aA | B | E
A → aB | λ
B → Aa
E → bED
D → ccc

1. Producciones vacías 2. Producciones unitarias


S → a| aA | B | E S → a| aA | Aa |bED
A → aB | a A → aB | a
B → Aa | a B → Aa | a
E → bED E → bED
D → ccc D → ccc

3. Términos no Generativos 4. Términos no alcanzables


S → a | aA| Aa S → a |aA| Aa
A → aB |a A → aB | a
B → Aa | a B →Aa | a
E → bED
D → ccc

 S → ABaC
A → AB
B → b |λ
C → D | λ
D → d

1. Producciones vacías 2. Producciones unitarias 3. Términos no alcanzables


S → ABaC |AaC | ABa | Aa S → ABaC |AaC | ABa | Aa S→ABaC|AaC|ABa|Aa
A → AB | A A → AB A→AB
B →b B →b B→b
C→D C→D C→d
D→d D→d
U NIV E RS IDA D NA CIONA L D E LOJA 13

CAPITULO 2: ANÀLISIS LÈXICO


Descomposición del programa fuente en componentes léxicos. En esta etapa se lee el
archivo de texto que contiene el código fuente y las cadenas se van agrupando en
componentes léxicos o tokens.

Estos componentes léxicos son los operadores, identificadores y palabras reservadas del
lenguaje. Por lo tanto, transforma en flujo de caracteres en un flujo de objetos tokens,
ignorando los comentarios y los espacios en blanco y tabulaciones. Esta primera fase es
capaz de detectar errores de tipo léxico.

Por ejemplo, si en lugar de poner if pusiéramos ifi, el analizador léxico no usaría el token
predefinido IF para esa secuencia de caracteres, sino que entendería que es un
identificador cualquiera (como pudiera ser el nombre de una variable).

1.1 Construcción del Analizador Léxico

Expresión: 1+1 = x;
(a+b) = y;

Expresión: 1 + 1 = x; (a + b) = y;

Id en Lexema Iden Lexema


num 1 sep (
delim \s delim \s
opArit + id a
delim \s delim \s
num 1 opArit +
delim \s delim \s
opAsig = id b
delim \s delim \s
id X sep )
delim \s delim \s
terInst ; opAsig =
delim \n delim \s
id Y
delim \s
terInst ;
U NIV E RS IDA D NA CIONA L D E LOJA 14

CAPITULO 3: ANÀLISIS SINTÀCTICO


Agrupa componentes léxicos en frases gramaticales. Esta etapa se encarga de verificar que
el documento tiene una disposición sintáctica correcta, agrupando el código en frases
gramaticales con sentido. En otras palabras, que el flujo de tokens tenga el orden correcto.
Esta etapa detecta errores sintácticos. Siguiendo el ejemplo anterior, si hubiésemos
puesto ifi en lugar de if, esta etapa detectaría que la estructura de un bloque if no es así,
detectando así el error en el código fuente. A la siguiente fase le manda árboles de
sintaxis abstracta.

Por ejemplo, un árbol cuyo nodo raíz es PROGRAMA, que se compone de una lista de clases.
Cada una de estas serian arboles que describen los distintos atributos y métodos de la
misma, y así sucesivamente. Esta fase no puede detectar los errores.

TABLA DE SÍMBOLOS

ANÁLISIS LÉXICO ANÁLISIS SINTÁCTICO ANÁLISIS SEMÁNTICO

Mensajes de Error

GRAMÁTICAS
INDEPENDIENTES DE
CONTEXTO

int a ;
(INT,int)(Id,a)(terInst,;)

La palabra generada pertenece a la gramática del lenguaje W Є L(G)

 Análisis Descendente: Raíz hasta las hojas.


- Análisis Predictivo predice que se va a generar de acuerdo a la gramática
establecida.
U NIV E RS IDA D NA CIONA L D E LOJA 15

 Análisis Ascendente: Parte de las hojas hacia la raíz.

 ANÁLISIS DESCENDENTE: LL(1)  $ fin de entrada

Gramática

1. <S> if <E> then <S>


2. <S> while <E> do <S>
3. <S> id := <E>
4. <E> id | cte

Derivacion

Cadena: if cte then id := cte $

<S> if <E> then <S>


<E> if cte then <S>
<S> if cte then id := <E>
<E> if cte then id := cte

Árbol de construcción

<S>

if <E> then <S>

cte id := <E>

cte
U NIV E RS IDA D NA CIONA L D E LOJA 16

Pasos

1. Reconocer el fin de entrada.


2. Ponemos en la tabla la cadena a analizar.
3. Luego analizamos el estado inicial y el final.
4. Comparamos donde está cada uno de los símbolos.

TABLAS

2do p. if cte then id := cte $ 4to p. if cte then id := cte $


3er p. <S> $ if <E> then <S> $

5to p. cte then id := cte $ 6to p. cte then id := cte $


<E> then <S> $ cte then <S> $

7mo p. then id := cte $ 8vo p. id := cte $


then <S> $ <S> $

9no p. id := cte $ 10mo p. := cte $


id := <E> $ := <E> $

11vo p. cte $ 12vo p. cte $


<E> $ cte $

ELIMINACIÓN DE LA RECURSIVIDAD POR LA IZQUIERDA DE UNA GRAMÁTICA

Algoritmo LL(1)  Tablas de análisis

L= izquierda a derecha direccional


L= derivación mas a la izquierda
1= un símbolo de pre análisis para aplicar producción
U NIV E RS IDA D NA CIONA L D E LOJA 17

Filas  Símbolos no terminales


Columnas  Símbolos terminales
Fin de cadena  $
Celda Tabla  Reglas gramaticales
Celda Vacía  Error de análisis

Reglas

1. Los conjuntos siguientes son vacíos al inicio excepto el axioma que excluye $
2. AαCβ
S(C)= P(B) – {λ}
3. AαC ó αCβ
P(B) tiene {λ} S(C)= S(A)

Teorema 1:
 No ser recursivo por la izquierda
 Factorizada

Teorema 2:
 No es ambigua

Características:
 Primeros y Siguientes

Procedimiento:
 Calcular primeros símbolos no terminales
 Calcular siguientes símbolos no terminales
 Construir la tabla LL(1)

Ejemplo 1:

PRIMEROS SIGUIENTES

1. E  TE` primeros(E) = {( , id} siguientes(E) = {$ , )}


2. E` +TE` primeros(T`) = {* , λ} siguientes(E`)= {$ , )}
3. E` λ primeros(E`) = {+ , λ} siguientes(T) = {$ , ) , +}
4. T  FT` primeros(T) = {( , id} siguientes(T`)= {$ , ) , +}
5. T` *FT` primeros(F) = {( , id} siguientes(F) = {$ , ) , + ,
6. T` λ *}
7. F  (E)
U NIV E RS IDA D NA CIONA L D E LOJA 18

8. F  id

TABLA DE ANÁLISIS

id + * ( ) $
E E  TE` E  TE`
E` E` +TE` E` λ E` λ
T T  FT` T  FT`
T` T` λ T` *FT` T` λ T` λ
F F  id F  (E)

Algoritmo para recorrer la tabla de análisis

1. Inicializar una fila con el símbolo de $ y el axioma de la gramática, y añadir el símbolo


de $ al final de la cadena de entrada.

2. Repetir el siguiente procedimiento:


a. Si Pila (P) y Entrada (E) = $ aceptar la cadena y salir.
b. Si son iguales y distintos del símbolo $, extraer un elemento de la fila y avanzar
una posición en la cadena E.
c. Si son distintos y la celda de la tabla de análisis T(P ,E) está vacía, emitir mensaje
de error y salir.
d. Si son distintos y en la celda de la tabla de análisis T(P ,E) aparece la producción
PX1X2.....Xn1 extraer P de la fila e insertar los símbolos X1X2.....Xn en la pila en el
orden inverso a como aparecen en la parte derecha de la producción.

Cadena: id + id

Paso Pila Entrada Acción


1 $E id + id $ Aplicar E  TE`
2 $ E`T id + id $ Aplicar T  FT`
3 $ E`T`F id + id $ Aplicar F  id
4 $ E`T`id id + id $ Continuar
5 $ E`T` + id $ Aplicar T`  λ
6 $ E` + id $ Aplicar E` +TE`
7 $ E`T + + id $ Continuar
8 $ E`T id $ Aplicar T  FT`
U NIV E RS IDA D NA CIONA L D E LOJA 19

9 $ E`T`F id $ Aplicar F  id
10 $ E`T` id id $ Continuar
11 $ E`T` $ Aplicar T`  λ
12 $ E` $ Aplicar E`  λ
13 $ $ Salir Cadena Aceptada

Ejemplo 2:

PRIMEROS SIGUIENTES

1. S  (A) primeros(S) = { ( } siguientes(S) = { $ }


2. A  CB primeros(A) = { x , (} siguientes(A) = {$ , )}
3. B  ;A primeros(B) = { ; , λ} siguientes(B) = {$ , ) }
4. Bλ primeros(C) = { x , (} siguientes(C) = {$ , ;}
5. Cx
6. CS

TABLA DE ANÁLISIS

( ) ; x $
S S  (A)
A A  CB A  CB
B Bλ B  ;A Bλ
C CS Cx

Cadena: ( x )

Paso Pila Entrada Acción


1 $S (x)$ Aplicar S  (A)
2 $)A( (x)$ Continuar
3 $)A x)$ Aplicar A  CB
4 $)BC x)$ Aplicar C  x
5 $)Bx x)$ Continuar
U NIV E RS IDA D NA CIONA L D E LOJA 20

6 $)B )$ Aplicar B  λ
7 $) )$ Continuar
8 $ $ Salir Cadena Aceptada

Ejercicio Propuesto:

PRIMEROS SIGUIENTES

A  Bc | cd P(A)  {b, a} S(A)  {$, c, d}


B  b|aA P(B)  {b ,a} S(B)  {b ,a}
C  aB P(C)  {a} S(C)  {d}
U NIV E RS IDA D NA CIONA L D E LOJA 21

CAPITULO 4: ANÀLISIS SEMÀNTICO

Comprobación de validez semántica. Esta es una de las fases más complejas del proceso de
compilación. Tiene que realizar varias tareas: la resolución de nombres, el tipo de las
expresiones y la evaluación L/R. La resolución de nombres consiste en comprobar que cada
identificador que usemos (ya sea una variable local, parámetro, atributo o método) ha sido
previamente declarado y además, si es visible desde el ámbito actual.

En cuanto a los tipos, hay que comprobar que en las expresiones donde intervengan 2
identificadores (asignación, suma, producto, concatenación, etc.) comprobar que ambos
identificadores aceptan dicha operación, que son de tipos compatibles. La evaluación L/R
consiste en que para cada asignación, cada componente puede aparecer o no en esa posición.
Por ejemplo, el resultado de una serie de operaciones no puede aparecer a la izquierda, solo
a la derecha, ya que no se puede asignar un valor al resultado de una serie de operaciones.

Tabla de símbolos: Una función esencial de un compilador es registrar los identificadores


de usuario (nombres de variables, de funciones, de tipos, etc.) utilizados en el programa
fuente y reunir información sobre los distintos atributos de cada identificador. Estos
atributos pueden proporcionar información sobre la memoria asignada a un identificador, la
dirección de memoria en que se almacenará en tiempo de ejecución, su tipo, su ámbito (la
parte del programa donde es visible), etc. Pues bien, la tabla de símbolos es una estructura
de datos que posee información sobre los identificadores definidos por el usuario, ya sean
constantes, variables, tipos u otros.

Dado que puede contener información de diversa índole, debe hacerse de forma que su
estructura no sea uniforme, esto es, no se guarda la misma información sobre una variable
del programa que sobre un tipo definido por el usuario. Hace funciones de diccionario de
datos y su estructura puede ser una tabla hash, un árbol binario de búsqueda, etc., con tal
de que las operaciones de acceso sean lo bastante eficientes.
U NIV E RS IDA D NA CIONA L D E LOJA 22

Gramáticas semánticas

Una gramática semántica es una gramática libre de contexto en la cual la elección de


símbolos no terminales y de reglas de producción son regidos tanto por funciones
sintácticas como semánticas. Muchos símbolos no terminales representan elementos
semánticos; esto es, que su posición depende también del tema que se este tratando. Una
gramática semántica puede ser usada por un sistema de análisis gramatical de la misma
forma en que pudiera ser usada una gramática estrictamente sintáctica. Las principales
ventajas son las siguientes:

Cuando el análisis gramatical esta completo, el resultado puede ser usado


inmediatamente sin otra etapa de proceso que pudiera ser requerida si una
interpretación semántica no hubiese sido realizada durante el análisis.

Muchas ambigüedades que pueden surgir durante un análisis gramatical estrictamente


sintáctico son evitadas al tomar en cuenta criterios semánticos durante el análisis.

Sin embargo, existen también algunas desventajas en el uso de gramáticas semánticas.

El número de reglas requeridas pueden llegar a ser demasiado grande ya que faltaría
muchas generalizaciones sintácticas.
Debido a lo anterior, el análisis gramatical puede ser muy lento y ocupar mucho espacio
en memoria.

Se puede observar que las gramáticas semánticas pueden ser útiles para producir
interfaces de subconjuntos de lenguaje natural.

Gramática con atributos.

Una gramática con atributos es una gramática de contexto libre cuyos símbolos pueden
tener asociados atributos y las producciones pueden tener asociadas reglas de evaluación
de los atributos.

Cada símbolo puede tener asociado un número finito de atributos.


Cada producción puede tener asociada un número finito de reglas de evaluación de los
atributos.
Los valores de los atributos deberán estar asociados con un dominio de valores.
Por lo general las gramáticas con atributos se escriben en forma tabular, con cada regla
Gramatical enumerada con el conjunto de ecuaciones de atributo o reglas semánticas
asociadas con esa regla de manera siguiente:
U NIV E RS IDA D NA CIONA L D E LOJA 23

Vous aimerez peut-être aussi