Está en la página 1de 14

Unidad II

Sintaxis y Semntica de los LP


Introduccin
Un lenguaje de programacin es una notacin formal que permite especificar un modelo de resolucin de un programa.
Como en todo lenguaje, para describir un lenguaje de programacin hay que considerar tres aspectos:
Sintaxis: La forma o estructura de las expresiones, las sentencias y unidades de programas.
Semntica: El significado de las expresiones, las sentencias y las unidades de programas.
Pragmtica: El uso practico. Es la funcin que ocupa en la prctica.
El aspecto sintctico influye fuertemente en la facilidad con que los programas pueden ser escritos y en su legibilidad posterior.
La semntica de un lenguaje es la que determina que problemas se pueden resolver. Define el dominio de aplicacin.
DEF. ARMADA: "Un LP es un sistema notacional que se usa para describir computaciones en una forma legible tanto
para la mquina como para el humano, y que est conformado por un conjunto de smbolos y reglas sintcticas (que
especifican la FORMA o ESTRUCTURA de las expresiones, sentencias y unidades de programa) y semnticas (que
especifican el SIGNIFICADO de las expresiones, sentencias y unidades de programa)".
Concepto de Sintaxis.
Es un conjunto de reglas que especifican la forma de los programas vlidos en el lenguaje (enunciados, sentencias,
declaraciones y todas las construcciones permitidas por el LP). Tambin se puede decir que son el conjunto de reglas que
especifican si una sentencia est bien formada o no. La sintaxis de un lenguaje est definida por:
Reglas Lxicas: Especifican el conjunto de caracteres (como por Ej., operadores + ;- ;*) que constituyen el alfabeto
del lenguaje y la forma en que estos se combinan para formar palabras validas.
Por ejemplos:
Pascal considera que son iguales los caracteres en maysculas y minsculas. C, Ada y Java los consideran
distintos (son Case Sensitive).
En Pascal, <> es un operador valido. En C no (es !=). En Ada, /=.
Reglas Sintcticas: Especifican construcciones mas complejas a partir de la combinacin de elementos lxicos
(Ejemplo, x=x+1;)
Ambas reglas contribuyen a lo que es la apariencia externa del LDP e influyen en los criterios generales de sintaxis.
TERMINOLOGA
Lenguaje: conjunto de cadenas de caracteres vlidos, pertenecientes a algun alfabeto (ASCII, Unicode...)
Sentencia: cada una de esas cadenas.
Lexemas: unidades sintcticas de ms bajo nivel (+, *, else, begin, contador, suma...)
Token: categora de lexemas (identificador, simbolo_de_operador...)

Criterios Generales.
El propsito primordial de la sintaxis es prever una notacin para la comunicacin entre el programador y el procesador de
lenguajes de programacin.
Legibilidad: La estructura subyacente del algoritmo y los datos que el programa representa deben quedar en manifiesto al
inspeccionar el texto del programa. Se suele decir que un programa legible es autodocumentable, o sea, es entendible sin
documentacin independiente alguna. Es de gran ayuda que las grandes diferencias sintcticas subyacentes reflejen diferencias
semnticas. Esto aporta legibilidad.

Facilidad de Escritura: Especifica la facilidad con que un lenguaje puede usarse para crear programas para un dominio de
problema elegido. La mayora de las caractersticas del lenguaje que afectan la legibilidad tambin afectan la facilidad de
escritura. Las caractersticas del LP que afectan a la legibilidad afectan a la facilidad de escritura, debido a que son criterios
que se contraponen. Ms fcil de escribir y ms difcil de leer y viceversa. Las estructuras sintcticas concisas, claras y
regulares mejoran la facilidad de escritura.
Concisas: que no sean muy extensas a la hora de escribir.
Claras: si son entendibles, se escriben ms naturalmente.
Regulares: que no presenten variantes o excepciones dependiendo del contexto. Por ejemplo el IF de Java que
permite obviar las llaves en caso de que haya una sola sentencia dentro de la estructura (esto genera que la estructura
no sea regular).
Las conversiones sintcticas implcitas que permiten dejar sin especificar declaraciones y operaciones (es decir, hacer
declaraciones implcitas) hacen a los programas ms cortos y fciles de escribir pero dificultan su lectura. Ciertas
redundancias son tiles en la sintaxis de los lenguajes de programacin porque facilita la lectura del programa y tambin
permite revisar en busca de errores durante la traduccin. La desventaja es que la redundancia dificulta su escritura. Ejemplo:
declaracin implcita en Fortran, busca reducir la redundancia. Si pones la variable pepe y despus escribs pepo por
equivocacin, considera un nuevo nombre de variable. En cambio en Pascal se requiere una declaracin explcita de cada
variable, entonces ante el caso anterior caracteriza el nombre de variable mal escrito como un error.
Una sintaxis es redundante si comunica el mismo elemento de informacin en ms de una forma.
Ventaja: facilita la lectura del programa y permite buscar errores durante la traduccin. Ejemplo, Pascal (debo
declarar) int pepe; int pepo;
Desventaja: hay que escribir mas (--Facilidad_Escritura).
Facilidad de verificacin: esta estrechamente relacionada con la legibilidad y la facilidad de escritura. Entender cada
enunciado de un lenguaje es fcil, pero el proceso de crear programas correctos es difcil. Lo importante es darnos cuenta de
los errores de lgica (legibilidad). En cuanto a los errores sintcticos se ocupa el compilador. Los entornos de programacin
facilita la verificacin de errores. Por ejemplo, Java. Algunos editores tienen debuggers incorporados.
La facilidad de traduccin: se relaciona con las necesidades del traductor (Compilador del programa fuente o programa
objeto) que procesa el programa escrito. La clave para una traduccin fcil es la regularidad de la escritura. La regularidad del
LP ayuda la traduccin (hay menos excepciones que verificar). Un ejemplo, Lisp no es muy legible ni especialmente fcil de
escribir pero resulta muy fcil de traducir, a causa de sus pocas construcciones (regularidad). Por lo tanto, la traduccin de los
programas se dificulta conforme aumenta el numero de construcciones sintcticas. Otro ejemplo, Cobol es muy difcil su
traduccin a causa del gran numero de formas de enunciados y declaraciones que se permiten (y que sea tan cercano a un
lenguaje humano).
add 1 to A
move to A
A++ mas fcil de traducir.
compute A = A + 1
Si hay varias posibilidades de resolver algo, ayuda al programador pero el traductor va a tener que hacer ms pasos.
Carencia de ambigedad: la ambigedad se da al tener una construccin con 2 o ms interpretaciones posibles. El ejemplo
mas tpico es el IF anidado de Java. La carencia de ambigedad ayuda a la legibilidad y tambin a la facilidad de escritura y
simplifica el proceso de deteccin de errores debido a que las construcciones difieren a nivel sintctico unas de otras. Cuando
hay ambigedad se soluciona con el uso adecuado de delimitadores o de convenciones (el end del final cierra el primer begin
encontrado hacia arriba, no se como explicarlo bien).
Elementos.
Conjunto de caracteres: son los smbolos que estn permitidos dentro de la sintaxis. La eleccin de este conjunto es lo
primero que se hace al proyectar una sintaxis de lenguaje. Generalmente est constituido por:
letras maysculas y/o minsculas: algunos toman ambas y las distinguen y otros no (si lo hacen, se dice que son Case
Sensitive)
Dgitos: del 0 al 9.
Caracteres especiales: (+, -, *, /, etc.) ac es donde empiezan las grandes diferencias. Se eligen para formar los
operadores, delimitadores, Etc. del LP. La mayora toma un subconjunto de caracteres de algn alfabeto conocido
(ASCII o Unicode).
Delimitadores: elemento sintctico que se usa para sealar el principio o el final de alguna construccin. Algunos vienen en
pares (como las llaves) para indicar inicio o fin de alguna estructura y otros solos que marcan el fin de algo (como el ;). Las
razones por las cuales se usan delimitadores son:
Eliminar ambigedades en estructuras en apariencia semejantes a nivel sintaxis concreta.
Simplificar el proceso de traduccin.
Mejorar la comprensin y legibilidad.
Alterar el orden de evaluacin de los operadores modificando las reglas de precedencia y asociatividad.

