Está en la página 1de 6

Sintaxis y Semntica del Lenguaje

1
Gramticas

La tarea de proveer una descripcin bien concisa y entendible de un lenguaje de
programacin es difcil pero esencial para el xito de un lenguaje.
Uno de los problemas en describir un lenguaje es la diversidad de gente que debe
comprender esas descripciones. Las personas que implementan obviamente deben ser
capaces de determinar cmo se forman las expresiones, sentencias y unidades de
programas y tambin el orden de ejecucin de los mismos. La dificultad del trabajo que
tiene esta gente (los implementadores) est determinado en parte por la claridad y
complejidad de las descripciones del lenguaje.
La sintaxis de un lenguaje de programacin describe la forma correcta en la cual
las sentencias, expresiones y unidades de programa se deben escribir, mientras que la
semntica denota el significado de esas sentencias, expresiones y unidades de programa.
Por ejemplo la sintaxis de una sentencia Pascal if then es:

if <condicin> then <sentencia>

La semntica de esta sentencia es que si el valor actual de la condicin es
verdadero, se ejecutar <sentencia>.
Describir sintaxis es ms fcil que describir semntica, ya que existen notaciones
aceptadas universalmente para la descripcin de sintaxis y no as de semnticas.
En la definicin de un lenguaje de programacin la sintaxis usualmente se expresa
en BNF (Backus- Naur Form) y la semntica est expresada en lenguaje natural
(espaol, ingls, etc).
BNF es un ejemplo de un metalenguaje, es decir, un lenguaje usado para definir
otros lenguajes. Algol 60 fue el primer lenguaje que utiliz BNF para su descripcin
sintctica.
Una gramtica consiste de un conjunto de no-terminales, terminales y una serie de
reglas de produccin. Un no-terminal est definido en una regla de produccin, mientras
que un terminal es un smbolo del lenguaje que se est definiendo. En una regla de
produccin el no-terminal (que aparece en la parte izquierda) est definido en trminos
de una secuencia de no-terminales y terminales (que se encuentran en la parte derecha )

Ejemplo:

<dgito>::= 0|1|2|3|4|5|6|7|8|9
<letra>::= a|b|c|x|y|z
<identificador>::=<letra>|<identificador><dgito>|<identificador> <letra>

En BNF, un no-terminal se escribe entre < >, el smbolo ::= significa se define
como y el smbolo | significa o.
Estas reglas definen <dgitos> como uno de los smbolos 0, 1 al 9; <letra> como
una letra minscula e <identificador> se define como una nica letra, un identificador
seguido de una letra o un identificador seguido de un dgito.
As, el identificador ab1 puede ser derivado de <identificador>como sigue:





Sintaxis y Semntica del Lenguaje
2


<identificador>
<identificador><dgito>
<identificador> <letra>><dgito>
<letra><letra><dgito>
a <letra><dgito>
a b <dgito>
a b 1

En cada etapa, el no-terminal de ms a la izquierda es reemplazado por la parte
derecha de una de sus reglas de produccin, la secuencia de terminales y no-terminales
producidos en cada etapa en una derivacin se conoce como formas sentenciales. La
forma sentencia final (que ya no contiene smbolos no-terminales) se conoce como una
sentencia.
La estructura de una derivacin se muestra mejor en un rbol de derivacin .
El rbol de derivacin que muestra cmo ab1 de <identificador> es:

<identificador>
|
<identificador> <dgito>
| |
<identificador> <letra> 1
| |
<letra> b
|
a

Un lenguaje de programacin completo se define comenzando con un smbolo no-
terminal tal como <programa>, conocido como start symbol (smbolo inicial) y desde el
cual todos los posibles programas pueden ser derivados. En la prctica, los rboles de
derivacin se crean de dos formas posibles. En un esquema top-down, la sentencia
requerida se deriva del smbolo inicial tal cual como hicimos en el ejemplo (ab1). En un
esquema bottom-up, el punto de partida es la sentencia requerida, la cual es reducida al
smbolo inicial reemplazando las partes derechas por sus correspondientes partes
izquierdas de las reglas de produccin. Ambos esquemas se utilizan en la fase de
anlisis sintctico de muchos compiladores.
Una gramtica que define un lenguaje de programacin tiene un nmero finito de
reglas de produccin, pero como las reglas de produccin contienen recursin, es
posible generar infinitos programas posibles.
Ejemplo:

<ident>::=<ident><dgito>

Cuando se incluye recursin en las reglas de produccin hay que tener cuidado.
Hay que asegurarse que la recursin termine. Una regla de produccin tal como la
anterior se dice que es recursiva a izquierda. Existen definiciones similares pero
recursivas a derecha.


Sintaxis y Semntica del Lenguaje
3
Ambigedad

Un problema surge cuando se definen gramticas ambiguas. Esto es, una
gramtica que permite diferentes interpretaciones para la misma sentencia.

