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