descripción formal de lenguajes

22
1 Profesor Leopoldo Silva Bijit 20-01-2010 Apéndice 1 DESCRIPCION FORMAL DE LENGUAJES A1.1. Léxico, Sintaxis, Semántica. Un programa es una secuencia de símbolos y puede considerarse como un texto. Los símbolos de un lenguaje pertenecen a un conjunto que se denomina vocabulario o léxico. Los símbolos también se denominan elementos léxicos o tokens. Léxico significa diccionario; y aplicado en el ambiente de lenguajes de programación se utiliza para denotar los símbolos del lenguaje. Estos símbolos, a su vez, están formados por secuencias de caracteres; y existen reglas que determinan cómo puede generarse o producirse un símbolo a partir de caracteres. Cada lenguaje de programación define reglas que permiten componer el texto de un programa como una secuencia de símbolos. El conjunto de estas reglas se denomina gramática, o más usualmente, la sintaxis del lenguaje. Sintaxis significa con orden. Cada regla establece una clase definida de objetos o categorías sintácticas; como ejemplos pueden darse algunas partes típicas de un programa: acciones, declaraciones, condiciones, expresiones, etc. Asociado a cada palabra (símbolo) y a cada frase o sentencia (categoría sintáctica) debe existir un significado, el cual se traduce en valores de los objetos (constantes y variables) de acuerdo a sus tipos; o en nombres de objetos o grupos de acciones; o en la especificación de las operaciones que deben efectuarse sobre esos objetos. Todas las reglas que aportan esta información se denomina: Semántica del lenguaje. Si bien las reglas para construir símbolos y frases son finitas, el conjunto de programas es infinito. Para describir con rigurosidad los lenguajes de programación se emplea una notación formal que se denomina Metalenguaje. El formulismo más conocido, y que emplearemos en la descripción, es el Formalismo Extendido Backus-Nauer. (BNF, Backus Nauer Formalism). Básicamente consiste en describir una frase, (categoría sintáctica) o parte abstracta de un programa, mediante la secuencia de componentes, de menor categoría, que pueden reemplazar

Upload: eduardo-castillo

Post on 26-Oct-2015

20 views

Category:

Documents


2 download

TRANSCRIPT

1

Profesor Leopoldo Silva Bijit 20-01-2010

Apéndice 1

DESCRIPCION FORMAL DE

LENGUAJES

A1.1. Léxico, Sintaxis, Semántica.

Un programa es una secuencia de símbolos y puede considerarse como un texto.

Los símbolos de un lenguaje pertenecen a un conjunto que se denomina vocabulario o léxico.

Los símbolos también se denominan elementos léxicos o tokens. Léxico significa diccionario; y

aplicado en el ambiente de lenguajes de programación se utiliza para denotar los símbolos del

lenguaje. Estos símbolos, a su vez, están formados por secuencias de caracteres; y existen reglas

que determinan cómo puede generarse o producirse un símbolo a partir de caracteres.

Cada lenguaje de programación define reglas que permiten componer el texto de un programa

como una secuencia de símbolos. El conjunto de estas reglas se denomina gramática, o más

usualmente, la sintaxis del lenguaje. Sintaxis significa con orden. Cada regla establece una clase

definida de objetos o categorías sintácticas; como ejemplos pueden darse algunas partes típicas

de un programa: acciones, declaraciones, condiciones, expresiones, etc.

Asociado a cada palabra (símbolo) y a cada frase o sentencia (categoría sintáctica) debe existir

un significado, el cual se traduce en valores de los objetos (constantes y variables) de acuerdo a

sus tipos; o en nombres de objetos o grupos de acciones; o en la especificación de las

operaciones que deben efectuarse sobre esos objetos. Todas las reglas que aportan esta

información se denomina: Semántica del lenguaje.

Si bien las reglas para construir símbolos y frases son finitas, el conjunto de programas es

infinito.

Para describir con rigurosidad los lenguajes de programación se emplea una notación formal

que se denomina Metalenguaje.

El formulismo más conocido, y que emplearemos en la descripción, es el Formalismo

Extendido Backus-Nauer. (BNF, Backus Nauer Formalism).

Básicamente consiste en describir una frase, (categoría sintáctica) o parte abstracta de un

programa, mediante la secuencia de componentes, de menor categoría, que pueden reemplazar

2 Estructuras de Datos y Algoritmos

