LENGUAJES DE
PROGRAMACIÓN
CLASE N°2
CLASE N°2
Leissi M. Castañeda León
¿Que veremos hoy?
1. Introducción
1.- Introducción
Sintáxis: La forma o estructura de las expresiones,
declaraciones, y unidades de programa.
Semántica: El significado de las expresiones,
declaraciones y unidades de programa. declaraciones y unidades de programa.
La Sintáxis y la Semántica proveen la definición de un
Lenguaje
Usuarios de una definición de Lenguaje
Ejemplo
Sintáxis de la declaración while (Java)
2.- El problema general de describir
Sintáxis: Terminología
Una sentencia es una cadena de caracteres sobre
algún alfabeto.
Un lenguaje es un conjunto de sentencias. Un lenguaje es un conjunto de sentencias.
Un lexema es la unidad sintáctica de más bajo nivel del
lenguaje (*, sum, begin,+)
Ejemplo
index = 2 * count + 17;
Definición Formal de Lenguajes
Reconocedores
Un reconocedor lee los caracteres de entrada del lenguaje y
decide si las cadenas de entrada pertenecen al lenguaje
Ejemplo: Parte del análisis sintáctico de un compilador.
Generadores
Generadores
Un dispositivo que genera sentencias de un lenguaje.
Se puede determinar si la sintáxis de una sentencia en particular
3.- Métodos formales para describir
Sintáxis
Notación BNF (Backus-Naur Form) y Gramáticas libres
del Contexto
Método más ampliamente conocido para describir la sintáxis de
un lenguaje de programación
BNF ampliado
Mejora la legibilidad y habilidad de escritura de BNF.
BNF y Gramáticas Libres del Contexto
Gramáticas Libres del Contexto
Desarrolladas por Noam Chomsky a mitad de 1950 Generadores de Lenguajes, describen la sintáxis de
los lenguajes naturales
Define una clase de lenguaje llamado Lenguajes
Define una clase de lenguaje llamado Lenguajes
Backus-Naur Form (BNF)
Backus-Naur Form (1959)
Inventada por John Backus para describir Algol 58 BNF es equivalente a gramáticas libres del contexto BNF es un meta-lenguage usado para describir a otro
lenguaje lenguaje
BNF, usa abstracciones para representar clases de
BNF Fundamentos
No terminales: abstracciones BNF Terminales: lexemas y tokens
Gramática: Una colección de reglas
Ejemplos de reglas BNF:
<ident_list> → identifier | identifer, <ident_list>
<if_stmt> → if <logic_expr> then <stmt>
Reglas BNF
Una regla tiene un lado izquierdo (LHS) y un lado
derecho (RHS), y consiste de símbolos terminales y símbolos no terminales.
Una gramática es un conjunto finito no vacío de reglas. Una gramática es un conjunto finito no vacío de reglas.
Una abstracción (o símbolo no terminal) puede tener
más de un lado derecho:
<stmt> → <single_stmt>
Ejemplos
Declaración if en Ada
<if_stmt> → if <logic_expr> then <stmt>
<if_stmt> → if <logic_expr> then <stmt> else <stmt>
ó
<if_stmt> → if <logic_expr> then <stmt>
Describiendo Listas
La sintáxis de las listas son descritas usando recursión
<ident_list> → ident
| ident, <ident_list>
Una recursiva si su LHS aparece en su RHS. Una recursiva si su LHS aparece en su RHS.
Una derivación es una aplicación repetitiva de reglas,
Ejemplo de una Gramática
<program> → <stmts> <stmts> → <stmt>
| <stmt> ; <stmts> <stmt> → <var> = <expr>
→
<var> → a | b | c | d
<expr> → <term> + <term> | <term> - <term> <term> → <var>
Un ejemplo de derivación
<program> => <stmts> => <stmt>
=> <var> = <expr> => a =<expr>
=> a = <term> + <term>
=> a = <var> + <term>
=> a = b + <term> => a = b + <term>
Derivación
Cada cadena de símbolos en la derivación es una forma
sentencial.
Una sentencia es una forma sentencial que solamente
tiene símbolos terminales. tiene símbolos terminales.
Una derivación por la izquierda es aquella en la cual el
Que Tipo de Lenguaje Genera ?
Parse Tree
Una representación jerárquica de derivación
<program>
<stmts>
<stmt>
a
<var> = <expr>
Ambiguedad en las Gramáticas
Una gramática es ambigua si genera una
Ejemplo: Gramática Ambigua
<expr> → <expr> <op> <expr> | const
<op> → / |
Ejemplo: Gramática Ambigua
Una manera de solucionar la ambiguedad es usar el
parse tree para indicar los niveles de precedencia de los operadores
<expr> → <expr> - <term> | <term> <term> → <term> / const| const
<term> → <term> / const| const
<expr>
<expr> <term>
<term> <term> / const
Gramática No Ambigua con
Precedencia de Operadores
Ejercicio derivar por la derecha para la
Asociatividad de Operadores
La asociatividad de los operadores también puede ser
indicado por una gramática
<expr> -> <expr> + <expr> | const (ambigua)
<expr> -> <expr> + const | const (no ambigua)
Asociatividad de Operadores
Recursividad por la izquierda
<expr> -> <expr> + const | const (no ambigua)
BNF Extendido
Partes opcionales son localizadas en y brackets ([ ])
<proc_call> -> ident [(<expr_list>)]
Partes alternativas de RHSs son localizadas entre
parentesis y separadas mediante barras verticales parentesis y separadas mediante barras verticales
<term> → <term> (+|-) const
Repeticiones (0 o más) son localizadas entre llaves ({ })