Identificadores: Los identificadores mas aceptados son una cadena de letras y dgitos, que comienza con una letra. Las
variaciones en los lenguaje se debe principalmente a la inclusin de caracteres especiales (. o -) para mejorar la legibilidad y en
restricciones de longitud. Los identificadores de poca longitud, no son muy nemotcnicos y restringen la legibilidad del
programa. Ejemplo.
Fortran (6 caracteres).
Pascal no permite el mismo nombre a 2 funciones, aunque tengan distintos parmetros. El lenguaje determina la
vigencia de uno.
La sintaxis para identificadores es general para todos los lenguajes.
Restricciones de longitud: restringen la legibilidad.
Inclusin opcional de caracteres especiales: mejoran la legibilidad.
Smbolos de operadores: casi todos los lenguaje adoptan el + y el para representar las dos operaciones aritmticas bsicas o
alguna combinacin de ellos, en las dems no hay uniformidad. (por ejemplo .EQ. y ** de Fortran, para igualdad y
exponenciacin).
Palabras claves y reservadas: una palabra clave es un identificador que se usa como una parte fija de la sintaxis de un
enunciado. Por ejemplo IF, DO en Fortran. Una palabra clave es una palabra reservada (pero puede no serlo). En caso de no
serlo, se puede usar como un identificador elegido por el programador (las claves pueden usarse como identificador, eso quiere
decir). Casi todos los lenguajes emplean actualmente palabras reservadas, con lo cual se mejora la capacidad de deteccin de
errores de los traductores. El anlisis sintctico durante la traduccin se facilita usando palabras reservadas. Por ejemplo, en
Fortran DO o IF no son palabras reservadas, por lo que pueden no ser un enunciado de iteracin o condicional sino nombres de
variables. Una dificultad se presenta cuando se quiere introducir nuevas palabras reservadas en los enunciados al elaborar un
estndar actualizado. Las versiones antiguas llevaran ese identificar como variable, y ya no es sintcticamente correcto, no
obstante que no ha sido modificado. En Cobol, todas son palabras reservadas. Otra dificultad se presenta cuando se quiere
introducir nuevas palabras reservadas.
Palabras pregonadas: son palabras opcionales que se insertan en los enunciados para mejorar la legibilidad. Por ejemplo en
Cobol el GOTO (TO es opcional ya que no transmite informacin); otro ejemplo THEN y PERFORM en Cobol.
Comentarios: la inclusin de los comentarios en los programas es una parte importante de su documentacin. Al permite
documentacin, favorece el mantenimiento. Un lenguaje puede permitir comentarios de varias maneras:
Renglones de comentarios por separado en el programa. Ejemplo Fortran.
Delimitadores por marcadores especiales, como */ y */ de C sin que importen los limites del rengln.
Comenzando en cualquier punto de un rengln pero ya concluidos a final del mismo como el en Ada, // en C++ o !
en Fortran 90. esta opcin incluye a la primera.
La segunda alternativa tiene desventaja de que la falla de un delimitador de conclusin en un comentario transforma
los enunciados siguientes en comentarios.
Espacios en blanco: en algunos LP cumplen un rol sintctico importante dado que se usan como separadores o inclusive como
operadores y en otros, no tienen utilidad. Por ejemplo, en Snobol 4, la operacin primitiva de concatenacin se representa con
un espacio en blanco, el cual tambin se usa como separador entre elementos de un enunciado (ambiguo). En FORTRAN, no
son significativos.
Formato de campos libres y fijos: una sintaxis es de campo libre si los enunciados se pueden escribir en cualquier parte de un
rengln de entrada sin que importe la posicin sobre el rengln o las interrupciones entre renglones. Los campos libre permiten
mayor facilidad de escritura. Una sintaxis de campo fijo utiliza la posicin sobre un rengln de entrada para transmitir
informacin. Es decir que cada elemento debe aparecer dentro de una parte dada, de un rengln de entrada (comn en lenguaje
ensambladores). Los campos fijos brindan mayor facilidad de traduccin. Es ms comn el uso de un formato de campo fijo
parcial, por ejemplo:
Fortran: los 5 primeros caracteres de un rengln, estn reservadas para cada rotulo de enunciado.
Snobol 4: los rtulos de enunciados, comentarios y renglones de continuacin se distinguen por un carcter en la
primera posicin del rengln.
Actualmente, se utiliza mucho mas el campo libre que el fijo.
Expresiones: Son construcciones sintcticas compuestas de operadores y operandos, de cuya evaluacin se obtiene un valor.
En los Lenguajes Imperativos como C, las expresiones constituyen las operaciones bsicas que permiten que cada enunciado
modifique el estado de la maquina, hasta llegar a un estado final. En lenguajes aplicativos como ML o Lisp, las expresiones
forman el control bsico de secuencia que dirige la ejecucin de programas. Las expresiones son los bloques sintcticos
bsicos de construccin a partir de los cuales se construyen enunciados.