Profesor Leopoldo Silva Bijit 20-01-2010

dicha frase. Las reglas deben especificar hasta llegar al reemplazo por los símbolos que

componen el diccionario.

En este ambiente, los elementos léxicos del lenguaje se denominan símbolos terminales. Las

componentes estructurales del lenguaje que serán reemplazadas, se denominan símbolos no

terminales. La regla que establece el reemplazo de un símbolo no terminal por una secuencia de

símbolos terminales y no terminales se denomina producción.

Las reglas deben permitir verificar, con facilidad, si una secuencia de símbolos es o no una

sentencia correcta del lenguaje.

Un programador debe conocer cómo generar secuencias de símbolos terminales que cumplen

la gramática.

A1.2. Metalenguaje BNF.

A1.2.1. Producción.

Existe sólo una acción primitiva, es la producción. Es una ecuación sintáctica que permite

definir una categoría sintáctica, S; mediante una expresión E.

En símbolos:

<S> ::= <E>

Gráficamente:

Figura A1.1. Producción

Los paréntesis de ángulo, delimitan los símbolos no terminales. En el gráfico esto se representa

por un rectángulo.

La secuencia ::= , es el metasímbolo para la producción. Y se lee: puede ser reemplazado por.

Una producción puede considerarse la instancia de definición de S en términos de E.

Lo usual es que S corresponda a una parte o concepto del lenguaje. Por ejemplo: acciones,

condiciones, tipos, etc.

La expresión E, debe especificar una secuencia de símbolos; éstos, a su vez, deben especificar,

en forma precisa, cómo se estructura una parte en términos de sus componentes.

E S

Apéndice 1. Descripción formal de lenguajes 3

Profesor Leopoldo Silva Bijit 20-01-2010

A1.2.2. Secuenciación de símbolos.

Los lenguajes estructurados suelen disponer tres formas básicas para establecer secuencias: La

alternativa, la concatenación, y la iteración.

A1.2.2.1. Alternativa.

Una expresión puede considerarse como una lista de términos sintácticos alternativos.

En símbolos:

<E> ::= <T1>|<T2>|--- |<Tn> n>0

Gráficamente:

Figura A1.2. Alternativa

El metasímbolo | se lee como o excluyente. La producción anterior explica que una expresión

puede remplazarse por uno (y sólo uno) de los términos de la lista.

Ejemplo:

<clase de almacenamiento> ::= 'auto ' | 'extern ' | 'register ' | 'static ' | 'typedef '

Nótese que los símbolos terminales, se indican por una secuencia de caracteres entre comillas

simples.

A1.2.2.2. Concatenación.

Cada término puede ser reemplazado por la concatenación (o producto) de factores sintácticos.

En símbolos:

<T> ::= <F1><F2> ---- <Fn> n>0

T1

E

T2

Tn

Ti

4 Estructuras de Datos y Algoritmos

Profesor Leopoldo Silva Bijit 20-01-2010

Gráficamente:

Figura A1.3. Concatenación

Ejemplo:

<acción repetitiva> ::= 'while' '(' <expresión> ')' <acción>

A1.2.2.3. Opción.

a) Opción. Una o ninguna.

Una forma de reemplazar un factor es mediante la opción.

En símbolos:

<F> ::= [ E ]

Gráficamente:

Figura A1.4. Opción.

Los paréntesis cuadrados son los metasímbolos empleados para la opción, se indica que el factor

puede ser reemplazado por la expresión o por nada. Se dice que [E] es opcional; puede estar o

no. Y si está, lo hace sólo una vez.

Ejemplo:

<signo> ::= [ '+' | '-' ]

F1 F2 Fn T Fi

S

F

Apéndice 1. Descripción formal de lenguajes 5

Profesor Leopoldo Silva Bijit 20-01-2010

Figura A1.5. Sintaxis de Signo

Debe notarse que los símbolos terminales se representan encerrados en ovoides o círculos, en

la descripción gráfica.

La ausencia de símbolo, suele ser tratada como la ocurrencia del símbolo vacío.

b) Repetición.

Un factor también puede ser reemplazado por la repetición, de cero o más veces, de una

expresión.

En símbolos:

<F> ::= { E }

Gráficamente:

Figura A1.6. Repetición

Los paréntesis de llave denotan la repetición.

Ejemplo:

<número entero sin signo> ::= <dígito>{dígito}

