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