Agenda • Introducción • El problema general de describir la sintaxis • Métodos Formales para describir sintaxis • Gramáticas del atributo • Describiendo el significado de los programas: Semántica dinámica Copyright © 2006 Addison-Wesley. All rights reserved. 1-1 Introduction • Sintáxis: se refiere a la forma o estructura de las expresiones, sentencias y programas • Semántica: es el significado de las expresiones, sentencias y programas • La sintáxis y la semántica proveen la definición de un lenguaje – Usuarios de la definición de un lenguaje • Diseñadores de otros lenguajes • implementadores • programadores (los usuarios del lengaueje) Copyright © 2006 Addison-Wesley. All rights reserved. 1-2 El problema general de describir la sintaxis: Terminología • Una sentencia es una cadena de caracteres en algún alfabeto • Un lenguaje es un conjunto de sentencias • Un lexema es la unidad sintáctica más pequeña de un lenguaje (e.g., *, sum, begin) • Un token es una categoría de lexemas (e.g., identifier) Copyright © 2006 Addison-Wesley. All rights reserved. 1-3 Definición formal de lenguajes • Reconocedor – Un dispositivo para reconocer lee cadenas de entrada de un lenguaje y decide si la cadena de entrada pertenece al lenguaje – Ejemplo: El analizador sintáctico • Generador – Un dispositivo que genera sentencias de un lenguaje – Uno puede determinar si la sintaxis de una sentencia en particular es correcta mediante comparándola con la estructura del generador Copyright © 2006 Addison-Wesley. All rights reserved. 1-4 Métodos formales para describir sintaxis • Backus-Naur Form y las gramáticas libres del contexto – Es el método más ampliamente conocido para describir la sintaxis de un lenguaje de programación • BNF extendido – Mejor la legibilidad y facilidad de escribir BNFs • Gramáticas y reconocedores Copyright © 2006 Addison-Wesley. All rights reserved. 1-5 BNF y las gramáticas libres del contexto • Gramáticas libres del contexto – Desarrollado por Noam Chomsky in a medidados de los 1950s – Gnerador de lenguaje, describen la sitáxis de lenguajes naturales – Definen una clase de lenguajes llamados lenguajes libres del contexto Copyright © 2006 Addison-Wesley. All rights reserved. 1-6 Backus-Naur Form (BNF) • Backus-Naur Form (1959) – Invntado por John Backus para describir Algol 58 – BNF es equivalente a las gramáticas libres del contexto – BNF es un metalenguaje usado para describir otro lenguaje – En BNF, las abstracciones son usadas para representar clases de estructuras sintácticas – actúan como variables sintácticas (también llamadas símbolos no terminales) Copyright © 2006 Addison-Wesley. All rights reserved. 1-7 BNF: Fundamentos • No-terminales: abstraciones BNF • Terminales: lexemas y tokens • Gramaticas: una colección de reglas – Ejemplos de reglas BNF: <ident_list> → identifier | identifier, <ident_list> <if_stmt> → if <logic_expr> then <stmt> Copyright © 2006 Addison-Wesley. All rights reserved. 1-8 BNF: Reglas • Una regla tiene una parte izquierda (LHS) y una parte derecha (RHS), y consiste en símbolos terminales y noterminales • Una gramática es una colección finita de reglas no vacías • Una abstracción (o símbolo no-terminal) puede tener más de una RHS <stmt> → <single_stmt> | begin <stmt_list> end Copyright © 2006 Addison-Wesley. All rights reserved. 1-9 Describiendo listas • Las listas sintácticas son descritas usando recursión <ident_list> → ident | ident, <ident_list> • Una derivación es una aplicación repetida de reglas, comenzando con el símbolo inicial y terminado con una sentencia (todos ímbolos terminales) Copyright © 2006 Addison-Wesley. All rights reserved. 1-10 Una gramática de ejemplo <program> → <stmts> <stmts> → <stmt> | <stmt> ; <stmts> <stmt> → <var> = <expr> <var> → a | b | c | d <expr> → <term> + <term> | <term> - <term> <term> → <var> | const Copyright © 2006 Addison-Wesley. All rights reserved. 1-11 Un ejemplo de derivación <program> => <stmts> => <stmt> => <var> = <expr> => a =<expr> => a = <term> + <term> => a = <var> + <term> => a = b + <term> => a = b + const Copyright © 2006 Addison-Wesley. All rights reserved. 1-12 Derivación • Cada cadena de símbolos es una forma sentencial • Una sentencia es una forma sentencial que solo tiene símbolos terminales • Una derivación izquierda es aquella en la que el símbolo terminal más a la izquiera de cada forma sentencial es expandido • Una derivación puede ser izquierda o derecha Copyright © 2006 Addison-Wesley. All rights reserved. 1-13 Árbol analizador sintácto (parse tree) • Representación jerárquica de una derivación <program> <stmts> <stmt> <var> =<expr> a <term>+<term> <var> const b Copyright © 2006 Addison-Wesley. All rights reserved. 1-14 Ambiguedad en gramáticas • Una gramática es ambigua si y solo si genera una forma sentencial que tiene dos o más árboles analizadores sintácticos distintos Copyright © 2006 Addison-Wesley. All rights reserved. 1-15 Una expresión gramatical ambigua <expr> → <expr> <op> <expr> <op> → / | <expr> <expr> <op> <expr> - const / Copyright © 2006 Addison-Wesley. All rights reserved. const <expr> <expr> <op> <expr> const | <expr> <op> <expr> <expr> <op> <expr> const const - const / const 1-16 Una expresión gramatica no-ambigua • Si usamos un arbol analizador sintáctico para indicar niveles de precedencia de los operadoers, no podemos tener ambiguedad <expr> → <expr> - <term> | <term> <term> → <term> / const| const <expr> <expr> - <term> <term> <term>/ const const Copyright © 2006 Addison-Wesley. All rights reserved. const 1-17 Asociatividad de operadores • Asociatividad de operadores pueden también ser indicado por una gramática <expr> -> <expr> + <expr> | <expr> -> <expr> + const | const const (ambiguous) (unambiguous) <expr> <expr> <expr> + const <expr> + const const Copyright © 2006 Addison-Wesley. All rights reserved. 1-18 BNF extendido • Partes opcionales se encierran entre corchetes [ ] <proc_call> -> ident [(<expr_list>)] • Partes alternativas de un RHS se deben colocar entre paréntesis y se deben separar por barras verticales <term> → <term> (+|-) const • Repeticiones (0 o más) son colocadas dentro de llaves { } <ident> → letter {letter|digit} Copyright © 2006 Addison-Wesley. All rights reserved. 1-19 BNF y EBNF • BNF <expr> → <expr> + <term> | <expr> - <term> | <term> <term> → <term> * <factor> | <term> / <factor> | <factor> • EBNF <expr> → <term> {(+ | -) <term>} <term> → <factor> {(* | /) <factor>} Copyright © 2006 Addison-Wesley. All rights reserved. 1-20 Attribute Grammars • Gramáticas independientes del contexto (CFGs) no pueden describir toda la sintáxis de un lenguaje de programación • Adicionalmente a las CFGs se de lleve llevar alguna información semántica através de los árboles de análisis sintáctico • Valores primarios de attribute grammars (AGs) – Especificación de la semántica estática Copyright 2006 Addison-Wesley. reserved. – ©Diseño deAll rights compiladores (verificador de la 1-21 Attribute Grammars : Definición • Una attribute grammar es una gramática independiente del contexto G = (S, N, T, P) con las siguientes condiciones: – Para cada símbolo gramatical x existe un conjunto A(x) de valores de atributos – Cada regla tiene un conjunto de funciones que define cierto atributo no-terminales en la regla – Cada regla tiene un conjunto (poblemente vacío) de predicados para verificar la consistencia de la gramática Copyright © 2006 Addison-Wesley. All rights reserved. 1-22 Attribute Grammars: Definición • Sea X0 → X1 ... Xn una regla • Funciones de la forma S(X0) = f(A(X1), ... , A(Xn)) definen atributos sintetizados • Funciones de la forma I(Xj) = f(A(X0), ... , A(Xn)), for i <= j <= n, definen atributos heredados • Inicialmente, hay atributos intrínsecos en las hojas Copyright © 2006 Addison-Wesley. All rights reserved. 1-23 Attribute Grammars: Un ejemplo • Sintáxis <assign> -> <var> = <expr> <expr> -> <var> + <var> | <var> <var> A | B | C • actual_type: sintetizado para <var> y <expr> • expected_type: heredado para <expr> Copyright © 2006 Addison-Wesley. All rights reserved. 1-24 Attribute Grammar (continución) • Regla sintáctica: <expr> → <var>[1] + <var>[2] Reglas semánticas: <expr>.actual_type ← <var>[1].actual_type predicado: <var>[1].actual_type == <var>[2].actual_type <expr>.expected_type == <expr>.actual_type • Regla sintáctica: <var> → id Regla semántica: <var>.actual_type ← lookup (<var>.string) Copyright © 2006 Addison-Wesley. All rights reserved. 1-25 Attribute Grammars (continuación) • ¿Cómo son computados los attribute values? – Si todos los atributos fueran heredados, el árbol podría ser decorado siguiendo un órden top-down. – Si todos los atributos fueran sintetizados, el árbol podría ser decorado siguiendo un órden bottom-up. – En muchos casos, ambos tipos de atributos son usados, y alguna combinación de topdown y bottom-up debe ser usado. Copyright © 2006 Addison-Wesley. All rights reserved. 1-26 Attribute Grammars (continuación) <expr>.expected_type ← heredado del padre <var>[1].actual_type ← lookup (A) <var>[2].actual_type ← lookup (B) <var>[1].actual_type =? <var>[2].actual_type <expr>.actual_type ← <var>[1].actual_type <expr>.actual_type =? <expr>.expected_type Copyright © 2006 Addison-Wesley. All rights reserved. 1-27 Semántica • No existe una notación o formalismo ampliamente aceptado para describir la semántica • Semántica operacional – Describe el significado de un programa mediante la ejecución de sus sentencias en una máquina ya sea simulada o la actual. El cambio en el estado de la máquina (memoria, registros, etc) define el significado de la sentencia Copyright © 2006 Addison-Wesley. All rights reserved. 1-28 Semántica operacional • Para usar semántica operacional para un lenguaje de alto nivel, se necesita una máquina virtual • Un interprete en hardware sería muy caro • Un interprete en software también tiene sus problemas – Las características detalladas de la computadora crearía acciones difíciles de entender – Dicha definición semántica la haría dependiente-de-la-máquina Copyright © 2006 Addison-Wesley. All rights reserved. 1-29 Semántica operacional (continuación) • Una mejor alternativa: Una simulación de una computadora completa • El proceso: – Construir un traductor (traduce código fuente al código máquina de una computadora ideal) – Construir un simulador para la computadora ideal • Evaluación de la semántica operacional: – Buena si se usa informalmente (manuales del lenguaje, etcétera) – Extremadamente compleja si se usa formalmente (e.g., VDL), fue inicialmente Copyright © 2006 Addison-Wesley. All rights reserved. 1-30 Semántica axiomática • Basada en lógica formal (cálculo de predicados) • Propósito original: verificación formal de un programa • Axiomas o reglas de inferencias son definidas para cada sentencia tipo en el lenguaje (para permitir transformación de expresiones a otras expresiones) • Las expresiones son llamadas afirmaciones Copyright © 2006 Addison-Wesley. All rights reserved. 1-31 Semántica axiomática(continuación) • Una afirmación • Una afirmación antes de una declaración (una condición), establece las relaciones y las limitaciones entre las variables que son verdaderas en ese momento en ejecución • Ua afirmación seguida de sentencia es una postcondición • Una precondición más débil es la precondición menos restrictiva que garantizará la postcondición. Copyright © 2006 Addison-Wesley. All rights reserved. 1-32 Formas de semánticas axiomáticas • Formas pre-, post: {P} Sentencias {Q} • Un ejemplo – a = b + 1 {a > 1} – Una posible precondición: {b > 10} {b > 0} – La precondición más débil: Copyright © 2006 Addison-Wesley. All rights reserved. 1-33 Proceso de prueba de programa • La postcondición para el programa entero es el resultado deseado – Work back through the program to the first statement. If the precondition on the first statement is the same as the program specification, the program is correct. Copyright © 2006 Addison-Wesley. All rights reserved. 1-34 Semántica axiomática: Axiomas • Un axioma para sentencias de asignación (x = E): {Qx->E} x = E {Q} • La regla de consecuencia: {P } S {Q }, P' ⇒ P, Q ⇒ Q' {P' } S {Q'} Copyright © 2006 Addison-Wesley. All rights reserved. 1-35 Semántica axiomática: Axiomas • Una regla de inferencia para secuencias {P1} S1 {P2} {P2} S2 {P3} {P1} S1 {P2}, {P2} S2 {P3} {P1} S1; S2 {P3} Copyright © 2006 Addison-Wesley. All rights reserved. 1-36 Semántica axiomática: Axiomas • Una regla de inferencia para ciclos con condición precondicionada {P} while B do S end {Q} I and B S {I } {I } while B do S {I and not B } donde I es el ciclo invariante( la hipótesis inductiva) Copyright © 2006 Addison-Wesley. All rights reserved. 1-37 Semántica axiomática: Axiomas • Características del ciclo invariante: I debe cumplir las siguientes condiciones: – P => I -- El ciclo invariante debe tener inicialmente un valor verdadero – {I} B {I} -- la evalauación de la booleana, no debe cambiar la validación de I – {I and B} S {I} -- I no es cambiada por la ejecución del cuerpo del ciclo – (I and (not B)) => Q -- si I es verdadero y B es falso, está implicado Copyright © 2006 Addison-Wesley. All rights reserved. 1-38 El ciclo invariante • El ciclo invariante I es una versión debilitada de un ciclo postcondicionado y también es una precondición • I debe ser suficientemente débil para ser satisfecho antes del inicio del ciclo, pero cuando esté combinado con la condición de salida del ciclo, debe ser suficientemente fuerte para forzar la verdad de la postcondición – El ciclo termina Copyright © 2006 Addison-Wesley. All rights reserved. 1-39 Evaluación de la semántica aximomática • Desarrollando axiomas o reglas de inferencia para todas las sentencias en un lenguaje es difícil • Es una buena herramienta para pruebas de correctitud y un excelente marco de trabajo para razonamiento sobre los programas, pero no es tan útil para lenguajes de usuarios y escritores de compiladores Copyright © 2006 Addison-Wesley. All rights reserved. 1-40 Semántica denotacional • Basada en teoría de funciones recursivas • Es el método más abstracto para describir semántica • Originalmente desarrollado por Scott y Strachey (1970) Copyright © 2006 Addison-Wesley. All rights reserved. 1-41 La semántica denotacional (continuación) • El proceso de construir una especificación denotacional para un lenguaje define un objeto matemático para cada entidad del lenguaje – Define la función que mapea las instancias de las entidades del lenguaje en las instancias de los correspondientes objetos matemáticos • El significado de los constructores del lenguaje son definidos por los valores de las variables del programa Copyright © 2006 Addison-Wesley. All rights reserved. 1-42 Semántica denotacional vs Semántica operacional • En la semántica operacional, los cambios de los estados están definidos por algoritmos codificados • En semántica denotacional, los cambios de estado son definidos por funciones matemáticas rigurosas Copyright © 2006 Addison-Wesley. All rights reserved. 1-43 Semántica denotacional: Estado del programa • El estado de un programa es el valor actual de todas sus variables s = {<i1, v1>, <i2, v2>, …, <in, vn>} • sea VARMAP una función que, cuando se le da el nombre d euna variable y un estado, regresa el valor actual de la variable VARMAP(ij, s) = vj Copyright © 2006 Addison-Wesley. All rights reserved. 1-44 Números decimales <dec_num> → 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9| <dec_num> (0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9) Mdec('0') = 0, Mdec (<dec_num> Mdec (<dec_num> … Mdec (<dec_num> Mdec ('1') = 1, …, Mdec ('9') = 9 '0') = 10 * Mdec (<dec_num>) '1’) = 10 * Mdec (<dec_num>) + 1 '9') = 10 * Mdec (<dec_num>) + 9 Copyright © 2006 Addison-Wesley. All rights reserved. 1-45 Expresiones • Mapear expresiones en Z ∪ {error} • Asumimos que las expresiones son números decimales, variables o expresiones binarias que tienen un operador aritmético y dos operandos, pudiendo cada uno de los cuales ser una expresión Copyright © 2006 Addison-Wesley. All rights reserved. 1-46 3.5 Semantica (cont.) Me(<expr>, s) ∆= case <expr> of <dec_num> => Mdec(<dec_num>, s) <var> => if VARMAP(<var>, s) == undef then error else VARMAP(<var>, s) <binary_expr> => if (Me(<binary_expr>.<left_expr>, s) == undef OR Me(<binary_expr>.<right_expr>, s) = undef) then error else if (<binary_expr>.<operator> == ‘+’ then Me(<binary_expr>.<left_expr>, s) + Me(<binary_expr>.<right_expr>, s) else Me(<binary_expr>.<left_expr>, s) * Me(<binary_expr>.<right_expr>, s) ... Copyright © 2006 Addison-Wesley. All rights reserved. 1-47 Sentencias de asignación • Mapear conjuntos de estado a conjuntos de estado Ma(x := E, s) ∆= if Me(E, s) == error then error else s’ = {<i1’,v1’>,<i2’,v2’>,...,<in’,vn’>}, where for j = 1, 2, ..., n, vj’ = VARMAP(ij, s) if ij <> x = Me(E, s) if ij == x Copyright © 2006 Addison-Wesley. All rights reserved. 1-48 Ciclos de preverificación lógica • Mapear conjuntos de estado a conjuntos de estado Ml(while B do L, s) ∆= if Mb(B, s) == undef then error else if Mb(B, s) == false then s else if Msl(L, s) == error then error else Ml(while B do L, Msl(L, s)) Copyright © 2006 Addison-Wesley. All rights reserved. 1-49 Significado de ciclo • El significado de ciclo es el valor de las variables del programa después de que las sentencias en el ciclo hayan sido ejecutadas el número preescrito de veces, asumiendo que hubieron errores • En escencia, el ciclo ha sido convertido de iteración a recursión, donde el control recursivo es definido matemáticamente por otras funciones de mapeo de estado recursivo • Cuando se compara la recursión con iteración es más es más fácilmente descrita con rigor matemático Copyright © 2006 Addison-Wesley. All rights reserved. 1-50 Evaluación de la semántica denotacional • Puede ser usada para provar la correctitud de los programas • Provee una rigorosa manera de pensamiento acerca de los programas • Puede ser de ayuda en el diseño de un lenguaje • Debido a su complejidad han sido escasamente usados por usuarios de lenguajes Copyright © 2006 Addison-Wesley. All rights reserved. 1-51 Resumen • BNF las gramáticas independientes del contexto son meta-lenguajes equivalentes – Bien adaptados para describir la sintaxis de los lenguajes de programación • Un atributo gramatical es un formalismo descriptivo que puede describir la sintaxis y la semántica de un lenguaje • Los tres principales métodos para descripción de semántica son – Operacional, axiomática y denotacional Copyright © 2006 Addison-Wesley. All rights reserved. 1-52