Para delimitar el número máximo de repeticiones, suele agregarse un valor entero como

superíndice.

Ejemplo: {digito}^3 indica a lo más 3 cifras.

Signo

-

+

E

F

6 Estructuras de Datos y Algoritmos

Profesor Leopoldo Silva Bijit 20-01-2010

c) Repetición de a lo menos una vez.

Una alternativa de reemplazo de factor, es la repetición, de una expresión, por lo menos una

vez.

En símbolos:

<F> ::= <E> {E}

La que es semánticamente equivalente a:

<F> ::= {E} <E>

Estableceremos la siguiente equivalencia, como convenio, para simplificar la notación:

<F> ::= {E*}

Gráficamente:

Figura A1.7. Repetición de a lo menos una vez.

d) Lista.

Una construcción de uso frecuente es:

<lista> ::= { <entidad> <separador> } <entidad>

La lista está formada por una entidad a lo menos; en caso de existir varias entidades, éstas

aparecen separadas por el separador. Nótese que después de la última entidad no debe existir un

separador.

Debido a su frecuente uso, la sintaxis de lista puede convenirse en anotarla, en forma

abreviada, según:

<lista> ::= { <entidad>* <separador> }

E F

Apéndice 1. Descripción formal de lenguajes 7

Profesor Leopoldo Silva Bijit 20-01-2010

A1.2.2.4. Agrupaciones.

En las ocasiones que sean necesarias pueden agruparse términos y factores sintácticos

mediante paréntesis redondos.

Ejemplo:

<término simple> ::= ('A'|'B')('C'|'D')

Las siguientes secuencias cumplen la sintaxis de término simple:

AC AD BC BD

A1.2.2.5. Sintaxis de factor.

En símbolos:

<F> ::= <S>|<símbolo terminal>|(E)| E |[ E ]|{ E }

Los símbolos terminales son secuencias de símbolos tomados del vocabulario del lenguaje. Y

se representan entre comillas simples.

La entidad sintáctica <S> debe considerarse representada por su identificador o nombre; y

debe estar definida previamente.

A1.2.3. Descripción formal de BNF.

El BNF es un lenguaje formal, y como veremos puede emplearse para describirse a sí mismo.

Las siguientes producciones definen el formalismo:

<sintaxis> ::= <producción>

<producción> ::= <identificador> '::=' <expresión>

<expresión> ::= <término> { '|' <término> }

<término> ::= <factor> { <factor> }

<factor> ::= <identificador> |

<símbolo terminal> |

'(' <expresión> ')' |

<expresión> |

'[' <expresión> ']' |

'{' <expresión> '}'

El identificador denota una entidad sintáctica.

8 Estructuras de Datos y Algoritmos

Profesor Leopoldo Silva Bijit 20-01-2010

A1.2.4. Ejemplos.

a) 'A'['B']'C' genera ABC y AC

b) 'A'{'BA'} genera A ABA ABABA .......

c) {'A'|'B'}'C' genera C AC BC AAC

A1.2.5. Árboles de Derivación.

Una forma de ayudar a reconocer las frases y su estructura es el desarrollo de árboles de

derivación.

Ejemplo: Dadas las producciones:

<entero con signo>::=<signo><entero>

<signo>::='+'|'-'

<entero>::=<dígito><entero>|<dígito> (definición recursiva)

<dígito>::='0'|'1'

Verificar si +10 pertenece o no al lenguaje. Específicamente si es o no un entero con signo.

Una forma de verificación es la construcción de un árbol de derivación, que consiste en

representar gráficamente los reemplazos que se efectúan desde el símbolo de partida (raíz) hasta

llegar a elementos terminales (hojas). [top-down]

El entero con signo puede reemplazarse por la secuencia: signo entero.

Figura A1.8. Secuencia signo entero

A su vez, signo se reemplaza por + (ya es terminal). Y entero por: dígito entero.

Figura A1.9. Dígito entero

Dígito por el terminal 1, y entero por dígito. Finalmente dígito por el terminal 0.

signo

enteroconsigno

entero

signo

enteroconsigno

entero

entero dígito +

Apéndice 1. Descripción formal de lenguajes 9

Profesor Leopoldo Silva Bijit 20-01-2010

Figura A1.10. Entero con signo

El procedimiento de reconocimiento puede también efectuarse a la inversa, desde las hojas

hacia la raíz. (bottom up)

