El documento describe los conceptos fundamentales para definir un lenguaje de programación, incluyendo la sintaxis, semántica, tipos de valores y sentencias. Explica que la sintaxis define las construcciones permitidas del lenguaje mediante reglas formales como la Forma de Backus-Naur. La semántica especifica el significado de los programas. Luego, presenta los tipos de valores básicos como números, átomos, booleanos, registros y listas, y las sentencias como asignación, composición, declaración y condicionales.
1. 18/03/13
2
Descripción
Modelo Computacional Secuencial
y Declarativo • Definiremos un lenguaje de programación
• Qué hace falta para definir un lenguaje de
programación:
Cómo se escribe con este lenguaje?
Sintaxis del Lenguaje de Kernel
Almacenamiento de simple asignación Qué significan las cosas que escribimos
con este lenguaje?
Adapted from C. Varela, S. 1
Haridi and P. Van Roy
3 4
Descripción Definición de un lenguaje
• Definiremos un lenguaje de programación • Sintaxis: define las “oraciones” “permitidas”
Secuencia de caracteres (‘letras’) = token (‘palabra’)
• Qué hace falta para definir un lenguaje de
Secuencia de tokens (‘palabras’) = sentencias
programación: (‘oración’)
Cómo se escribe con este lenguaje?
Quién verifica que un programa sea sintácticamente
correcto?
sintaxis
Qué significan las cosas que escribimos • Semántica: define qué significa un programa, y
con este lenguaje?
qué se se espera del programa.
semántica print “hello world”
Quién verifica que un programa sea semánticamente
correcto?
5
Definición de un lenguaje (sección 2.1 del libro)
• Sintaxis: define las “oraciones” “permitidas”
Secuencia de caracteres (‘letras’) = token (‘palabra’)
Secuencia de tokens (‘palabras’) = sentencias
(‘oración’)
Quién verifica que un programa sea sintácticamente
correcto? el compilador Sintaxis
• Semántica: define qué significa un programa, y
qué se se espera del programa.
print “hello world”
Quién verifica que un programa sea semánticamente
correcto? en algunos casos, la derivación, el testing
1
2. 18/03/13
7 8
Sintaxis Sintaxis
Secuencia de Secuencia de “fun {Max X Y}ntif X>Y then X else Y end
Buenos#Aires#es#la#capital#y#la#ciudad#mas#grande nend”
Caracteres Caracteres
Tokenizer Tokenizer
[“Buenos Aires”,”es”, “la”,
Secuencia de Tokens “capital”,”y”,”la”,”ciudad”, Secuencia de Tokens ‘fun’ ‘{‘ ‘Max’ ‘X’ ‘Y’ ‘}’ ‘if’ ‘X’ ‘>’ ‘Y’ ‘then’
”mas”,”grande”] ‘X’ ‘else’ ‘Y’ ‘end’ ‘end’
Parser Parser
es fun
Árbol sintáctico Árbol sintáctico
representado al Bs As y representado al Max [X Y] if
programa. programa.
la capital la ciudad mas grande > X Y
X Y
10
Ejemplo de derivación sintáctica
Sintaxis y derivación sintáctica top-down y bottom-up
<s>
• definimos la sintaxis de un lenguaje local X in <s> end
local X in local Y in <s> end end
mediante reglas (en el mejor caso, con una local X in local Y in <s> <s> end end
local X in local Y in X=true <s> end end
gramática)
local X in local Y in X=true if <x> then <s> else <s> end end end
local X in local Y in X=true if X then Y=1 else Y=~1 end end end
• una oración pertenece a nuestro lenguaje
(es válida) si hay una secuencia de reglas de
la gramática que explican cómo se generó
• una secuencia de reglas se puede
representar como un árbol de derivación
11 12
Ejemplos de gramáticas informales Ejemplos de gramáticas informales
NAME
ls -- list directory contents Una dirección de correo es:
SYNOPSIS un string, seguido de una @ seguido de varios strings
ls [-ABCFGHLOPRSTUW@abcdefghiklmnopqrstuwx1] [file ...] separados por puntos.
NAME
man - format and display the on-line manual pages
SYNOPSIS Qué es un string?
man [-acdfFhkKtwW] [--path] [-m system] [-p string] [-C config_file] Qué caracteres pueden aparecer en un string?
[-M pathlist] [-P pager] [-B browser] [-H htmlpager] [-S section_list] Cuántos strings pueden aparecer separados por
[section] name puntos?
Cuántas @ puede haber?
Qué problemas presentan estas descripciones una larga lista de etc.
informales? Qué ambigüedades? Qué efectos puede
tener la ambigüedad?
2
3. 18/03/13
13 14
Gramáticas Independientes de Contexto y Gramáticas Independientes de Contexto y
Sensibles al Contexto Sensibles al Contexto
• Gramática independiente (o libre) de contexto (CFG)
• Gramática independiente (o libre) de contexto (CFG)
Fácil de leer y entender
Fácil de leer y entender
No consigue capturar de forma elegante e intuitiva No consigue capturar de forma elegante e intuitiva
algunos fenómenos propios de los lenguajes de algunos fenómenos propios de los lenguajes de
programación
programación
• Gramática sensible al contexto
• Gramática sensible al contexto
Expresa restricciones en el lenguaje (e.g. “una variable Expresa restricciones en el lenguaje (e.g. “una variable
debe estar declarada antes de usarse”)
debe estar declarada antes de usarse”)
para definir lenguajes de programación:
Gramáticas Libres de
Conjunto de restricciones
Contexto (e.g. con BNF)
+ (e.g. con predicados)
15 16
Definiendo gramáticas formales con la
Forma Bachus-Naur (BNF):
BNF y su notación
<digit> ::= 0 | 1 | 2 | 3 | 4| 5 | 6 | 7 | 8 | 9
<int> ::= <digit> { <digit> }
<list <int>> ::= nil | <int> ‘|’ <list <int>> 31 | 5 | nil ::=
el elemento a la izquierda es definido
<statement> ::= if <expression> then<statement> por las construcciones de la derecha
{elseif <expression> then <statement>} *
el elemento ocurre 0 o más veces
[ else <statement> ] end
| … {…}
agrupa los elementos entre llaves
[…]
agrupa elementos opcionales
|
“o” exclusivo
17
Definimos nuestro Lenguaje de Kernel Palabras clave
sintaxis de una sentencia 〈s〉
〈s〉 ::= skip sentencia vacía Tokenizador Tokens Semántica
| 〈var〉 = 〈var〉 unificación variable-variable
| 〈var〉 = 〈value〉 unificación variable-valor
| 〈s〉 〈s〉 composición secuencial CFG
| local 〈var〉 in 〈s〉 end declaración Lenguaje de
Secuencia de Programación
| if 〈var〉 then 〈s〉 else 〈s〉 end condicional Caracteres
| '{' 〈var〉 〈var〉 … 〈var〉 '}' aplicación de procedimiento
| case 〈var〉 of 〈pattern〉 then 〈s〉 else 〈s〉 end chequeo de patrones
Análisis Sintáctico
〈var〉::= ... expresión de valor BNF
EBNF
〈pattern〉 ::= ... patrón
Parser
3
4. 18/03/13
19 27
Sentencias de nuestro lenguaje de
Para saber más…
núcleo (tabla 2.1)
sintaxis de una sentencia 〈s〉
• sobre qué es una gramática:
http://en.wikipedia.org/wiki/Formal_grammar
〈s〉 ::= skip sentencia vacía
• y de ahí: | 〈var〉 = 〈var〉 unificación variable-variable
• BNF: | 〈var〉 = 〈value〉 unificación variable-valor
| 〈s〉 〈s〉 composición secuencial
http://en.wikipedia.org/wiki/Backus | local 〈var〉 in 〈s〉 end declaración
%E2%80%93Naur_Form
| if 〈var〉 then 〈s〉 else 〈s〉 end condicional
• EBNF: | '{' 〈var〉 〈var〉 … 〈var〉 '}' aplicación de procedimiento
http://en.wikipedia.org/wiki/Extended_Backus | case 〈var〉 of 〈pattern〉 then 〈s〉 else 〈s〉 end chequeo de patrones
%E2%80%93Naur_form
〈var〉::= ... expresión de valor
〈pattern〉 ::= ... patrón
28 29
Indentificadores de Variables (2.3.1) Valores y tipos (2.3.1)
• 〈variables〉 Define un conjunto de variables.
• Un tipo de datos es un conjunto de valores y un conjunto
• Las variables empiezan con letra mayúscula seguida de de operaciones asociadas.
una secuencia (posiblemtente vacía) de caracteres • ejemplo: Int es el tipo de datos ”Entero”, i.e el conjunto
alfanuméricos o underscore.
de todos los valores enteros.
• Cualquier secuencia de caracteres imprimibles
encerrados entre comillas cruzadas (back-quote).
1 is of type Int
• ejemplos:
• Int tiene un conjunto de operaciones asociadas,
X incluyendo +,-,*,div, etc.
Y1 • Crearemos nuestro lenguaje de manera que se puedan
Hello_World describir elementos de distinto tipo. El modelo viene con
`hello this is a $5 bill` un conjunto de tipos básicos.
ejercicio: Escribir la gramática que describe el lenguaje
de variables
(la solución está en las tablas C.9 y C.10 del apéndice C del libro)
30 33
Descripción de Tipos de Valores (tabla 2.2) Números (2.3.3)
〈value〉
::=
〈procedure〉 | 〈record〉 | 〈number〉
• Enteros
〈procedure〉
::= proc '{' '$' 〈var〉 … 〈var〉 '}' 〈s〉 end
314, 0
~10 (minus 10)
〈record〉, 〈pattern〉
::=
〈literal〉
• Flotantes
| 〈literal〉 (〈feature〉 : 〈var〉 … 〈feature〉 : 〈var〉)
1.0, 3.4, 2.0e2, 2.0E2 (2×102)
〈literal〉
::=
〈atom〉 | 〈bool〉
〈feature〉
::=
〈int〉 | 〈atom〉 | 〈bool〉
〈bool〉
::= true | false
〈number〉 ::= 〈int〉 | 〈float〉
〈atom〉 ::= 〈lowercasechar〉 {<alphanumerchar>} …
4
5. 18/03/13
34 35
Átomos y Booleanos (2.3.3) Registros (2.3.3)
• Una secuencia que empieza con un caracter en • Representación Compuesta (lo usaremos para estructura
minúscula, seguido de caracters o dígitos, …
de datos)
person, peter 〈l〉(〈f1〉 : 〈x1〉 … 〈fn〉 : 〈xn〉)
‘Seif Haridi’ 〈l〉 is a literal
• Booleanos:
• ejemplos
true person(age:X1 name:X2)
false person(1:X1 2:X2)
• Esta definición es ambigua, cómo la arreglamos?
‘|’(1:H 2:T)
nil
person
37 38
Registros Especiales: listas
Registros Especiales: tuplas (2.3.3)
(subtipo de tupla) (2.3.3)
Tuplas
Listas
〈l〉(〈x1〉 … 〈xn〉) 〈x1〉 | 〈x2〉
Equivalente al registro:
(también podemos escribirlas con un operador infijo ‘|’)
〈l〉(1: 〈x1〉 … n: 〈xn〉) Equivalente a la tupla:
‘|’(〈x1〉 〈x2〉)
• ejemplo:
• ejemplo:
person(X Y)
H | T
corresponde al registro
corresponde a la tupla
person(1:X 2:Y)
‘|’(H T)
que corresponde al registro
‘|’(1:H 2:T)
39 42
listas Variaciones sintácticas en listas
〈x1〉 | 〈x2〉 | 〈x3〉 Podemos escribir
‘|’ asocia a la derecha
X1=5|6|7|nil
〈x1〉 | (〈x2〉 | 〈x3〉)
‘|’ que es lo mismo que
X1=5|(6|(7|nil))
1 ‘|’ que es lo mismo que
ejemplo:
X1=‘|’(5 ‘|’(6 ‘|’(7 nil)))
1 | 2 | 3 | nil Y todavia mas corto:
es
2 ‘|’
X1=[5 6 7]
1 |( 2 | (3 | nil ))
3 nil
5
6. 18/03/13
46 47
Registros Especiales: strings
Definición de Procedimientos (2.3.3)
(subtipo de lista) (2.3.3)
• Un string es una lista de códigos de caracteres 〈x〉 = proc {$ 〈y1〉 … 〈yn〉} 〈s〉 end
encerrados con comillas.
Crea un valor, “resultado” del procedimiento
• ejemplo:
Liga la variable 〈x〉 a ese valor
”E=mc^2”
significa lo mismo que:
Una variación sintáctica del procedimiento:
[69 61 109 99 94 50]
proc {〈x〉 〈y1〉 … 〈yn〉} 〈s〉 end
Pero no olvidemos que un procedimiento es siempre una
asignación, se ve cuando lo traducimos a kernel
49 50
Asignación de Tipo a Variables
• Los valores claramente tiene un tipo, e.g., enteros,
strings. Qué pasa con las variables?
Reflexiones sobre Sintaxis
51
Asignación de Tipo a Variables
• Los valores claramente tiene un tipo, e.g., enteros,
strings. Qué pasa con las variables?
Los lenguajes de programación tienen diferentes
comportamientos respecto al tipo de las variables:
• Fuertemente Tipado: La variables pueden tener asociado
un tipo, que restringe el tipo de valor que pueden
acomodar. Cómo se determina ese tipo?
Estático: todos los tipos de las variables se saben en tiempo de
compilación. Puede ser declarado por el usuario.
Dinámico: una variable adquiere un tipo en cuando se le asocia
un valor. En cualquier caso, ese tipo no cambia a lo largo de la
ejecución. El tipo es único y fijo.
• Débilmente Tipado: Las variables no tienen tipos asociados. Eg.
Los argumentos de una función pueden variar de tipo.
6