Capítulo II

Anuncio
Capítulo II
2.1 Sintaxis y Semántica
Conceptos Fundamentales
de
Lenguajes de
Programación
Descripción de sintaxis y
semántica, análisis sintáctico y
semántico
Definición: Sintaxis y Semántica
l
l
SINTAXIS: forma de expresiones, sentencias
y unidades de programa
SEMÁNTICA: significado de estas
expresiones, sentencias y unidades de
programa
Elementos Sintácticos
l
l
l
l
l
l
l
Ejemplo:
while (<expr>) do <sentencia>
Descripción de Sintaxis
l
Definición de Lenguajes
l
l
l
Reconocimiento (reconoce si string de entrada
pertenece al lenguaje)
Generación (genera strings que pertenecen al
lenguaje)
Métodos formales de descripción
l
l
Backus Nauer Form (BNF)
Extended BNF (EBNF)
l
l
Conjunto de carácteres
Identificadores
Símbolos de operadores
Palabras claves y reservadas
Comentarios
Blancos, delimitadores y paréntesis
Expresiones
Sentencias
Elementos de BNF
l
Símbolos no terminales
l
l
l
l
Abstracción que representa una regla
Símbolos terminales
Tokens de las reglas
Símbolo de partida
l
Símbolo no terminal que permite generar un
programa
1
Ejemplo de Gramática
Parse Tree
Expresión
l
<program> ::= begin <stmt_list> end
A := A*B + C
stmt
<stmt_list> ::= begin <stmt> ; <stmt_list> end
id
<stmt>
exp
:=
::= <id> := <exp>
A
<id>
::= A | B | C
Ambigüedad
stmt
id
exp
id
id
id
A
B
C
Dada la siguiente gramática:
<if_stmt> ::=
if <condition> then <stmt>
| if <condition> then <stmt> else <stmt>
<stmt>
<if_stmt> | …
stmt
id
exp
:=
A
exp
Otro ejemplo de ambigüedad:
Para la expresión A := A*B + C existen dos parse
tree:
l
+
*
exp
::= <id> | <exp> + <exp> | <id> * <exp> | (<exp>)
<exp>
exp
exp
+
exp
*
exp
id
A
exp
:=
exp
*
::=
if (C1) then if (C2) then S1 else S2
Reconocer:
exp
if_stmt
exp
id
exp
+
if
id
id
C
A
if_stmt
exp
id
id
B
C
condition
then
stmt
if
condition
then
stmt
else
stmt
if_stmt
if_stmt
A
B
if
Resolución de Ambigüedad
l
Caso de operadores:
l
l
l
Definir precedencia
A igual precedencia, definir asociatividad por
izquierda o derecha
Caso del if:
l
condition
then
stmt
else
stmt
if
condition
then
stmt
Extended BNF (EBNF)
l
l
l
Elemento opcional se indica con [ …]
Alternativa puede usar | en una regla
Repetición de elementos se indican con
{…}
Asociar el else con el último if
2
Ejemplos de EBNF
Grafos Sintácticos
<if_stmt> ::= if <condition> then <stmts> [ else <stmts>]
<identifier >
<if_stmt>
::=
if <condition> then <stmts> {<else_if > }
[ else < stmts> ] end if
<else_if>
::=
elseif <condition> then <stmts>
::= < letter > {<letter> | < digit> }
else_stmt
condition
if
stmts
then
end if
else_if
else_if
Programa Fuente
l
AnálisisLéxico
Léxico
Análisis
Tokens léxicos
l
Parse tree
Tabla de
símbolos
condition
stmts
then
stmts
Ejemplo: C
Proceso de Compilación
AnálisisSintáctico
Sintáctico
Análisis
elseif
else
Reconocimiento
del programa
fuente
l
Archivos de cabeceras
Implementación de cabeceras
Makefile para facilitar la compilación
AnálisisSemántico
Semántico
Análisis
Código intermedio
Generaciónde
deCódigo
Código
Generación
Programa Objeto
Ejemplo: C
l
l
l
Ejemplo: C
Interfaz paralela
Requiere de cabeceras para interfaz
Requiere de dos ejecutables
Código fuente
Programa objeto Programa ejecutable
Cparallel.h
#ifndef _CPARALLEL_H_
Cparallel.c
#include "cparallel.h "
#define _CPARALLEL_H_
#include <unistd.h>
#define BASE_ADDRESS 0x378
#include <asm/io.h>
int rxParallel(void);
int rxParallel() {
int txParallel(int);
Cliente.c
...
}
Cliente.o
#endif
cliente
Cparallel.h
Cparallel.c
int txParallel(int Data_Byte) {
...
Cparallel.o
}
servidor
Servidor.c
Servidor.o
3
Ejemplo: C
Ejemplo: C
Cliente.c
Makefile
#include "cparallel.h "
#include "cparallel.h "
all: cliente servidor
int main()
{
printf("Sending data....\n");
int i, x;
x=0;
while(1){
int i=1;
for(i =1;i<17;i=2*i){
txParallel(i);
sleep(1);
}
printf("\ n");
}
return 1;
}
int main()
{
printf("Receiving. . .\n");
int y=0;
while(1){
int ny,d0,d1,j=0;
n y=rxParallel ();
printf("\ nRecieved: % d",ny);
sleep(1);
}
return 1;
}
Servidor.c
l
l
servidor: cparallel.o servidor.o
gcc -O2 -lm $^ -o $@
cliente: cparallel.o cliente.o
gcc -O2 -lm $^ -o $@
%.o: %.c
gcc -c -O2
Ejemplo: Java
l
clean:
rm -f *.o
rm -f *~
rm -f binary sender receiver
$< -o $@
Ejemplo: Java
No permite la definición de cabeceras
Archivos de clases
Archivo “Ant” para facilitar compilación y
ejecución
Ejemplo: Java
l
l
l
Agenda de contactos
Objetos con datos y funcionalidad
Objeto para ejecución
Código fuente
Código bytecode
Agenda.java
Agenda.class
Persona.java
Persona.class
AdmAgenda.java
AdmAgenda.class
Ejecución en JVM
JVM
Ejemplo: Java
Persona.java
Agenda.java
public class Persona {
private String nombre;
private String telefono;
public Persona(String n, String t){
nombre=n;
telefono=t;
}
public void mostrarDatos(){
System.out.println("Nombre:"+
nombre+", telefono: "+
telefono);
}
}
public class Agenda {
AdmAgenda.java
public class AdmAgenda {
private Vector personas=new Vector();
public void agregarPersona(Persona p){
personas.add(p );
}
public void mostrarPersonas(){
for(int i=0;i<personas.size();i++)
((Persona)personas.get(i))
.mostrarDatos();
}
public static void main(String args[]){
Agenda a = n e w Agenda();
a.agregarPersona(new Persona("NN", "112233"));
a.agregarPersona(new Persona("MM", "445566"));
a.mostrarPersonas ();
}
}
}
4
Ejemplo: Java
Build.xml
<project basedir="." default="run">
<description></description>
<target name="compile" description="Compiles java files.">
<echo message="Compiling the java files."/>
<javac srcdir="." destdir="." debug="yes"/>
</target>
<target name="run" depends="compile">
<java classname="usm.lp.AdmAgenda" fork="true"
classpath=".">
</java>
</target>
</project>
5
Descargar