A1.2.6. Recursividad en Producciones.

Consiste, en este caso, en definir un símbolo no terminal en términos de sí mismo. La

recursividad permite definir lenguajes con un número finito de producciones. La definición

recursiva permite generar símbolos de longitud variable.

El factor básico de repetición puede describirse explícitamente en forma recursiva. Se tiene

que:

<A>::={<B>} (i)

es equivalente a:

<A>::=<vacío>|<A><B> (ii)

En forma gráfica:

Figura A1.11. Repetición (i)

signo

enteroconsigno

entero

entero dígito +

1

dígito

0

B

A

10 Estructuras de Datos y Algoritmos

Profesor Leopoldo Silva Bijit 20-01-2010

Figura A1.12. Repetición recursiva (ii)

Se dice que la definición ii) de A es recursiva. Puede comprobarse que existen otras formas

equivalentes. Son equivalentes porque generan las mismas secuencias; cuestión que puede

verificarse desarrollando árboles de derivación.

Otras formas equivalentes son:

<A> ::= <vacío>|<B><A> (iii)

<A> ::= <vacío>|<A><B><A> (iv)

La secuencia BBBB, puede lograrse para el caso (ii) según:

A es reemplazado por:

AB; luego A es nuevamente reemplazado por AB:

ABB; luego A por AB, queda:

ABBB; otra vez A por AB, queda:

ABBBB; finalmente A por el símbolo vacío.

Ejemplo: <S>::='z'|'y'<S>

Figura A1.13. Producción recursiva

Genera las secuencias:

z

yz

yyz

yyyz

...

B

A

A

S

S

y

z

Apéndice 1. Descripción formal de lenguajes 11

Profesor Leopoldo Silva Bijit 20-01-2010

Puede escribirse: <S>::={'y'}'z'

Figura A1.14. Simplificación a no recursiva.

A1.2.7. Asociatividad en Producciones.

El uso de recursividad en las producciones, permite establecer reglas de asociatividad sin uso

de paréntesis.

Puede emplearse recursividad por la izquierda.

Ejemplo:

<expresión>::= <expresión><operador><variable>|<variable>

<operador> ::= '+'|'*'

<variable> ::= 'x'|'y'

La secuencia x+y*x+y se interpreta: ((x+y)*x)+y

Con la derivación:

Figura A1.15. Derivación

Se refleja la asociatividad, agrupando primero las hojas más alejadas de la raíz.

También puede emplearse recursividad por la derecha:

S

y

z

exp

exp var op y +

exp var op

x * exp var op

var y +

x

12 Estructuras de Datos y Algoritmos

Profesor Leopoldo Silva Bijit 20-01-2010

Ejemplo:

<expresión> ::=<variable><operador><expresión>|<variable>

<operador> ::='+'|'*'

<variable> ::='x'|'y'

La secuencia x+y*x+y se interpreta: x+(y*(x+y))

Con la derivación:

Figura A1.16. Derivación

A1.2.8. Ambigüedad en Producciones.

Ciertas producciones pueden llevar a ambigüedades semánticas:

Ejemplo:

<expresión> ::=<expresión><operador><expresión>|<variable>

<operador> ::='+'|'*'

<variable> ::='a'|'b'|'c'

Puede comprobarse que la secuencia: a+b*c puede interpretarse como a+(b*c) y también como

(a+b)*c.

Comprobar lo anterior generando los árboles de derivación correspondientes. Obviamente en

una gramática deben evitarse producciones que generen ambigüedades.

exp

var

var exp op

var exp op

var exp op

y

+ x

* y

+ x

Apéndice 1. Descripción formal de lenguajes 13

Profesor Leopoldo Silva Bijit 20-01-2010

A1.2.9. Precedencia de operadores en expresiones aritmético lógicas.

El formalismo BNF, permite reflejar el orden o jerarquía de los operadores en una expresión

aritmética o lógica.

Por ejemplo: Si se tiene que el operador * tiene precedencia (o mayor jerarquía) que el

operador +; entonces la secuencia a+b*c se interpreta como:

a+(b*c)

Es decir, se realiza primero la multiplicación, luego la adición.

El uso cuidadoso de las reglas de composición de expresiones aritméticas y lógicas, permite

escribirlas sin usar paréntesis. Sin embargo, para mejorar la legibilidad en ciertos casos, suelen

