Professional Documents
Culture Documents
de la Programacin
FaMAF
2017
captulo
4.1.
sintaxis
vs.
semn@ca
las diferencias en forma...
C, C++, Java:
int fact (int n) { return (n == 0) ? 1 : n * fact (n-1); }
Scheme:
(define fact
(lambda (n) (if (= n 0) 1 (* n (fact (- n 1))))))
ML:
fun fact n = if n=0 then 1 else n*fact(n-1);
Haskell:
fact :: Integer->Integer
fact 0 = 1
fact n = n*fact(n-1)
sintaxis
vs.
semn@ca
...
no
necesariamente
implican
diferencias
en
el
contenido
(los
efectos
en
la
mquina)
catlogo
de
herramientas
teora
de
computabilidad:
el
poder
y
las
limitaciones
de
los
programas
teora
de
@pos:
sintaxis
y
semn@ca
de
los
lenguajes
...
pero
todava
no
tenemos
una
buena
teora
matem@ca
que
d
cuenta
de
funciones
de
alto
orden,
transformaciones
de
estado
y
concurrencia
:(
qu
es
computable
video
del
hal@ng
problem
(o
la
prueba
de
que
las
computadoras
no
pueden
hacer
todo)
programa:
sintaxis
y
semn@ca
un
programa
es
la
descripcin
de
un
proceso
dinmico
sintaxis:
texto
del
programa
semn*ca:
cosas
que
hace
la
implementacin
de
un
lenguaje
de
programacin
debe
transformar
la
sintaxis
de
un
programa
en
instrucciones
de
mquina
que
se
pueden
ejecutar
para
que
suceda
la
secuencia
de
acciones
que
se
pretenda
transformacin
de
sintaxis
a
semn@ca
un
lenguaje
de
programacin
es
un
conjunto
de
abstracciones
y
empaquetamientos
quizs
sin
correspondencia
directa
con
la
mquina
es
necesario
traducir
lenguaje
de
programacin
a
instrucciones
de
mquina
el
compilador
hace
esa
traduccin
un
intrprete
puede
combinar
traduccin
y
ejecucin
sintaxis
compilador
(o
intrprete)
el
compilador
se
encarga
de
procesar
la
sintaxis
de
los
lenguajes
de
programacin
un
intrprete
incluye
un
compilador
y
la
ejecucin
usaremos
las
lminas
de
Xin
Yuan
hPp://www.cs.fsu.edu/~xyuan/cop4020/
compiler_phases.ppt
si
quieren
saber
ms,
pueden
ver
ms
lminas
en
la
pgina
de
su
curso
qu es un compilador?
un programa que lee un programa escrito
en un lenguaje origen y lo traduce a un
programa equivalente (con el mismo
significado) en un lenguaje destino
dos
componentes
entender
el
programa
(asegurarse
de
que
es
correcto)
reescribir
el
programa
normalmente, el lenguaje origen es de
alto nivel y el destino es de bajo nivel
fases de un compilador
anlisis lxico
anlisis sintctico
anlisis semntico
generacin de cdigo intermedio
(independiente de mquina)
optimizacin de cdigo intermedio
generacin de cdigo destino (dependiente
de mquina)
optimizacin de cdigo destino
proceso de compilacin
programa origen, con macros
preprocesador
programa origen
compilador
programa en ensamblador destino
ensamblador
linker
scanner
(anlisis
lxico)
op*mizacin
de
cdigo
independiente
de
Tokens
mquina
Front end
Back end
anlisis
sntesis
parser
forma intermedia modificada
(anlisis
sintc*co)
generacin
de
cdigo
rbol sintctico
des*no
cdigo destino
anlisis
semn*co
y
generacin
de
cdigo
intermedio
op*mizacin
de
cdigo
dependiente
de
mquina
rbol sintctico abstracto
cdigo destino modificado
Scanner: anlisis lxico
se divide un programa (secuencia de
caracteres) en palabras (tokens)
program gcd (input, output);
var i, j : integer;
begin
read (i, j);
while i <> j do
if i > j then i := i - j else j := j - i;
writeln (i)
end.
A = b + @3;
Parser: anlisis sintctico
comprueba si la secuencia de tokens
conforma a la especificacin gramatical
del lenguaje y genera el rbol sintctico
la especificacin gramatical suele
representarse con una gramtica
independiente de contexto (context free
grammar), que tambin le da forma al
rbol sintctico
gramticas independientes
de contexto
se definen categoras de construcciones del
lenguaje, por ejemplo:
Sentencias (Statements)
Expresiones (Expressions)
Declaraciones (Declarations)
:=
id1
+
id2
*
id3
60
anlisis semntico
el compilador trata de ver si un un programa tiene
sentido analizando su rbol sintctico
un programa sin errores gramaticales no siempre es
correcto, puede haber problemas de tipo
pos = init + rate * 60
qu pasa si pos es una clase y init y rate son
enteros?
el parser no puede encontrar este tipo de errores
el anlisis semntico encuentra este tipo de error
anlisis semntico
el compilador hace comprobaciones semnticas estticas
(static semantic checks)
comprobacin de tipos
declaracin de variables antes de su uso
se usan los identificadores en contextos adecuados
comprobar argumentos
si hay un fallo en compilacin, se genera un error
en tiempo de ejecucin (dynamic semantic checks) se
comprueba:
que los valores de los arreglos estn dentro de los lmites
errores aritmticos (divisn por 0)
no se desreferencian los punteros si no apuntan a un objeto vlido
se usan variables sin inicializacin
si hay un fallo en ejecucin, se levanta una excepcin
tipado fuerte
un lenguaje tiene tipado fuerte si siempre se detectan
los errores de tipo
en tiempo de compilacin o de ejecucin
tipado fuerte: Ada, Java, ML, Haskell
tipado dbil: Fortran, Pascal, C/C++, Lisp
duck typing: Python
el tipado fuerte hace que el lenguaje sea ms seguro
y fcil de usar sin errores, pero potencialmente ms
lento por las comprobaciones dinmicas
en algunos lenguajes algunos errores de tipo se
detectan tarde, lo que los hace poco fiables (Basic,
Lisp, Prolog, lenguajes de scripting)
Code Generation and
Intermediate Code Forms
A typical intermediate form of
code produced by the
semantic analyzer is an
abstract syntax tree (AST)
The AST is annotated with
useful information such as
pointers to the symbol table
entry of identifiers
expresin tokenizada:
conversin de tipos implcita
parser
slide 26
gram@cas
jerarqua
de
Chomsky
gram@cas
independientes
de
contexto
vamos
a
estar
usando
gram@cas
independientes
de
contexto
(CFG,
context-free
grammars),
aunque
algunas
propiedades
de
los
lenguajes
de
programacin
escapan
a
su
expresividad
gram@cas
y
rboles
sintc@cos
una
gram@ca...
es
un
mtodo
para
denir
conjuntos
innitos
de
expresiones
procesar
expresiones
consiste
de
smbolo
inicial
no
terminales
terminales
producciones
gram@ca
del
lenguaje
de
expresiones
numricas
e ::= n | e + e | e e
n ::= d | nd
d ::= 0|1|2|3|4|5|6|7|8|9
expresiones:
0
1 + 3 5
2 - 28 + 347598
gram@cas
como
mtodo
no
terminales
forma
adecuada
de
describir
la
composicionalidad
de
las
expresiones
no
pueden
formar
parte
de
una
expresin,
siempre
se
@enen
que
subs@tuir
por
terminales
derivacin:
secuencia
de
sus@tuciones
que
termina
en
una
cadena
de
terminales
ennddd2d25
ee-ee-e+e...n-n+n...10-15+12
CFG para decimales
slide 33
CFG para parntesis balanceados
slide 34
CFG para cifras
recursiva a la derecha
slide 35
parsing recursivo descendiente
slide 36
hPp://www.garshol.priv.no/download/text/
bnf.html
hPp://cui.unige.ch/isi/bnf/JAVA/
BNFindex.html
hPp://cui.unige.ch/db-research/
Enseignement/analyseinfo/BNFweb.html
ambigedad sintctica
esta
gram@ca
Cmo parsear a+b*c usando esta gramtica? es
ambigua
slide 39
esta gramtica es inambigua
slide 40
recursin a izquierda y a derecha
slide 41
gramtica de expresiones Yacc
slide 42