Ejemplo: Veamos la siguiente definicin para la sentencia condicional if

<sent-cond>::= if <condicin> then <sent>
| if <condicin> then <sent> else <sent>
<sent>::= <sent-cond> | begin <sent> end

La siguiente sentencia condicional tiene dos diferentes rboles de derivacin:
if <cond> then if <cond> then <sent> else <sent>

rbol 1
<sent-cond>
!
if <cond> then <sent>
|
<sent-cond>
|
if <cond> then <sent> else <sent>

rbol 2

<sent-cond>
|
if <cond> then <sent> else <sent>
|
<sent-cond>
|
if <cond> then <sent>

Como hay dos interpretaciones, la gramtica es ambigua. Una solucin podra ser que la
sentencia anterior se escriba:

if <cond> then
begin
if <cond> then <sent> else <sent>
end

if <cond> then
begin
if <cond> then <sent>
end
else
<sent>

Dependiendo de la interpretacin que se desee.
Otra solucin sera agregando un cierre del if (ya sea con un ; o con un endif)
Sintaxis y Semntica del Lenguaje
4

Ejemplo: Gramtica para una sentencia de asignacin

<asig>::= <id>:=<exp>
<id>::= A| B| C |D (tambin podra ser la definicin de identificador anterior)
<exp>::= <exp> + <exp>
| <exp> * <exp>
| <id>

Qu pasa con esta gramtica? Es correcta? Veamos el rbol de derivacin de la
siguiente sentencia.

A:= B + C * D

rbol 1
<asig>
|
<id> := <exp>
| |
A <exp> + <exp>
| |
<id> <exp> * <exp>
| | |
B <id> <id>
| |
C D

rbol 2
<asig>
|
<id> := <exp>
| |
A <exp> * <exp>
| |
<exp> + <exp> <id>
| | |
<id> <id> D
| |
B C

En general la ambiguedad sintctica de las estructuras de un lenguaje es un
problema, debido a que los compiladores basan la semntica de esas estructuras en su
estructura sintctica. Si una estructura del lenguaje tiene ms de un rbol de derivacin,
entonces, el significado de la estructura no podra determinarse unvocamente.

Cmo desambiguamos la gramtica anterior?
<asig>::= <id> := <exp>
<id>::= A| B| C| D
<exp>::= <exp> + <trmino> | <trmino>
<trmino>::= <trmino> * <factor> | <factor>
Sintaxis y Semntica del Lenguaje
5

Ejercicio: Hacer el rbol de derivacin para la expresin anterior para ver que es nico.
Pensar: Cmo se modificara esta gramtica para incluir parntesis en las expresiones?

Otras notaciones:

Existen otras formas de describir gramticas (otras notaciones). Por ejemplo, la
siguiente sentencia:

<exp>::= <exp> + <trmino>

Se escribira:

exp exp + trmino

Adems, existe otra forma ms grfica de representar gramticas que son diagramas
sintcticos. Son utilizados por los lenguajes Pascal y Ada. La simbologa es la siguiente:

Ejemplo:

El diagrama sintctico para una expresin sera:



No-terminales
terminales
exp
trmino
trmino +
-
trmino
factor
factor *
/
identificador
factor
Sintaxis y Semntica del Lenguaje
6


Ejercicio:
Escribir una gramtica para verificar la declaracin de variables de un programa Pascal.

Resolucin:
Bsicamente la sentencia es:
var
a:integer;
b,c:real;
d:alumno;

en gral puede ser una declaracin o un conjunto separados por ;. Y una declaracin
puede ser un identificador o un conjunto separados por ,:

<declaracin>::= var <lista-de-dcls>
<lista-de-dcls>::= <unaDeclaracin> | <unaDeclaracin>; <lista de-dcls>
<unaDeclaracin>::= <lista-de-ident> : <tipo>
<lista-de-ident>::= <ident> |<ident>, <lista-de-ident>
<ident>::= Se defini en la teora!!!
<tipo>::= ..no hacerlo, en este caso para ac

Las anteriores son slo reglas de produccin de la gramtica. La gramtica se
compone adems de reglas de:

G={ N, T, P, S}
donde:
T = {var, , , ; , : , etc}

N = { <declaracin>, <lista de-dcls>, <unaDeclaracin>, <lista-de-ident>,
<tipo>, <ident>}

P = { <declaracin>::= var <lista-de-dcls>
<lista-de-dcls>::= <unaDeclaracin> | <unaDeclaracin>; <lista-de-dcls>
<unaDeclaracin>::= <lista-de-ident> : <tipo>
<lista-de-ident>::= <ident> |<ident>, <lista-de-ident>
<ident>::= Se defini en la teora!!!
<tipo>::= ..no hacerlo, en este caso para ac
}
S = {<declaracin>}

También podría gustarte