emplearse éstos.

Cuando se escriben expresiones complejas empleando paréntesis, suele usarse la regla de

contar los paréntesis abiertos y los cerrados: deben estar balanceados.

A1.2.10. Reglas para construir Expresiones.

i) Las expresiones están formadas por operadores y operandos.

ii) Son fórmulas o reglas para computar valores.

iii) Precedencia de operadores

iv) Los grupos de operadores de igual precedencia se ejecutan de acuerdo a su regla de

asociatividad.

La siguiente lista muestra los operadores agrupados, en niveles de precedencia, en orden

descendente de ésta. Cada grupo está separado del siguiente por una línea en blanco. La

columna a la derecha establece la asociatividad del operador.

Operador Ejemplo notación Asociatividad

Post-incremento X++ desde izquierda hacia la derecha

Post-decremento X--

subíndice X[Y]

llamado a función X(Y)

selección de miembro X.Y

apunta a miembro X->Y

sizeof sizeof X desde derecha a izquierda

pre-incremento ++X

pre-decremento --X

dirección de &X

indirección *X

más +X

menos -X

14 Estructuras de Datos y Algoritmos

Profesor Leopoldo Silva Bijit 20-01-2010

NOT al bit ~X

NOT lógico !X

casteo de tipo (declaración)X

multiplicación X * Y desde izquierda a derecha

división X / Y

Resto (modulo) X % Y

suma X + Y desde izquierda a derecha

resta X – Y

Corrimiento a izquierda X << Y desde izquierda a derecha

Corrimiento a derecha X >> Y

Menor que X < Y desde izquierda a derecha

Menor o igual que X <= Y

Mayor que X > Y

Mayor o igual que X >= Y

Igualdad X == Y desde izquierda a derecha

No igualdad X != Y

AND al bit X & Y desde izquierda a derecha

OR exclusivo al bit X ^ Y desde izquierda a derecha

OR inclusivo al bit X | Y desde izquierda a derecha

AND lógico X && Y desde izquierda a derecha

OR lógico X || Y desde izquierda a derecha

Condicional Z ? X : Y desde derecha a izquierda

Asignación X = Y desde derecha a izquierda

Multiplica y asigna X *= Y X=X*Y

Divide y asigna X /= Y X=X/Y

Resto y asigna X %= Y

Suma y asigna X += Y

Resta y asigna X -= Y

Left shift assign X <<= Y

right shift assign X >>= Y

AND al bit y asigna X &= Y

OR ex al bit y asigna X ^= Y

OR inclusive al bit asigna X |= Y

Apéndice 1. Descripción formal de lenguajes 15

Profesor Leopoldo Silva Bijit 20-01-2010

coma X, Y desde izquierda a derecha

Figura A1.17. Reglas de precedencia y asociatividad.

La precedencia se refiere al orden de evaluación. Es decir, cuáles operadores reciben primero

sus operandos.

Ejemplos:

La semántica de a/b/c es (a/b)/c de acuerdo a la regla iv) ya que hay secuencia de operadores de

igual precedencia y se asocia desde izquierda a derecha.

En forma similar: a/b*c se interpreta: (a/b)*c

y = m * x + b se interpreta como y = ((m * x) + b)

*p++ = -X->Y se interpreta como (*(p++)) = (-(X->Y))

Para la expresión: a + b*c, aplicando la regla iii), la multiplicación tiene precedencia sobre la

suma, por lo tanto se ejecuta primero. Se interpreta: a + (b*c)

A1.3. Símbolos del lenguaje. Léxico.

El texto de un programa está formado por una secuencia de símbolos o elementos léxicos.

Los elementos léxicos, a su vez, están formados por secuencias de caracteres.

Existen reglas de composición que determinan cómo pueden generarse o producirse un

símbolo a partir de caracteres; que en el caso de programas de alto nivel, se consideran símbolos

terminales.

El conjunto de símbolos terminales es el vocabulario del lenguaje (reglas léxicas).

A1.3.1. Conjuntos de Caracteres.

Los caracteres están estandarizados y les corresponde un código único (de un código de 7

bits, ISO estándar). Con 7 bits pueden codificarse 128 caracteres diferentes.

Suele emplearse el código ASCII (Código Estándar Americano para el Intercambio de

Información), que usa 8 bits por carácter, dejando un bit para controlar la paridad. La paridad

