Sei sulla pagina 1di 6

Sintaxis y Semntica del Lenguaje

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

<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 noterminal 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 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) 3

Sintaxis y Semntica del Lenguaje

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> 4

Sintaxis y Semntica del Lenguaje

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: No-terminales

terminales Ejemplo: El diagrama sintctico para una expresin sera:

exp trmino trmino +

trmino factor factor *

/
factor identificador

Sintaxis y Semntica del Lenguaje

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>}

Potrebbero piacerti anche