Enunciados: Son las sentencias que permiten realizar operaciones dentro de los LP imperativos. La sintaxis tiene un efecto
decisivo sobre la regularidad, legibilidad y facilidad de escritura. La mayora de los LP utilizan diferentes estructuras
sintcticas para representar cada tipo de enunciado. Su ventaja es que se puede hacer que cada estructura sintctica, exprese de
manera natural las operaciones que intervienen. Por ejemplo Cobol, en subestructuras participan palabras claves especiales,
palabras pregonadas, construcciones alternativas, elementos optativos, Etc. Esto aporta legibilidad. (Otros utilizan un formato
nico: el cual hace nfasis en la regularidad. Por ejemplo el Snobol4, cuya sintaxis bsica es el enunciado de sustitucin por
concordancia de patrones.)
Sintaxis Abstracta y Concreta.
Algunas construcciones del lenguaje en diferentes lenguajes de programacin tienen la misma estructura conceptual pero
difieren en su apariencia a nivel lxico. Por ejemplo, un fragmento en:
En C:

While (X = Y){

En Pascal: While X<>Y


Begin
End

Que difieren en:


Los delimitadores: en C las llaves y en Pascal el par Begin-End
La condicin de iteracin: en C debe ir encerrada entre parntesis y en Pascal, no.
El operador que indica distinto: en C es = y en Pascal <>
Cuando dos construcciones difieren slo a nivel lxico (begin..end vs. {..} y <> vs. !=), podemos decir que ellas tienen la
misma sintaxis abstracta, pero difieren a nivel de sintaxis concreta.

Sintaxis abstracta: la que representa la estructura que subyace bajo las construcciones. En este caso, es una iteracin
controlada por condicin.
Sintaxis concreta: la manera en que se escribe en cada lenguaje. En este caso una iteracin controlada por condicin
en C y Pascal.

(Aunque conceptualmente la sintaxis concreta puede ser irrelevante, pragmticamente 1 puede afectar la utilidad de un lenguaje
y la legibilidad de los programas. Por ejemplo, el smbolo ''distinto'' es intuitivamente mas legible que !=. No es lo mismo
usar un espacio en blanco para denotar una suma, que el operando +.)
Mtodos formales para describir la sintaxis de los LP: gramticas libres de contexto, BNF y EBNF, diagramas
sintcticos y rboles de anlisis sintctico. Beneficios y restricciones.
Para describir la sintaxis de los LP existen mtodos formales como gramticas libres de contexto, BNF y EBNF, diagramas
sintcticos y rboles de anlisis sintctico. La mayora de las descripciones de los LP son informales . Estn expresadas en
forma narrativa en lugar de usar una notacin rigurosa. Las descripciones informales tienen una serie de desventajas:
Pueden resultar imprecisas, vagas y ambiguas para expresar claramente los detalles de sintaxis de un LP.
Para alcanzar exactitud, se introduce demasiada palabrera y se obtienen descripciones largas, poco prcticas y
tediosas a la hora de consultarlas. Esto se da al carecer de un alto grado de poder expresivo.
Por ser imprecisas, pueden dar lugar a varias interpretaciones y, por ende, a varias implementaciones diferentes.
Las notaciones formales que definen la sintaxis de un LP son un conjunto de reglas (producciones) que especifican la serie de
caracteres (elementos lxicos) que forman palabras y construcciones permisibles dentro de determinado LP usando una
notacin estricta. Las ventajas que traen aparejadas el uso de este tipo de notaciones:
Referencia para usuarios: brindan un documento con informacin fiable, concisa y no ambigua.
Referencia para implementadores: como se mencion anteriormente, distintas interpretaciones dan lugar a distintas
implementaciones. Son mucho ms tiles para estandarizar debido a que carecen de ambigedad.
Herramienta para prueba de programas: testean y verifican los programas. Dichas herramientas requieren que los
constructores del LP estn formalizados rigurosamente. Deben provocar una respuesta predecible.
Prueba de implementaciones: para analizar la correctitud de un programa, los requerimientos del sistema tienen que
haber sido definidos rigurosamente.
Herramienta para implementaciones automticas: estas herramientas permiten automatizar parte de la
construccin de los traductores. Para esto, necesitan una documentacin formal a donde recurrir y no debe ser
ambigua sino surgen varias implementaciones.
Diseo de un LP: en una notacin formal, se permite visualizar ms claramente si el LDP fue bien diseado o no,
viendo los aspectos tales como simplicidad, poder expresivo, etc.

No esta en filmina. Sintaxis pragmtica: el uso prctico que se le da. Ej., definir una variable al principio del programa o al principio de un bloque
(cambia el alcance de la misma)
4

Al tratar formalmente las estructuras provistas por un LP nos permite detectar ms naturalmente irregularidades que,
inclusive pueden llegar a no ser evidentes en una especificacin informal. Adems nos permite detectar semejanzas en
estructuras aparentemente muy distintas y diferencias en estructuras aparentemente similares de una manera ms sencilla.
Una notacin informal est escrita en un lenguaje conocido y una formal en uno que debemos aprender a usar por lo que
se suma la complejidad de aprender a utilizar y comprender el LP (la complejidad de aprender, comprender y utilizar la
notacin formal). Adems los smbolos utilizados para describir al lenguaje usado en la notacin formal pueden
confundirse debido a la similitud de los mismos. Existen algunas facilidades que todava no han sido modeladas por
ningn mtodo de especificacin formal. Por ejemplo la concurrencia, excepciones, Etc.
Gramticas libres de contexto.
Una gramtica libre de contexto es una gramtica formal, en la que cada regla de produccin es de la forma: V w , donde V
es un smbolo no terminal y w es una cadena de terminales y/o no terminales 2. El trmino libre de contexto se refiere al hecho
de que el no terminal V puede siempre ser sustituido por w sin tener en cuenta el contexto en el que ocurra. Un lenguaje formal
es libre de contexto si hay una gramtica libre de contexto que lo genera. Las GLC definen un conjunto de reglas que definen
todas las construcciones validas que puede aceptar un lenguaje.
G = (Vt, Vn, P, S) donde:
Vt es un conjunto finito de terminales
Vn es un conjunto finito de no terminales
P es un conjunto finito de producciones
S (perteneciente a Vn) el denominado Smbolo Inicial
los elementos de P son de la forma Vn (Vt U Vn)
Ejemplo:

La notacin ms frecuentemente utilizada para expresar gramticas libres de contexto es la BNF.


BNF y EBNF.
La BNF es un metalenguaje3 muy utilizado para definir la estructura sintctica de un lenguaje de programacin. La BNF que
fue creada para definir la estructura sintctica del lenguaje de programacin Algol 60. En BNF, las reglas estn formadas por:
Palabras y smbolos del lenguaje.
Metasmbolos: ::=, <, >, |, * y +. (smbolos propios de las gramticas BNF y EBNF y que no son parte del lenguaje
descripto. Por ejemplo: ::=, |, etc.)
Metavariables: (secuencia finita de smbolos que se usan para describir palabras del lenguaje descripto. Estn
encerradas entre los metasmbolos <,>.
Al lenguaje descrito, se lo llama lenguaje sujeto y al que describe, lenguaje objeto. Dichas gramticas permiten generar el
conjunto de todas las cadenas que pueden constituir un programa en el lenguaje descrito y as decidir si un programa es o no
vlido de acuerdo a dichas cadenas.)
La parte izquierda de una regla es siempre una metavariable, asociada a la construccin que define la regla.
Si una misma metavariable puede ser definida a travs de dos o ms alternativas se separan por el metasmbolo |.
Ejemplo.
<entero> <dgito>
<entero> <entero> <dgito>
<dgito> 0
<dgito> 1
<dgito> 2
...
2
3

"" = "Se define como".


Un metalenguaje consta de Metasmbolos (son smbolos que aparecen en la especificacin y no son parte del lenguaje sujeto ) y Metavariables (son
palabras que se usan para denotar secuencias de smbolos y palabras del lenguaje sujeto)
5

La gramtica BNF, se puede usar para hacer un trabajo sorprendentemente bueno al definir la sintaxis de casi todos los
lenguajes de programacin. Las reas de sintaxis que no pueden definirse con una gramtica BNF son aquellos que implican
dependencia contextual. Por ejemplo, las restricciones el mismo identificador no puede declararse 2 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 2 dimensiones no puede ser referido con 3 subndices son todas no explicables usando solo una gramtica
BNF.
SIN EMBARGO, la gramtica BNF no constituye una notacin ideal para comunicar las reglas de sintaxis de lenguajes de
programacin al programador, debido a su sencillez. Esto obliga a una representacin bastante poco natural de las
construcciones sintcticas comunes de elementos optativos, elementos alternativos y elementos repetidos. Debido a esto, han
surgido extensiones de la BNF, que dan cabida a descripciones ms fciles de los lenguajes, reducen el tamao e incrementar la
claridad de las especificaciones, el metalenguaje puede enriquecerse con algunos recursos adicionales. Por ejemplo, una de las
extensiones ms tiles es usar corchetes para indicar secuencias opcionales, el uso de llaves para indicar iteracin y el uso de
reglas alternativas.
Alternativas de una regla. En vez de dar varias reglas BNF con la parte izquierda idntica, se da una sola regla BNF
con varias alternativas, usando un pipe. Por ejemplo:
<entero> <digito> | <entero> <digito>
<digito> 0|1|2|3|4|5|6|7|8|9
Llaves. Se indica que lo que encierran {xxx} se puede repetir 0 o un numero arbitrario de veces. Por ejemplo.
<listaparametro> <parmetro> | <listaparametro> <parmetro>
quedara
<lista parmetro> <parmetro> { <parmetro> }
Corchetes. Son un paso particular de las llaves. Es decir, que encierran una cosa que es opcional, puede estar presente
(una vez) o no. Ejemplo.
<sentencia-if> if <EB> then <sentencia> [else <sentencia>]
Esto es lo que se conoce como EBNF o BNF extendido.
Remarquemos que ninguno de estos mecanismos aumenta el poder expresivo de las BNF; slo permiten obtener
especificaciones ms reducidas y claras. El peligro que encierran estas extensiones es que los smbolos del metalenguaje se
confundan con los del lenguaje sujeto.
EBNF. Tiene una notacin idntica al BNF y adems agrega otros metasmbolos:
+: indica que debe ocurrir al menos una iteracin (1 a varias)
*: indica iteracin pero se puede dar el caso de que no exista ninguna (0 a varias)
[ y ]: para indicar secuencias opcionales. Pueden o no formar parte de la construccin.
{ y }: indican iteracin. Deben estar definidas con un + o un *.
Ninguno de estos mecanismos agrega o aumenta el poder expresivo de las BNF, solo permite producciones ms claras y
reducidas. Como desventaja, se puede marcar que los metasmbolos agregados se pueden confundir con los del LDP definido
(o lenguaje sujeto).

Diagramas (Grafos) Sintcticos.


Son una representacin visual de la informacin descripta en una notacin BNF y EBNF solo que son ms legibles y ms
fciles de visualizar debido a que son modelos visuales.
Notacin de los grafos sintcticos:
Los smbolos terminales se representan encerrados en crculos.
Los no terminales, con rectngulos.
Una cadena es vlida si puede ser generada cruzando un diagrama de sintaxis desde la entrada hasta la salida.

Derivacin.
Es una aplicacin repetida de reglas, que comienza por el smbolo inicial y termina con una sentencia. Cada cadena de
smbolos en la derivacin es una forma sentencial. Un sentencia es una forma sentencial que tiene solo smbolos terminales.
Una derivacin izquierda es aquella en la que se expande el no terminal que esta mas a la izquierda en cada forma sentencial.
Una derivacin derecha es aquella en la que se expande el no terminal que esta mas a la derecha en cada forma sentencial.
rbol de anlisis sintctico.
Permiten la representacin grfica de las derivaciones de una gramtica. (Se utilizan en la construccin de traductores). Para
determinar si una cadena dada representa de hecho un programa sintcticamente valido en el lenguaje definido por una
gramtica BNF, se deben usar las reglas gramaticales para construir un rbol de Anlisis Sintctico, de la cadena. Si la cadena
se puede analizar sistemticamente en forma satisfactoria, entonces est en el lenguaje, sino se puede encontrar una forma de
analizar la cadena, esta no se encuentra en el lenguaje. Podemos decir, que un rbol sintctico es una representacin grfica del
proceso de reconocimiento o parsing de una sentencia.
En los rboles de derivacin:
El axioma representa la raz del rbol.
Los nodos hojas son smbolos terminales de la gramtica.
Los nodos intermedios son smbolos no terminales de la gramtica.
Y se colocan tantas ramas como smbolos (terminales y no terminales) haya concatenados en la parte derecha de la
regla. Estos van ordenados de izquierda a derecha, en el mismo orden que aparecen en la regla.
Solo se pueden definir rboles de derivacin para gramticas de tipo1 o mas restrictivas.

Una cadena asociada a ms de una rbol de derivacin se dice ambigua y la regla que permite construirla se llama tambin
ambigua. En ocasiones la ambigedad no afecta la semntica y puede tolerarse. En otros casos la ambigedad debe quedar
eliminada. Por ejemplo, una expresin podra definirse sintcticamente como:
<Expr> ::= x | y | z | <Expr> + <Expr> | <Exp> * <Exp> | (<Exp>)
Entonces una expresin como: x + y * z tendra dos derivaciones posibles, es decir existen dos rboles sintcticos que la
representan (ergo, es ambigua). Y debe quedar eliminada porque produce derivaciones que no son semnticamente
equivalentes. Si usamos el rbol de derivacin para indicar los niveles de precedencia de los operadores, no podemos tener
ambigedad.
7

Introduccin de semntica (No est en filminas)


La Semntica denota el significado que tienen las diversas estructuras sintcticas que conforman al programa (sentencias,
estructuras y unidades de programa). Por ejemplo la cadena DD/DD/DDDD forma parte de una fecha (siendo D un dgito). La
cadena 05/08/2007 es una fecha. Pero hay que tener cuidado porque en algunas partes del mundo, esa fecha representa el da
05 del mes 08 y en otros el da 08 del mes 05. Es decir que algunos toman DD/MM/AAAA y otros MM/DD/AAAA. Se
necesita de reglas para describir semnticamente un LP. Reglas que deben describir como tratar cada construccin sintctica.
Tal es el caso de la fecha del prrafo anterior.
Estas reglas se pueden definir:
Informalmente: se define cada uno de los constructores usando un lenguaje natural. Esto trae aparejado ambigedad,
alta propensin de errores y descripciones incompletas o muy verborrgicas.
Especificando el comportamiento de un procesador semntico abstracto: dicho procesador ejecuta instrucciones
en un LP. Es una buena alternativa debido a que es un enfoque sencillo de implementar y permite reconocer las
dificultades de implementacin.
Formalmente: se especifica un metalenguaje para describir la semntica. Naturalmente el hecho de utilizar
descripciones formales trae aparejada una serie de ventajas:
Proporciona mecanismos para determinar cuando la definicin de un lenguaje es completa y correcta.
Puede producir un documento procesable por la mquina.
Permite desarrollar herramientas automticas que ayudan a procesar, verificar e implementar un LP.
Aunque tiene una desventaja:
Son descripciones que requieren de mucho esfuerzo para su definicin y producen un resultado muy difcil de
comprender sin el estudio y anlisis extenso.
Limite entre la Sintaxis y la Semntica
El lmite exacto entre los trminos sintaxis y semntica es algo arbitrario. Existen diferentes criterios:
Considerar sintcticos aquellos aspectos que se resuelven en compilacin y semnticos todos los dems (en
ejecucin). Se tienen en cuenta los tiempos en los que un programa va a ser procesado.
Compilacin. Un buen compilador realiza tantos chequeos como le sea posible y posterga hasta la ejecucin
controles que no puede ejecutar en ese momento.
Ejecucin.
Entonces, todos los aspectos lingsticos tenidos en cuenta durante la compilacin, pueden ser considerados
sintcticos.
Y todas las cuestiones que se resuelven en ejecucin son de naturaleza semntica.
Para este criterio, cuestiones como: declaraciones mltiples, identificadores no declarados e incompatibilidad de
tipos en operaciones:
En lenguajes con ligadura esttica, formaran parte del anlisis sintctico.
En lenguajes con ligadura dinmica, formaran parte del anlisis semntico.
Asociar sintaxis con todos los aspectos libres de contexto del lenguaje y semntica con los sensibles al contexto.
(Se ha definido la sintaxis como todo lo que se puede definir mediante una gramtica libre de contexto, y semntica
como todo lo dems que no se puede definir as.)

Elementos de la semntica de los LP: variables, valores y referencias, expresiones.


Variable: una variable corresponde a una regin de memoria que se utiliza para almacenar valores que manipula el programa.
Las reglas sintcticas especifican como pueden nombrarse las variables. Una declaracin introduce una variable dndole un
nombre y especificando algunas de sus propiedades semnticas(como por ejemplo, las operaciones vlidas con ella).
Valores y Referencias. Se refiere a qu se asocia a una variable. Qu valor se asocia con una variable? Veamos una sentencia
de asignacin de la forma: X = Y:
En el lado derecho de esta asignacin necesitamos el contenido de celda de memoria a la que hace referencia Y.
En el lado izquierdo necesitamos la direccin de memoria a la que hace refenrencia la variable X.
As es como surgen los conceptos de:
LValue o Left Value: denota una locacin de memoria. En el caso anterior, se necesita del LValue de X para poder
realizar la asignacin.
RValue o Right Value: denota el contenido de una locacin de memoria (el valor almacenado).
Las variables tienen tanto LValue como RValue. Los literales (nmeros, caracteres, etc) no tienen LValue.
Una de las reglas semnticas indica que para que una sentencia de asignacin sea vlida, a la izquierda debe haber un
objeto que tenga LValue porque sino da error de compilacin. Por ejemplo 3=X no es vlida porque el literal 3 no
tiene LValue.
Expresiones. Estructuras sintcticas que permiten combinar valores y operadores para calcular nuevos valores. Existen
expresiones de diferentes tipos (aritmticas, relacionales..., Etc.). El lenguaje especifica las reglas sintcticas y semnticas que
permiten construir las expresiones. Dentro de dicha especificacin, puede definir el orden en que se van a realizar las
operaciones dentro de una expresin. Algunos LP definen cierto orden y otros dejan que el implementador lo decida. En este
ltimo caso, se le exige al programador mayor cuidado debido a que un programa puede producir el resultado correcto con un
compilador y puede ser que en otro directamente no compile o que produzca otro resultado.
Semntica formal.
Es la descripcin rigurosa del significado o comportamiento de las construcciones de un LP. Consiste en el uso de un
metalenguaje para definir rigurosamente las reglas semnticas de un LP. Dicha definicin debe ser inequvoca, no debe dar
lugar a ambigedades. Una definicin formal no necesariamente es legible. La formalidad no va de la mano con la legibilidad.
Mayor formalidad, menor legibilidad. Importancia de una definicin formal de la semntica:
Facilitar a los diseadores de LP una forma no ambigua y consistente de definir un lenguaje.
Estandarizar un lenguaje por medio de una definicin semntica no ambigua para que el lenguaje no sufra variaciones
de implementacin en implementacin.
Facilitar la comprensin de un lenguaje por parte del programador.
Proporcionar los fundamentos para prueba de correctitud tanto de los compiladores como de los programas.
Se distinguen dos tipos: semntica esttica y semntica dinmica.
Semntica esttica.
Se llama as porque los chequeos se hacen en tiempo de compilacin. Sirve para definir aspectos sensibles al contexto como
incompatibilidad de tipos o la correspondencia de etiquetas, que con BNF sera difcil o imposibles de representar. Determina
las formas legales de un programa. Utiliza como herramienta la gramtica de atributos.
Hay algunas caractersticas de la estructura de los lenguajes de programacin que son difciles de describir con BNF,
Y algunas que son imposibles. Como ejemplo, de una regla de lenguaje que no puede ser especificada en BNF,
considere la regla comn de que todas las variables deben ser declaradas antes de ser referenciadas. Es probable que
esta regla no pueda ser especificada en BNF.
Otro ejemplo es la regla que el end de un subprograma en Ada es seguido por un nombre, que debe ser el mismo
nombre que el del subprograma.
Estos dos problemas ejemplifican la categora de reglas de lenguaje llamados reglas de semntica esttica. La
semntica esttica de un lenguaje esta solo indirectamente relacionado al significado de los programas durante la
ejecucin, adems, tiene que estar hecha con formas legales de programas.
En muchos casos, la regla de semntica esttica de un lenguaje determina sus restricciones de tipo. La semntica
esttica es tan nombrada porque el anlisis requerido para chequear estas especificaciones pueden ser hechas a
momento de la compilacin.

Gramtica de atributos: conceptos bsicos.

Debido a los problemas de describir la semntica esttica con BNF, se inventaron una variedad de mecanismos para
esa tarea.
La Gramtica de Atributos, fue diseada por Knuth en 1968, para describir la sintaxis y la semntica de los
programas.
Una gramtica de atributos en una notacin ms poderosa que BNF porque permite formalizar aspectos sensibles al
contexto.
Bsicamente una gramtica de atributos es una GLC a la que se le han agregado tres elementos:
Atributos: Describen propiedades semnticas de las estructuras.
Reglas: Expresan la relacin entre los atributos ligados a la parte izquierda y derecha de una descripcin.
(Expresan las relaciones entre los atributos ligados a ambas partes de las reglas de produccin).
Condiciones: Permiten especificar los aspectos sensibles al contexto de un lenguaje de programacin.

Algunas caractersticas:
Cada smbolo No Terminal de una gramtica libre de contexto puede ser asociado a un conjunto finito de atributos.
Cada atributo puede ser referenciado a travs de un nombre y tiene asociado un dominio de valores. (Un atributo
puede estar vinculado a varios smbolos No Terminales.)
Cada aparicin de un atributo puede estar ligada a una condicin lgica que exprese una restriccin (sobre las
estructuras o constructores) que debe ser satisfecha por el valor de ese atributo. Estas condiciones expresan
restricciones sobre los constructores definidos por los smbolos No Terminales.
Semntica dinmica: operacional, axiomtica y denotacional.
Semntica dinmica:
El anlisis requeridos para verificar las especificaciones definidas se hacen en tiempo de ejecucin (algunas no se
pueden hacer en compilacin y otras no conviene).
Es decir, determina y describe el significado de las expresiones, sentencias y unidades de programas en tiempo de
ejecucin.
No existe una nica notacin universal para la semntica dinmica debido a que cada una est orientada a apoyar a las
distintas personas intervinientes en el desarrollo y uso de un LP.
Las definiciones formales son tiles debido a que orientan y dan a conocer que hace cada construccin en un LP
(lectura de manuales). Se sigue buscando una notacin universal para todos los intervinientes en un LP.
Hay varias razones diferentes por las que uno podra estar interesado por la descripcin de semntica. Primero, los
programadores necesitan saber precisamente que definiciones de un lenguajes hay. Generalmente, ellos se enteran leyendo las
explicaciones en ingles en los manuales del lenguaje, que suelen ser imprecisos e incompletos. Los escritores de compiladores
tambin determinan la semntica de los lenguajes para los cuales ellos escriben los compiladores desde descripciones en
ingles. Estas descripciones informales son usadas debido a la complejidad de las descripciones de la semntica formal. No
existe ninguna notacin universalmente aceptada para describir semntica dinmica. Es un objetivo de la investigacin
encontrar un formalismo de la semntica que pueda ser usado por los programadores u escritores de compiladores.
Se han realizado trabajos experimentales en la generacin automtica de compiladores desde las descripciones semnticas del
lenguaje.
Las semnticas dinmicas son: operacional, axiomtica, y denotacional.
Semntica Operacional:
La idea de la semntica operacional es describir el significado de un programa, ejecutando sus sentencias sobre una maquina
ya sea real o simulada. Los cambios que ocurren en el estado de la maquina cuando se ejecuta una sentencia dada, definen el
significado de la sentencia. Es un mecanismo que da una salida con un programa y unos datos de entrada arbitrarios.
(Est orientada al implementador, le sirve para plantear optimizaciones.)
Acta como un intrprete de un LP. (Debe hacerlo lo ms eficientemente posible. Baja las construcciones de alto nivel
a un nivel ms cercano al lenguaje mquina y se analiza su comportamiento.)
Una definicin semntica operacional actuara como una especie de intrprete de un lenguaje.
Describir la semntica operacional de las sentencias de un lenguaje de alto nivel requiere la construccin de una computadora
virtual o real. El hardware de una computadora es un interprete puro para su lenguaje maquina. Un intrprete puro para
cualquier lenguaje de programacin puede ser construido en software, que seria la computadora virtual para el lenguaje. La
semntica para un lenguaje de alto nivel puede describirse usando el intrprete puro para el lenguaje. Sin embargo existen dos
problemas: primero, la complejidad e naturaleza del hardware de la computadora y el sistema operativo que fueron usados para
correr el intrprete puro podran hacer a las acciones difciles de entender. Segundo, una definicin de semntica hecha de esta
forma podra solo estar disponible en una maquina idnticamente configurada.
10

Estos problemas pueden ser evitados reemplazando la computadora real con una computadora virtual de bajo nivel,
implementada con una simulacin software. Los registros, la memoria, informacin de estado y procesos en ejecucin serian
todos simulados. El set de instrucciones podra disearse para que la semntica de cada instruccin sea fcil de describir y
comprender. De esta manera, la maquina seria idealizada y as, altamente simplificada, haciendo sus cambios de estado fciles
de entender.
Usar el mtodo operacional para describir completamente la semntica de un lenguaje de programacin L, requiere la
construccin de dos componentes. Primero, un traductor es necesario para convertir sentencias de L al lenguaje de bajo nivel
elegido. El otro componente es la maquina virtual para este lenguaje de bajo nivel. El estado cambia a causa de la ejecucin del
cdigo que resulta de traducir una sentencia dada en un lenguaje de alto nivel definiendo el significado de esa sentencia.
(Existen muchos mtodos que encuadran dentro de la semntica operacional.
Semntica Operacional con un Autmata Concreto.
El autmata es una computadora capaz de ejecutar programas escritos en una notacin similar a los lenguajes de
programacin.
Maquina virtual.
Semntica Operacional Abstracta.
Reemplaza los conceptos computacionales con nociones matemticas y eliminar los constructores imperativos.)
Por ejemplo, la semntica de la sentencia for de C.
Alto nivel.
for (expr1; expr2; expr3) {
.
}
Bajo nivel -> semntica operacional.
expr1;
loop: if expr2 = 0 goto out
.
expr3;
goto loop
out:
Como conclusin, la semntica operacional, fue creada por varias razones:
El primer y ms significativo uso de semntica operacional formal fue para describir la semntica de PL/I.
La maquina abstracta particular y las reglas de traduccin para PL/I fueron llamadas Lenguajes de Definicin Viena
(VOL) el cual amplia el rbol de anlisis sintctico para incluir tambin el interprete de maquina.
VOL es tan complejo que sirve para propsitos no prcticos.
La semntica operacional depende de algoritmos, no de matemtica.
Semntica Axiomtica:
Describe las acciones de un programa mediante predicados o expresiones lgicas que especifican restricciones sobre
las variables del programas antes y despus de su ejecucin.
(Basada en el calculo de predicados. No se basa en el modelo de estado de mquina. Las expresiones lgicas se
denominan predicados o asertos).
La semntica axiomtica es una herramienta poderosa para las correcciones de programas.
En una prueba, cada sentencia de un programa es tanto precedida como seguida por una expresin lgica que
especifica restricciones a las variables de programa.
(Usa reglas de inferencia para determinar el impacto de ejecucin de la estructura, estableciendo una pre y
post-condicin para cada sentencia o grupo de sentencias.
Est orientada al programador porque funciona como una prueba de escritorio, dado que se analiza si hace lo que uno
espera.
El significado de una sentencia o grupo de sentencias (S) se analiza en trminos de:
La condicin P o pre-condicin: que se supone verdadera antes de que se ejecute S.
La condicin Q o post-condicin: que puede deducirse verdadera despus de que S se ejecute.
Esto se escribe como {P} S {Q}.
Por ejemplo: x= a +1;
Con una pre-condicin:
Se usa para analizar el comportamiento de las estructuras.

11

La semntica axiomtica fue definida en conjuncin con el desarrollo de un mtodo para proveer la correccin de programas.
En una prueba, cada sentencia de un programa es tanto precedida como seguida por una expresin lgica que especifica
restricciones a las variables de programa. Estas, adems, de ser el estado completo de una maquina abstracta (como la
semntica operacional), son usadas para especificar el significado de la sentencia. La notacin usada para describir
restricciones, en realidad el lenguaje de la semntica axiomtica es el Clculo de Predicado. Aunque, las expresiones booleanas
simples son frecuentemente adecuadas para expresar restricciones, en algunos casos no lo son:
Como conclusin podemos decir que para definir la semntica de un lenguaje de programacin completo usando el mtodo
axiomtico, deben ser definidos un axioma o una regla de inferencia por cada tipo de sentencia en el lenguaje. La semntica
axiomtica es una herramienta poderosa para las correcciones de programas, y provee un excelente marco de trabajo durante su
construccin y su uso posterior. Es til, tanto para los usuarios de los lenguajes como para quienes escriben compiladores. Sin
embargo, es ampliamente limitado.
La especificacin axiomtica de un lenguaje de un sistema en el cual pueden expresarse sentencias interesantes sobre los
programas y probarlas o refutarlas. Las sentencias de inters son expresiones formales llamadas formulas. Pueden ser verdades
o falsas. Una formula verdadera se llama teorema. La intencin de definir que formulas son teoremas.
Una teora formal est formada por:
Reglas Sintcticas.
Axiomas.
Reglas de inferencia.

Semntica Denotacional:
Est orientada al diseador del LP. La entrada a la misma es un programa y la salida es un objeto matemtico
(nmeros y funciones).
Es independiente de la implementacin. La intencin es que las estructuras se plasmen como las ide el diseador. Es
una semntica del tipo declarativa.
Define el comportamiento de un LP aplicando funciones matemticas a programas o a construcciones (estructuras) del
lenguaje, para representar su significado. Para cada entidad se define un objeto matemtico y una funcin que mapea
las instancias de dicha entidad. Cada objeto matemtico ''denota'' el significado de su correspondiente entidad
sintctica. A travs del objeto matemtico se describe la dependencia funcional entre el resultado de la ejecucin de un
programa y sus datos iniciales.

12

La Semntica D. de un programa puede ser definida en trminos de cambios de estado de una computadora virtual.
(Concepto parecido a la semntica operacional. Ambas semnticas se basan para la especificacin de los significados
en los valores de las variables. Diferencias: Cdigo Vs. Funciones).

La semntica Denotacional es el mtodo conocido ampliamente ms riguroso para describir el significado de los programas.
Esta slidamente basado en la teora de la funcin recursiva. El concepto fundamental de la semntica Denotacional es definir
para cada entidad del lenguaje un objeto matemtico y una funcin que mapee instancias de esa entidad dentro de instancias
del objeto matemtico. Debido a que los objetos estn rigurosamente definidos, ellos representan el significado exacto de sus
correspondientes entidades. La idea esta basada en el hecho que hay rigurosas formas de manipular objetos matemticos pero
no para construcciones del lenguaje de programacin. La dificultad con este mtodo esta en crear los objetos y las funciones de
mapeo. El mtodo es llamado Denotacional porque los objetos matemticos denotan el significado de sus correspondientes
entidades sintcticas.
Una especializacin semntica Denotacional puede pensarse como una variante de la semntica translacional. (ESTO
TECNICAMENTE NO VA) En ella, la semntica de un lenguaje de programacin queda expresada como un esquema de
traslacin que asocia un significado a cada programa. La descripcin Denotacional est dada por un conjunto de funciones de
significado M asociadas con los constructores de la gramtica.
Cada funcin tiene la forma: MT : T DT, donde:
T es un constructor del lenguaje.
DT es una denotacin para T.
Tales funciones tendrn nombres de la forma M subindicada por el nombre del constructor.
La mayora de las funciones M son funciones de alto orden.
Producen funciones como resultado y para distinguirlas se usan corchetes para encerrar los argumentos.

================
POR LAS DUDAS
Semntica Translacional: la idea es expresar el significado de un lenguaje a travs de un esquema de translacin con el cual sea
posible, dado un programa cualquier escrito es ese lenguaje, producir un programa equivalente en un lenguaje mas simple. La
gramticas de atributos puede ser utilizados para describir semnticamente un algoritmo. La tcnica consiste en construir un
mapeo desde el lenguaje a definir hacia otro lenguaje objeto. Este mapeo constituye una especializacin semntica completa si
el lenguaje objeto esta a su vez definido. La idea de la definicin es asociar a cada constructor a un atributo (cdigo) a cada
programa, cuyo valor va a ser una secuencia de instrucciones. El valor de este atributo, para una construccin dada, representa
su traduccin al lenguaje objeto. El valor del cdigo asociado al constructor inicial es la traduccin completa. La semntica
translacional acta como el compilador de un lenguaje.

13

MINI RESUMEN SEMNTICA (con aadidos de Carabio):


La Sem. Formal se divide en dos tipos:
Esttica: que especifica aspectos sensibles al contextos que no pueden ser modelados mediante una GLC, pero an as
pueden ser corroborados en tiempo de compilacin (por tanto, se considera como una extensin de las GLC)
Gramtica de Atributos. En esencia es una GLC aumentada, a la cual se le pueden definir:
ATRIBUTOS (asociadas a cada smbolo)
REGLAS
CONDICIONES
ES LO QUE SE USA EN LA ETAPA DE ANLISIS SEMNTICO DE LA TRADUCCIN.
Dinmica: que describe el significado de expresiones, sentencias y unidades de programa en tiempo de ejecucin.
Operacional: describe el significado de un programa, ejecutando sus sentencias en una mquina de instrucciones
simples (real o simulada). Se caracteriza por el uso de enunciados simples, como saltos incondicionales, etiquetas...
ES USADA POR LOS IMPLEMENTADORES, AL MOMENTO DE PLANTEAR OPTIMIZACIONES (POR QUE
LES PERMITE VER ESPECIFICAMENTE EL FUNCIONAMIENTO DE ESTRUCTURAS, A BAJO NIVEL, Y A
PARTIR DE ALL VISUALIZAR MEJORAS). La filmina dice tambin que la Oper. se usa en manuales de
referencia; yo dira ms bien que se usa en textos acadmicos... De hecho, Sebesta explica algunas rutinas usando
una especie de Operacional.
Axiomtica: describe las acciones de un programa mediante predicados o expresiones lgicas (asertos) que
especifican restricciones sobre las variables del programa, antes y despus de la ejecucin. Los axiomas son
definidos para cada tipo de sentencia. (Recordar pre- y post-condiciones)
ES USADA POR LOS USUARIOS, ES UNA MANERA DE QUE SE ASEGUREN LA CORRECTITUD DE SUS
PROGRAMAS (PARA UNA DETERMINADA ENTRADA -PRECOND- EL LENGUAJE ASEGURA UNA
DETERMINADA SALIDA -POSTCOND-)
Denotacional: define el comportamiento de un LP aplicando funciones matemticas a programas o a construcciones
del lenguaje. Est basado en la teora de funciones recursivas. Es el mtodo ms riguroso y complejo, pero as
tambin es el ms correcto de todos. Por cada entidad se define un objeto matemtico y una funcin que mapea
instancias de dicha entidad; a travs del objeto matemtico se describe la dependencia funcional entre el resultado de
la ejecucin de un programa, y sus datos iniciales.
ES USADA POR LOS DISEADORES DEL LENGUAJE, POR QUE ES EL MTODO MS CORRECTO QUE
TIENEN PARA PODER VERIFICAR SUS CONSTRUCCIONES; ES RGIDO Y NO DA LUGAR A LA
AMBIGEDAD. Por este motivo es declarativa, abstrayndose por completo de cual implementacin, y con el
nico fin de reflejar las ideas de los diseadores.

14