consiste en dejar un número par o impar de unos en una palabra del código, y se emplea con

fines de detección de errores.

Los elementos del código que se representan (visualmente) mediante un símbolo gráfico se

denominan caracteres gráficos. Entre ellos 26 letras mayúsculas, 26 minúsculas, 10 dígitos

decimales, 32 caracteres especiales (signos), y el espacio.

16 Estructuras de Datos y Algoritmos

Profesor Leopoldo Silva Bijit 20-01-2010

El resto del código (33 símbolos, no gráficos) está formado por caracteres de control, que se

emplean para dar efectos de formato y para controlar la comunicación de caracteres entre un

equipo y otro. Se denominan de formato a: tabulación horizontal y vertical, retorno de carro,

alimentación de nueva línea y alimentación de nuevo formulario.

En el texto de un programa sólo se permiten caracteres gráficos y de formato.

A1.3.2. Elementos Léxicos (tokens).

En lenguajes de alto nivel es usual definir las siguientes unidades:

i) Delimitadores

ii) Identificadores

iii) Números (literal numérico)

iv) Carácter

v) Strings

vi) Comentarios

vii) Separadores

El efecto de un programa depende solamente de la particular secuencia de elementos léxicos

que lo forman.

Existen reglas que determinan como puede generarse una frase a partir de los elementos

léxicos. El conjunto de reglas se denomina gramática del lenguaje.

La gramática o estructura del lenguaje permite determinar si una secuencia de palabras

(tokens) es una sentencia correcta o no. La estructura de las frases es esencial en el

reconocimiento del significado de éstas (semántica).

A1.3.3. Separadores

En algunos casos es necesario un separador explícito para separar elementos léxicos

adyacentes.

Se consideran separadores al espacio, a los caracteres con efecto de formato y el final de una

línea. Suele no definirse qué causa el fin de línea, en algunos sistemas pueden ser uno o más

caracteres de control.

Reglas para el uso de separadores:

a) Se requiere a lo menos un separador entre un identificador o número y el identificador o

número adyacente.

b) Se permite uno o más separadores entre dos elementos léxicos adyacentes. También se

acepta uno o más separadores, antes del primer elemento léxico del programa y después del

último. (Formato libre)

Apéndice 1. Descripción formal de lenguajes 17

Profesor Leopoldo Silva Bijit 20-01-2010

c) Los comentarios son considerados separadores.

A1.3.4. Comentarios.

Los comentarios se emplean para mejorar la legibilidad del programa; y deben ocuparse con

frecuencia para aclarar el significado de variables, o de acciones. Los comentarios pueden

sacarse del texto sin alterar el significado del programa.

Cualquier secuencia de caracteres encerrados entre los símbolos /* y */ se denomina

comentario. Hay comentarios de fin de línea, de línea completa o de varias líneas.

Alternativamente un comentario puede comenzar con el doble símbolo: //.

A1.3.5. Carácter.

Un carácter literal se forma encerrando uno de los 95 caracteres gráficos (incluyendo el

espacio) entre comillas simples.

Ej: '*' '"' 'g' ' '

A1.3.6. Strings. ( tira, mensaje, texto, hileras, cadenas)

Son secuencias de caracteres gráficos entre comillas dobles. Para incluir una comilla doble, se

la precede con \. ”O/”Higgins”.

El largo del string es el número de caracteres que forman la secuencia. Se emplean para

intercalar texto (legible) en la salida. Pueden usarse para alertar al operador que se requiere una

entrada o una operación de su parte (prompts); o bien para hacer más comprensible la salida

(mensajes).

A1.3.7. Números.

Se habla de literal numérico cuando se quiere enfatizar que se está haciendo referencia a cómo

se escribe un número como una secuencia de caracteres.

Existen enteros y reales. Los reales incluyen un punto (la coma decimal). Entre los reales, se

habla de punto fijo y punto flotante (o formato científico y exponencial; llevan la letra E).

<signo> ::= ['+' | '-']

<constante entera sin signo> ::= { dígito* }

<constante entera> ::= <signo> <constante entera sin signo>

<real punto fijo> ::= {dígito*} '.' {dígito}

<exponente> ::= ('e'|'E')<constante entera>

<real punto flotante> ::= {dígito*} ['.'{dígito*}] <exponente>

<constante real> ::= <real punto fijo> |

<real punto flotante>

18 Estructuras de Datos y Algoritmos

