Download Descripción Formal de Lenguajes.

Document related concepts

Joy (lenguaje de programación) wikipedia , lookup

Búsqueda de patrones wikipedia , lookup

C Sharp wikipedia , lookup

Common Lisp wikipedia , lookup

Miranda (lenguaje de programación) wikipedia , lookup

Transcript
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 7. Descripción Formal de Lenguajes.
7. DESCRIPCION FORMAL DE LENGUAJES
7.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 (categoría sintáctica) debe existir un
significado. Que 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 denominan: 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 dicha frase. Las reglas deben especificar hasta llegar al reemplazo por los símbolos
que componen el diccionario.
Prof. Leopoldo Silva Bijit.
07-07-2003
68
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 7. Descripción Formal de Lenguajes.
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.
7.2. Metalenguaje BNF.
7.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:
S
E
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,
condición, tipos, etc.
Prof. Leopoldo Silva Bijit.
07-07-2003
69
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 7. Descripción Formal de Lenguajes.
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.
7.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.
7.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:
T1
T2
E
Ti
Tn
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:
<acción básica> ::= <asignación>|<entrada>|<salida>
Prof. Leopoldo Silva Bijit.
07-07-2003
70
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 7. Descripción Formal de Lenguajes.
7.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
Gráficamente:
F1
T
F2
Fi
Fn
Ejemplo:
<acción repetitiva> ::= 'repeat' <acciones> 'until' <condición>
Nótese que los símbolos terminales, se indican por una secuencia de caracteres entre
comillas simples.
7.2.2.3. Repetición. 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:
F
S
Prof. Leopoldo Silva Bijit.
07-07-2003
71
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 7. Descripción Formal de Lenguajes.
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> ::= [ '+'|'-' ]
+
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:
F
E
Prof. Leopoldo Silva Bijit.
07-07-2003
72
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 7. Descripción Formal de Lenguajes.
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.
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:
F
E
d) Lista.
Una construcción de uso frecuente es:
<lista> ::= { <entidad> <separador> } <entidad>
Prof. Leopoldo Silva Bijit.
07-07-2003
73
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 7. Descripción Formal de Lenguajes.
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> }
Construcción que será frecuentemente empleada en este texto.
7.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
7.2.2.5. Sintaxis de factor.
En símbolos:
<F> ::= <S>|<símbolo terminal>|(E)| E |[ E ]|{ E }
Los símbolos términales 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.
Prof. Leopoldo Silva Bijit.
07-07-2003
74
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 7. Descripción Formal de Lenguajes.
7.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.
7.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
7.2.5. Arboles 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>::='+'|'-'
Prof. Leopoldo Silva Bijit.
07-07-2003
75
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 7. Descripción Formal de Lenguajes.
<entero>::=<dígito><entero>|<dígito> (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.
enteroconsigno
signo
entero
A su vez, signo se reemplaza por + (ya es terminal). Y entero por dígito entero.
enteroconsigno
entero
signo
dígito
+
entero
Dígito por el terminal 1, y entero por dígito.
enteroconsigno
entero
signo
dígito
+
1
entero
dígito
0
Finalmente dígito por el terminal 0.
Prof. Leopoldo Silva Bijit.
07-07-2003
76
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 7. Descripción Formal de Lenguajes.
El procedimiento (de reconocimiento) puede también efectuarse a la inversa, desde las hojas
hacia la raíz. (bottom up)
7.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:
A
B
A
A
B
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:
Prof. Leopoldo Silva Bijit.
07-07-2003
77
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 7. Descripción Formal de Lenguajes.
<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>
z
S
y
Genera las secuencias:
S
z
yz
yyz
yyyz
...
Puede escribirse: <S>::={'y'}'z'
z
S
y
7.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:
Prof. Leopoldo Silva Bijit.
07-07-2003
78
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 7. Descripción Formal de Lenguajes.
<expresión>::= <expresión><operador><variable>|<variable>
<operador> ::= '+'|'*'
<variable> ::= 'x'|'y'
La secuencia x+y*x+y se interpreta ((x+y)*x)+y
Prof. Leopoldo Silva Bijit.
07-07-2003
79
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 7. Descripción Formal de Lenguajes.
Con la derivación:
exp
exp
exp
exp
op
op
op
var
var
var
var
*
+
+
y
x
y
x
Se refleja la asociatividad, agrupando primero las hojas más alejadas de la raíz.
También puede emplearse recursividad por la derecha:
Ejemplo:
<expresión> ::=<variable><operador><expresión>|<variable>
<operador> ::='+'|'*'
<variable> ::='x'|'y'
La secuencia x+y*x+y se interpreta: x+(y*(x+y))
exp
Con la derivación:
var
x
op
exp
var
+
y
op
exp
var
*
x
op
+
exp
var
y
Prof. Leopoldo Silva Bijit.
07-07-2003
80
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 7. Descripción Formal de Lenguajes.
7.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.
7.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.
En Pascal los operadores definidos en un término BNF tienen precedencia a los operadores
definidos en un factor BNF. Y éstos tienen precedencia respecto de los definidos en una
componente de un factor.
Los operadores definidos en un término BNF tienen igual jerarquía. Lo anterior puede
comprobarse observando los diagramas sintácticos en el Report pág. 145.
El uso cuidadoso de las reglas de composición de expresiones aritméticas y lógicas, permite
escribirlas sin usar, en general, los paréntesis. Sin embargo, para mejorar la legibilidad suelen
emplearse éstos.
Prof. Leopoldo Silva Bijit.
07-07-2003
81
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 7. Descripción Formal de Lenguajes.
Cuando se escriben expresiones complejas empleando paréntesis, suele usarse la regla de
contar los paréntesis abiertos y los cerrados: deben estar balanceados.
7.2.10. Expresiones en Pascal.
Con los elementos desarrollados hasta el momento puede profundizarse en la forma de
construir expresiones en Pascal. Las siguientes reglas se desprenden de la gramática dada por
los grafos, como se verá a continuación.
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:
Mayor precedencia: NOT
Luego: operadores de multiplicación: * / DIV MOD AND
Después: operadores de suma : + - OR
Finalmente: operadores relacionales: = <> >= <= > <
La precedencia se refiere al orden de evaluación. Es decir, cuáles operadores reciben
primero sus operandos.
iv) Secuencias de operadores de igual precedencia se ejecutan de izquierda a derecha.
Conociendo estas reglas, no es necesario conocer sobre aspectos sintácticos.
Las siguientes producciones son parte de la definición de la sintaxis de Pascal, y tienen que
ver con la generación de expresiones:
<factor>
::=<cte. sin signo> | <variable> | '('<expresión> ')'
<término> ::=<factor> | <término> <op. mult.> <factor>
<exp.simple> ::=<término> |
<exp.simple> <op. suma> <término> |
<signo>
<expresión> ::=<exp.simple> |
Prof. Leopoldo Silva Bijit.
07-07-2003
82
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 7. Descripción Formal de Lenguajes.
<exp.simple> <op. rel> <exp.simple>
<op.mult.> ::= '*' | '/' | 'AND'' | 'MOD'' | 'DIV'
<op. suma> ::= '+' | '-'' | 'OR'
<op. rel>
::= '>' | '<'' | '>='' | '<='' | '='' | '<>'
Nótese que se emplea recursividad por la izquierda, esto implica un recorrido, de la
secuencia de tokens en la expresión, desde izquierda a derecha.
Prof. Leopoldo Silva Bijit.
07-07-2003
83
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 7. Descripción Formal de Lenguajes.
Ejemplo: Igual Precedencia.
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.
De acuerdo a las producciones, puede establecerse el siguiente árbol de derivación:
término
término
término
op. mult.
op. mult.
factor
factor
/
factor
/
variable
variable
c
b
variable
a
El cual permite interpretar según: (a/b)/c
Nótese que el recorrido es sub-árbol izquierdo, raíz y sub-árbol derecho, comenzando por
la hoja más a la izquierda. Entonces la regla iv) se debe a que las producciones usan
recursividad por la izquierda.
En forma similar: a/b*c se interpreta: (a/b)*c
Ejemplo: Regla de Precedencia.
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. Por lo tanto, se lee:
a+(b*c)
Prof. Leopoldo Silva Bijit.
07-07-2003
84
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 7. Descripción Formal de Lenguajes.
Igual semántica se obtiene del árbol de derivación:
exp. simple
exp.simple op. suma
término
+
factor
término
término
op. mult.
factor
factor
variable
*
variable
variable
a
b
c
Ejemplo: Limitación en Relaciones.
Las producciones elegidas para Pascal, impiden escribir la siguiente expresión algebraica,
que frecuentemente aparece en desarrollos:
a>b>c
Si ensayamos el siguiente árbol de derivación, se tiene:
expresión
exp.simple
op. rel.
término
>
exp.simple
factor
variable
Prof. Leopoldo Silva Bijit.
07-07-2003
a
85
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 7. Descripción Formal de Lenguajes.
Y debido a la ocurrencia de sólo un operador relacional, no puede reconocerse como
expresión simple a: b>c.
Un árbol completo para el caso anterior, se ilustra a continuación, partiendo de expresión:
expresión
exp. simple
término
término
op. mult.
factor
(expresión)
(expresión)
AND
exp. simple
op. rel
exp.simple
exp. simple
op. rel
exp.simple
término
>
término
término
>
término
factor
factor
factor
factor
variable
variable
variable
variable
a
b
b
c
Que indica que debe escribirse:
(a>b) AND (b>c)
Prof. Leopoldo Silva Bijit.
07-07-2003
86
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 7. Descripción Formal de Lenguajes.
7.2.11. Grafos sintácticos para expresiones en Pascal.
Considerando las definiciones de las producciones, no siempre es sencillo encontrar grafos
sintácticos reducidos, que las representen. Sin embargo, en varios textos aparecen estos
grafos reducidos, sin explicaciones. Veamos el desarrollo del grafo de término, a partir de la
producción:
<término> ::= <factor> | <término> <op. mult.> <factor>
Puede verse que eliminando la recursividad explícita, queda la siguiente producción iterativa
equivalente:
<término> ::= <factor> { <op.mult.><factor> }
Revisando la definición de lista en 7.2.2.3. se obtiene:
<término> ::= { <op.mult.>* <factor> }
Con el siguiente grafo:
término
factor
op.mult
Similarmente, la producción de expresión simple, puede escribirse:
<exp.simple>::=[<signo>] { <op.suma>* <término> }
Conviene, como tarea, dibujar los grafos para expresiones aritméticas en forma separada de
los grafos para expresiones lógicas, y comparar con los que aparecen en los textos.
Prof. Leopoldo Silva Bijit.
07-07-2003
87
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 7. Descripción Formal de Lenguajes.
7.3. Símbolos del lenguaje. Léxico en Pascal.
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).
7.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.
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.
Prof. Leopoldo Silva Bijit.
07-07-2003
88
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 7. Descripción Formal de Lenguajes.
7.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).
7.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)
Prof. Leopoldo Silva Bijit.
07-07-2003
89
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 7. Descripción Formal de Lenguajes.
c) En Pascal los comentarios son considerados separadores.
7.3.4. Comentarios (en Pascal).
Cualquier secuencia de caracteres encerrados entre paréntesis de llave se denomina
comentario. La secuencia no debe contener }.
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.
Se emplean como símbolos alternativos las secuencias de dos caracteres (* y *) que
reemplazan a { y } respectivamente.
7.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' ' '
Para representar la comilla simple como carácter, se escribe dos veces: '''' .
7.3.6. Strings. ( tira, mensaje, texto, hileras, cadenas)
Son secuencias de caracteres gráficos entre comillas simples. Para incluir una comilla, se la
escribe dos veces. '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).
7.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.
Prof. Leopoldo Silva Bijit.
07-07-2003
90
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 7. Descripción Formal de Lenguajes.
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>
Un resumen de las producciones anteriores es:
número
+
.
dígito
+
dígito
E
-
dígito
-
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.
7.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.
letra
identificador
letra
dígito
Prof. Leopoldo Silva Bijit.
07-07-2003
91
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 7. Descripción Formal de Lenguajes.
En Pascal estándar sólo se reconocen los primeros 8 caracteres del 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 de Pascal:
div
if
while
const
function
mod
then
do
var
procedure
nil
else
for
type
program
in
case
to
array
packed
or
of
downto
record
with
and
repeat
begin
set
label
not
until
end
file
goto
Estos símbolos también pueden ser clasificados como delimitadores.
Existen también identificadores estándares que el lenguaje predefine. Por ejemplo, el
nombre de algunas funciones y procedimientos. Pueden usarse sin definirse previamente.
Además podrían ser redefinidos dentro del programa; es decir, cambiar el significado
estándar.
7.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.
Prof. Leopoldo Silva Bijit.
07-07-2003
92
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 7. Descripción Formal de Lenguajes.
7.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>
|
|
|
7.3.11. Ejemplos.
7.3.11.1. Indicar árbol de derivación. Evaluar expresiones y poner paréntesis, de acuerdo a la
sintaxis de Pascal.
a) 80/5/4
b) sqrt(sqr(3)+11*5)
c) x:=2*y-5.02
Solución:
a)
expresión
término
factor
/
constante
Prof. Leopoldo Silva Bijit.
factor
constante
/
factor
constante
07-07-2003
93
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 7. Descripción Formal de Lenguajes.
80
5
4
La expresión se evalúa ((80/5)/4)
b)
expresión
término
factor
identif. función ( expresión )
sqrt
termino
+
factor
término
factor
identif. función (expresión) constante
sqr
término
11
*
factor
constante
5
factor
constante
3
Se evalúa: sqrt(sqr(3)+(11*5))
c)
asignación
variable := expresión
x
término
-
término
factor * factor
factor
constante variable
constante
Prof. Leopoldo Silva Bijit.
07-07-2003
94
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 7. Descripción Formal de Lenguajes.
2
y
5.02
Se evalúa: x := ((2*y)-5.02)
7.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
C
A
B
b) 'A'{'BA'}
número de secuencias >10
1) A
2) ABA
3) ABABA
4) ABABABA
5) ABABABABA
A
AB
c) ('A'|'B')('C'|'D')
número de secuencias = 4
1) AC
2) AD
3) BC
4) BD
A
C
B
D
d) 'A'['B']('C'|'D')
Prof. Leopoldo Silva Bijit.
07-07-2003
95
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 7. Descripción Formal de Lenguajes.
número de secuencias = 4
1) AC
2) AD
3) ABC
4) ABD
Prof. Leopoldo Silva Bijit.
C
A
B
07-07-2003
D
96