Profesor Leopoldo Silva Bijit 20-01-2010

Un resumen de las producciones anteriores es:

Figura A1.18. Sintaxis de número

La representación anterior no considera aspectos prácticos como máximo número representable,

exactitud de representación, etc., que dependen de la instalación. La sintaxis de número se

abstrae de estos detalles y sólo explica cómo se escriben.

A1.3.8. Identificadores.

Se usan como nombres y también como palabras reservadas. Comienzan con una letra, que

puede ser seguida de cualquier combinación de letras y números. El espacio no se acepta dentro

de un identificador. Sirven para dar nombre a: constantes, tipos de datos, variables,

procedimientos, funciones.

Figura A1.19. Sintaxis de identificador

Las palabras reservadas tienen un significado especial en el lenguaje y no pueden emplearse

como identificadores de objetos.

Los siguientes símbolos son palabras reservadas:

auto double int struct

break else long switch

case enum register typedef

char extern return union

const float short unsigned

continue for signed void

default goto sizeof volatile

do if static while

Estos símbolos también pueden ser clasificados como delimitadores.

dígito

identificador letra

letra

número dígito dígito dígito

+

-

E . +

-

Apéndice 1. Descripción formal de lenguajes 19

Profesor Leopoldo Silva Bijit 20-01-2010

Existen también identificadores estándares que el lenguaje predefine. Por ejemplo, el nombre

de algunas funciones y constantes. Pueden usarse sin definirse previamente. Además podrían ser

redefinidos dentro del programa; es decir, cambiar el significado estándar.

A1.3.9. Delimitadores.

Es uno de los siguientes caracteres especiales:

~ + ; ] % , < ^

& - = { ( . > | ) / ? } ! * : [

O uno de los siguientes delimitadores, compuestos de dos caracteres especiales adyacentes:

... && -= >= <<= &= -> >>

>>= *= /= ^= != ++ << |=

%= += <= || -- ==

Algunos delimitadores se usan como operadores. Otros para establecer mecanismos de acceso

o selección de datos estructurados.

A1.3.10. Resumen.

<texto de un programa> ::= { { <separador> } <token> }

<separador> ::= <espacio> | <fin de línea> | <comentario>

<token> ::= <palabra reservada> |

<delimitador> |

<nombre> |

<constante>

<constante> ::= <contante entera> |

<constante real> |

<constante caracter> |

<string>

A1.3.11. Ejemplos.

A1.3.11.1. Indicar mediante paréntesis como se evalúan las expresiones:

a) 80/5/4

La expresión se evalúa ((80/5)/4)

b) sqrt(sqr(3)+11*5)

20 Estructuras de Datos y Algoritmos

Profesor Leopoldo Silva Bijit 20-01-2010

Se evalúa: sqrt(sqr(3)+(11*5))

c) x =2*y-5.02

Se evalúa: x = ((2*y) - 5.02)

A1.3.11.2. Escribir todas las secuencias que cumplen la sintaxis dada por:

a) {'A'|'B'}'C'

b) 'A'{'BA'}

c) ('A'|'B')('C'|'D')

d) 'A'['B']('C'|'D')

Si el número de secuencias es mayor que 10, escribir por lo menos 5 de ellas.

a) {'A'|'B'}'C'

número de secuencias>10

1) C

2) AC

3) BC

4) ABC

5) AAC

b) 'A'{'BA'}

número de secuencias >10

1) A

2) ABA

3) ABABA

4) ABABABA

5) ABABABABA

c) ('A'|'B')('C'|'D')

número de secuencias = 4

1) AC

2) AD

3) BC

4) BD

d) 'A'['B']('C'|'D')

número de secuencias = 4

1) AC

2) AD

3) ABC

4) ABD

C

A

B

AB

A

A

B D

C

A

B D

C

Apéndice 1. Descripción formal de lenguajes 21

Profesor Leopoldo Silva Bijit 20-01-2010

Índice general.

APÉNDICE 1 .............................................................................................................................................. 1

DESCRIPCION FORMAL DE LENGUAJES ........................................................................................ 1

A1.1. LÉXICO, SINTAXIS, SEMÁNTICA. ..................................................................................................... 1 A1.2. METALENGUAJE BNF. .................................................................................................................... 2

A1.2.1. Producción. ............................................................................................................................. 2 A1.2.2. Secuenciación de símbolos. ..................................................................................................... 3

A1.2.2.1. Alternativa........................................................................................................................................ 3 A1.2.2.2. Concatenación. ................................................................................................................................. 3 A1.2.2.3. Opción. ............................................................................................................................................. 4

a) Opción. Una o ninguna. .......................................................................................................................... 4 b) Repetición. .............................................................................................................................................. 5 c) Repetición de a lo menos una vez. .......................................................................................................... 6 d) Lista. ....................................................................................................................................................... 6

A1.2.2.4. Agrupaciones. .................................................................................................................................. 7 A1.2.2.5. Sintaxis de factor. ............................................................................................................................. 7

A1.2.3. Descripción formal de BNF. ................................................................................................... 7 A1.2.4. Ejemplos. ................................................................................................................................. 8 A1.2.5. Árboles de Derivación. ........................................................................................................... 8 A1.2.6. Recursividad en Producciones. ............................................................................................... 9 A1.2.7. Asociatividad en Producciones. ............................................................................................ 11 A1.2.8. Ambigüedad en Producciones. .............................................................................................. 12 A1.2.9. Precedencia de operadores en expresiones aritmético lógicas. ........................................... 13 A1.2.10. Reglas para construir Expresiones. .................................................................................... 13

A1.3. SÍMBOLOS DEL LENGUAJE. LÉXICO. .............................................................................................. 15 A1.3.1. Conjuntos de Caracteres. ...................................................................................................... 15 A1.3.2. Elementos Léxicos (tokens). .................................................................................................. 16 A1.3.3. Separadores .......................................................................................................................... 16 A1.3.4. Comentarios. ......................................................................................................................... 17 A1.3.5. Carácter. ............................................................................................................................... 17 A1.3.6. Strings. ( tira, mensaje, texto, hileras, cadenas) ................................................................... 17 A1.3.7. Números. ............................................................................................................................... 17 A1.3.8. Identificadores. ..................................................................................................................... 18 A1.3.9. Delimitadores. ....................................................................................................................... 19 A1.3.10. Resumen. ............................................................................................................................. 19 A1.3.11. Ejemplos. ............................................................................................................................. 19

A1.3.11.1. Indicar mediante paréntesis como se evalúan las expresiones:..................................................... 19 A1.3.11.2. Escribir todas las secuencias que cumplen la sintaxis dada por: .................................................. 20

ÍNDICE GENERAL. ................................................................................................................................... 21 ÍNDICE DE FIGURAS. ................................................................................................................................ 22

22 Estructuras de Datos y Algoritmos

Profesor Leopoldo Silva Bijit 20-01-2010

Índice de figuras.

FIGURA A1.1. PRODUCCIÓN .......................................................................................................................... 2 FIGURA A1.2. ALTERNATIVA ........................................................................................................................ 3 FIGURA A1.3. CONCATENACIÓN.................................................................................................................... 4 FIGURA A1.4. OPCIÓN. .................................................................................................................................. 4 FIGURA A1.5. SINTAXIS DE SIGNO................................................................................................................. 5 FIGURA A1.6. REPETICIÓN ............................................................................................................................ 5 FIGURA A1.7. REPETICIÓN DE A LO MENOS UNA VEZ. .................................................................................... 6 FIGURA A1.8. SECUENCIA SIGNO ENTERO ..................................................................................................... 8 FIGURA A1.9. DÍGITO ENTERO ....................................................................................................................... 8 FIGURA A1.10. ENTERO CON SIGNO .............................................................................................................. 9 FIGURA A1.11. REPETICIÓN (I) ...................................................................................................................... 9 FIGURA A1.12. REPETICIÓN RECURSIVA (II) ................................................................................................ 10 FIGURA A1.13. PRODUCCIÓN RECURSIVA.................................................................................................... 10 FIGURA A1.14. SIMPLIFICACIÓN A NO RECURSIVA. ..................................................................................... 11 FIGURA A1.15. DERIVACIÓN ....................................................................................................................... 11 FIGURA A1.16. DERIVACIÓN ....................................................................................................................... 12 FIGURA A1.17. REGLAS DE PRECEDENCIA Y ASOCIATIVIDAD. ..................................................................... 15 FIGURA A1.18. SINTAXIS DE NÚMERO ......................................................................................................... 18 FIGURA A1.19. SINTAXIS DE IDENTIFICADOR .............................................................................................. 18