Tema 6. Gestión de tipos
|
|
- Claudia Montes Miranda
- hace 6 años
- Vistas:
Transcripción
1 Traductores, Compiladores e Intérpretes 1 Tema 6 Gestión de Tipos Un compilador debe comprobar si el programa fuente sigue tanto las convenciones sintácticas como las semánticas del lenguaje fuente. Esta comprobación garantiza la detección y comunicación de algunas clases de errores de programación. Con la gestión de tipos se asegura que el tipo de una construcción coincida con el previsto en su contexto. Por ejemplo, el operador aritmético predefinido mod en MODULA exige operandos de tipo entero, de modo que mediante la gestión de tipos debemos asegurar que dichos operandos sean de tipo entero. De igual manera, la gestión de tipo debe asegurarse de que la desreferenciación se aplique sólo a un apuntador, de que la indización se haga sólo sobre una matriz, de que una función definida por el usuario se aplique la cantidad y tipo correctos de argumentos, etc. Puede necesitarse la información sobre los tipos, reunida por la gestión de tipos, cuando se genera el código. Por ejemplo, los operadores aritméticos como + normalmente se aplican tanto a enteros como a reales, tal vez a otros tipos, y se debe examinar el contexto de + para determinar el sentido que se pretende dar. Se dice que un símbolo que puede representar diferentes operaciones en diferentes contextos está sobrecargado. La sobrecarga puede ir acompañada de una conversión de tipos, donde el compilador proporciona el operador para convertir un operando en el tipo esperado por el contexto. Una noción diferente de la sobrecarga es la de polimorfismo. Una función es polimórfica cuando puede ejecutarse con argumentos de tipos diferentes, desencadenando en cada caso una acción diferente. Por ejemplo, la suma es un operador polimórfico, pues permite sumar enteros, reales, reales con enteros, y concatenar cadenas o sumar enteros con caracteres. Una cosa es que nuestro lenguaje tenga algunas funciones predefinidas polimórficas, y otra cosa que se permita la definición de funciones polimórficas. Así, hay que solucionar de alguna forma los conflictos en la tabla de símbolos. Veamos un ejemplo sencillo: Considérese expresiones como x + i donde x es de tipo real e i es de tipo entero. Como la representación de enteros y reales es distinta dentro de un computador, y se utilizan instrucciones de máquina distintas para las operaciones sobre enteros y reales, puede que el compilador tenga que convertir primero uno de los operadores de + para garantizar que ambos operandos sean del mismo tipo cuando tenga lugar la suma. La siguiente gramática genera expresiones formadas por constantes enteras y reales a las que se aplica el operador aritmético de la suma +. Cuando se suman dos enteros el resultado es entero, y si no es real. E Ú E + T T T Ú num. num num Por ejemplo si quisiéramos determinar el tipo de cada subexpresión, obtendríamos el árbol de la figura. (Este problema está resuelto en la relación de problemas de YACC)
2 Traductores, Compiladores e Intérpretes 2 Gestión de Tipos Veamos ahora un ejemplo en el que gestionaremos los tipos Enteros y Caracteres. La gramática a reconocer será la siguiente: prog asig : prog asig \n prog IMPRIMIR expr \n ; : ID ASIG expr ID ASIG asig ; expr : expr + expr expr * expr A_ENTERO ( expr ) A_CARACTER ( expr ) ID NUMERO CARACTER ; En este ejemplo podremos * Asignar expresiones a variables; también podremos hacer asignaciones múltiples. * IMPRIMIR expr. Esta expr puede ser de dos tipos: bien entera o bien carácter. Sin embargo la función imprimir es la misma. Si vemos la función imprimir como funcional, podemos decir que IMPRIMIR es de tipo POLIMÓRFICA. Con los enteros vamos a poder hacer + y *, en cambio con los caracteres no podemos hacer ninguna de estas operaciones. * Además vamos a permitir también funciones de conversión Entero Caracter # A_CARACTER A _ENTERO Podemos decir que estas funciones son funciones predefinidas también llamadas funciones built-in. A_CARACTER(expr) : Tiene como parámetro una expr de tipo entero y nos devuelve como resultado el código ASCII que equivale a dicho entero. A_ENTERO(expr) : Tiene como parámetro una expr de tipo carácter y nos devuelve como resultado el código ASCII de dicho carácter.
3 Traductores, Compiladores e Intérpretes 3 Dado un enunciado tenemos que : b tipo = c Gestión de Tipos 1. Ponernos un ejemplo del tipo de entrada con el que nos vamos a encontrar b = k a =7 c = IMPRIMIR c + 5 IMPRIMIR b 2. Definir la tabla de símbolos, si es que esta es necesaria para el problema. En este caso sí necesitaremos la tabla de símbolo, en ella almacenaremos los identificadores. Además, como lo que estamos haciendo es un intérprete, no me basta con guardar el tipo del identificador que lo denotaremos de la siguiente forma: c : si es de tipo carácter Tipo e : si es de tipo entero sino que tendremos que almacenar el valor de dicho identificador, pero aquí nos encontramos con un problema, unas veces este valor será de tipo entero, y otras veces será de tipo carácter, con lo que deberemos de utilizar una estructura de tipo unión. Veamos ésto gráficamente: nombre tipo unión Valor_char = k Valor_int = a tipo = e Valor_char = Valor_int = 7 c tipo = e Valor_char = k Valor_int = NULL
4 Traductores, Compiladores e Intérpretes 4 Gestión de Tipos 3. El tercer paso es estudiar qué atributo se le tiene que asociar a los no terminales. En mi programa no hay declaración de variable, entonces es LEX quien debe insertar en la tabla de símbolos, con objeto de descargar a YACC de más tareas. Si hubiera una zona de declaración en el programa entonces insertaría YACC en la tabla de símbolo. Hasta ahora todo va bien, pero analicemos que ocurriría si tuviésemos la siguiente entrada b = k a = 7 c = 8 + a IMPRIMIR c + 5 IMPRIMIR b Cuando LEX encuentra c = 8 + a lo inserta en la tabla de símbolos, pero de qué tipo es la variable c?. El tipo de c no se sabe hasta su primera asignación. El tipo está implícito en el momento en que se hace su primera asignación. Qué tipo le asigna LEX a la variable c? No sabe que tipo asignarle, será YACC el que le ponga el tipo cuando se haga la primera asignación. LEX le pondrá el tipo = i (indefinido) b tipo = c Valor_char = k Valor_int = a tipo = e Valor_char = Valor_int = 7 c tipo = i Valor_char = Valor_int = NULL
5 Traductores, Compiladores e Intérpretes 5 En cuanto a los atributos asociados a los no terminales: - CHAR : tiene asociado un carácter. - NUM tiene asociado un entero. - ID el atributo que devuelve es un puntero a la tabla de símbolo Gestión de Tipos Qué ocurriría en este caso? c = 8 + h. Es decir que ocurriría en el caso en que quisiéramos operar un entero con un carácter. Como vemos en expr no solo vamos a guardar el valor, sino que también vamos a guardar el tipo. A una expresión tenemos que asociarle también dos atributos que realmente son lo mismo que la parte sombreada:
6 Traductores, Compiladores e Intérpretes 6 En la función A_CARACTER(expr) preguntaremos el tipo y: - Si no es entero nos dará un error - Si es entero devuelve un carácter En la función A_ENTERO(expr) preguntaremos el tipo y: - Si no es carácter nos dará un error - Si es carácter devuelve un entero Si nos encontramos : IMPRIMIR c + 5 Gestión de Tipos Veamos que ocurre si tenemos un identificador de usuario asignado a otro identificador de usuario b = f LEX mete en la tabla de símbolo b con tipo i, se encuentra f y también la mete con tipo i, (como se dijo antes, el tipo de un identificador no se sabe hasta la primera asignación). El hecho de que la parte derecha de la asignación tenga tipo indefinido es un error. Qué ocurre con b? En b no puedo guardar nada: b permanece en la tabla de símbolos pero tiene valor y tipo indefinido.
7 Traductores, Compiladores e Intérpretes 7 Suponer que la siguiente instrucción es f = 3. Gestión de Tipos b = f f = 3 Veamos que ocurriría si a un identificador que ya tiene asignado un tipo se le asignara un valor de otro tipo diferente. Estudiemos la siguiente entrada b = 3 b = f Intento asignarle a b un valor desconocido. Que hacemos? Emitimos un error y dejamos b, con el tipo que tenía. b = k Error, porque b tiene tipo entero, e intento ahora asignarle un tipo carácter. Como consecuencia, cuando hay un error no se le asigna el tipo i porque sino permitiríamos cosas como b = 3 Funciona b = f Falla b = k Funciona! (Pero no debe) Un tipo indefinido implica un valor desconocido.
8 Traductores, Compiladores e Intérpretes 8 Para solucionar una situación como b = 3 b = f Valor desconocido b = k Gestión de Tipos Una vez asignado el tipo siempre es el mismo, si durante la ejecución ocurre un error, el tipo de la variable seguirá siendo el mismo, pero podemos añadir una variable booleana a la tabla de símbolos que me diga si el valor de la variable es conocido o no. A continuación se proporciona la solución completa de este problema NOTA: Siempre que tengamos que estudiar un programa LEX/YACC ya hecho, debemos de estudiarlo de las últimas reglas hacia las primeras reglas, ya que las reglas que se reducen primero son las últimas
9 Traductores, Compiladores e Intérpretes 9 #include <stdlib.h> #include <stdio.h> typedef struct nulo struct nulo * sig; char nombre [20]; char tipo; union char valor_char; int valor_int; info; simbolo; simbolo * crear() return NULL; ; void insertar(p_t,s) simbolo **p_t; simbolo * s; s->sig = (*p_t); (*p_t) = s; ; simbolo * buscar(t,nombre) simbolo * t; char nombre[20]; while ( (t!= NULL) && (strcmp(nombre, t->nombre)) ) t = t->sig; return (t); ; void imprimir(t) simbolo * t; while (t!= NULL) printf("%s\n", t->nombre); t = t->sig; ; Fichero: Tabsimb3.c
10 Traductores, Compiladores e Intérpretes 10 %% [0..9] ""."" yylval.numero=atoi(yytext); return NUMERO; yylval.caracter = yytext[1]; return CARACTER; Código LEX : Ejem3l.lex "IMPRIMIR" return IMPRIMIR; "A_ENTERO" return A_ENTERO; "A_CARACTER" return A_CARACTER; ":=" return ASIG; [a-za-z][a-za-z0-9]* yylval.ptr_simbolo = buscar(t,yytext); if(yylval.ptr_simbolo == NULL) yylval.ptr_simbolo = (simbolo *)malloc(sizeof(simbolo)); strcpy(yylval.ptr_simbolo->nombre,yytext); yylval.ptr_simbolo->tipo='i'; insertar(&t,yylval.ptr_simbolo); return ID; [ \t]+ ;. \n return yytext[0];
11 Traductores, Compiladores e Intérpretes 11 % #include "tabsimb3.c" typedef struct char tipo; union char valor_char; int valor_int; info; expresion; simbolo * t; % %union char caracter; int numero; simbolo * ptr_simbolo; expresion valor; %token <caracter> CARACTER %token <numero> NUMERO %token <ptr_simbolo> ID %token IMPRIMIR ASIG A_ENTERO A_CARACTER %type <valor> expr asig %start prog %right '+' %right '*' %% prog : prog asig '\n' prog IMPRIMIR expr '\n' if ($3.tipo == 'e') printf("%d\n",$3.info.valor_int); if ($3.tipo == 'c') printf("%c\n",$3.info.valor_char); printf("indefinido.\n"); ; Código YACC : Ejem3y.yac
12 Traductores, Compiladores e Intérpretes 12 Código YACC : Ejem3y.yac asig : ID ASIG expr $$.tipo = 'i'; if($1->tipo == 'i') $1->tipo = $3.tipo; if ($3.tipo == 'i') printf("asignacion de tipo indefinido.\n"); if ($3.tipo!= $1->tipo) printf("asignacion de tipos incompatibles.\n"); $$.tipo = $1->tipo; if($1->tipo =='e') $1->info.valor_int = $3.info.valor_int; $$.info.valor_int = $3.info.valor_int; $1->info.valor_char = $3.info.valor_char; $$.info.valor_char = $3.info.valor_char; ID ASIG asig $$.tipo = 'i'; if($1->tipo == 'i') $1->tipo = $3.tipo; if ($3.tipo == 'i') printf("asignacion de tipo indefinido.\n"); if ($3.tipo!= $1->tipo) printf("asignacion de tipos incompatibles.\n"); $$.tipo = $1->tipo; if($1->tipo =='e') $1->info.valor_int = $3.info.valor_int; $$.info.valor_int = $3.info.valor_int; $1->info.valor_char = $3.info.valor_char; $$.info.valor_char = $3.info.valor_char; ; ;
13 Traductores, Compiladores e Intérpretes 13 Código YACC : Ejem3y.yac expr : expr '+' expr if(($1.tipo!= 'e') ($3.tipo!= 'e')) $$.tipo = 'i'; printf("error en expresion.\n"); $$.tipo = 'e'; $1.info.valor_int = $1.info.valor_int + $3.info.valor_int; ; expr '*' expr if(($1.tipo!= 'e') ($3.tipo!= 'e')) $$.tipo = 'i'; printf("error en expresion.\n"); $$.tipo = 'e'; $1.info.valor_int = $1.info.valor_int * $3.info.valor_int; ; A_ENTERO '(' expr ')' if ($3.tipo!= 'c') printf("error de conversión de tipos. \n"); $$.tipo = 'i'; $$.info.valor_int= (int)$3.info.valor_char; $$.tipo = 'e'; ;
14 Traductores, Compiladores e Intérpretes 14 Código YACC : Ejem3y.yac A_CARACTER '(' expr ')' if ($3.tipo!= 'e') printf("error de conversión de tipos. \n"); $$.tipo = 'i'; $$.info.valor_char= (char)$3.info.valor_int; $$.tipo = 'c'; ; ID $$.tipo = $1->tipo; if ($$.tipo == 'i') printf("tipo de %s no definido.\n",$1->nombre); if ($$.tipo == 'e') $$.info.valor_int = $1->info.valor_int; $$.info.valor_char = $1->info.valor_char; ; NUMERO $$.tipo = 'e'; $$.info.valor_int = $1; CARACTER $$.tipo = 'c'; $$.info.valor_char = $1; ; %% #include "ejem3l.c" void main() t = crear(); yyparse(); imprimir(t); ; void yyerror(s) char * s; printf("%s\n",s); ;
15 Traductores, Compiladores e Intérpretes 15 Sistemas de Tipos Hasta ahora hemos visto los tipos primitivos (carácter, entero, real ). Pero los tipos más interesantes son los tipos estructurados o tipos complejos ( array, registros, punteros,...). Para estudiar estos tipos necesitamos estudiar los constructores de tipos. Constructores de tipos son palabas que extienden el tipo. Por ejemplo POINTER TO RECORD OF ARRAY PROCEDURE estos no son tipos, sino constructores de tipos (Se utilizan en la zona de declaraciones). Además estos constructores de tipos son recursivos. El problema que nos encontramos es que el tipo de una variable puede ser todo lo extenso que queramos, por lo que no podremos definir el tipo con una letra ( como hicimos en el ejemplo anterior). Por otro lado tenemos los modificadores de tipos (éstos se utilizan en la parte de sentencias). Por regla general los constructores de tipos tienen sus propios modificadores de tipos. Por ejemplo Constructores de tipos POINTER TO RECORD OF Modificadores de tipos ^. ARRAY [ ] PROCEDURE ( ) (No veremos los registros porque el registro actúa sobre el producto cartesiano de todos los tipos posibles.) Qué vamos a permitir en nuestro lenguaje? Los constructores de tipos - POINTER TO - ARRAY - PROCEDURE
16 Traductores, Compiladores e Intérpretes 16 Además de los tipos básicos - BOOLEAN - INTEGER - REAL - CHAR Tenemos cuatro tipos primitivos y tres constructores de tipos. Sistemas de Tipos Además de declaraciones de variables de estos tipos, vamos a permitir que el usuario utilice expresiones de la forma a: POINTER TO BOOLEAN a^ >Es un boolean a > Es un puntero a un boolean Tenemos el problema de como identificar el tipo de una variable compleja (ya que hemos visto que no es posible hacerlo mediante una letra). Supongamos que el usuario define la siguiente variable: alfa : POINTER TO ARRAY [23] OF POINTER TO PROCEDURE (): ARRAY [2] OF INTEGER; Vamos a tener una tabla de símbolos donde almacenaremos el nombre de la variable y el tipo. El tipo tenemos que almacenarlo de forma inteligente ya que luego nos va a servir para detectar errores, y además me permitirá saber qué tipo de modificadores de datos se pueden aplicar: alfa ^ Correcto alfa [2] Incorrecto! alfa ( ) Incorrecto!
17 Traductores, Compiladores e Intérpretes 17 Sistemas de Tipos Para simplificar el problema trabajaremos con procedimientos que no tienen parámetros y siempre devuelven un valor Cada tipo lo vamos a codificar con una letra POINTER TO ARRAY PROCEDURE BOOLEAN INTEGER REAL CHAR Ú b Ú i Ú r Ú p Ú a Ú f Ú c El problema lo solucionaremos con una pila. De forma que alfa : POINTER TO ARRAY [23] OF POINTER TO PROCEDURE ( ): ARRAY [2] OF INTEGER; c c c c c c p a p f a i quedaría almacenado de la siguiente forma La pila la hemos construido mirando el tipo de derecha a izquierda. Para asegurar que en la cima de la pila tengamos el tipo principal de alfa. Es decir, en nuestro caso utilizamos una gramática recursiva por la derecha. Ahora es muy fácil saber qué modificador de tipo puedo usar ^ si la cima de la pila es p [ ] si la cima de la pila es a ( ) si la cima de la pila es f Si alfa es un POINTER TO X, el tipo de alfa^ es X, o lo que es lo mismo, basta con eliminar el tope o cima de la pila para obtener el tipo de X.
18 Traductores, Compiladores e Intérpretes 18 Cómo almacenaremos la pila en nuestro programa LEX/YACC? Sistemas de Tipos El tope de la pila lo guardaremos en el elemento 0 de un array que nos hará de pila. En el caso anterior, la pila la guardamos en un array de caracteres que será ( char tipo [20]) Si queremos acceder a la cima de la pila: 1.- Vamos a tipo [0] y miramos la longitud de la pila ( 6 ). 2.- Vamos a tipo [6] es decir int a = tipo [0]; cima = tipo [a]; o lo que es lo mismo cima = tipo[tipo[0]]; Cuando queramos desapilar un elemento de la pila tipo[0]-- ; Estamos desaprovechando memoria al almacenar los tipos, pero ello no nos preocupa dadas las cantidades actuales de memoria que se manejan. En caso de que la memoria fuese un problema, podríamos usar algún tipo de codificación. POINTER TO Ú p 100 ARRAY Ú a 101 PROCEDURE Ú f 110 BOOLEAN Ú b 000 INTEGER Ú i 001 REAL Ú r 010 CHAR Ú c bits serían suficientes.
19 Traductores, Compiladores e Intérpretes 19 Sistemas de Tipos También podemos codificar cada constructor de tipo con un par de bits, y no un carácter, con lo cual ahorramos espacio No puede existir confusión, ya que lo que está al final de todo el tipo solo puede ser un tipo primitivo Si encontramos una expr con un modificador de tipo, hay que controlar que el tipo principal de tal expresión, coincide con el modificador de tipo. Por ejemplo, si hacemos alfa^, alfa[num] ó alfa( ) hay que controlar que el tipo principal de alfa sea p, a ó f respectivamente. En cualquier caso, necesitamos una gramática para poder manejar toda esas expresiones. expr : ID expr ^ expr ( ) expr [ NUM ]
20 Traductores, Compiladores e Intérpretes 20 Sistemas de Tipos La variable alfa podemos verla como un ID o bien como una expr, sea como sea, el tipo de alfa es el mismo. Como ID tiene un atributo que es un puntero a la tabla de símbolos, donde se guarda el tipo, mientras que como expr tiene como atributo una pila. Ejemplo: vamos a construir el árbol sintáctico de la expresión alfa ^ [3] Los constructores meten en la pila, y los modificadores sacan de la pila. Es decir, a medida que me voy encontrando modificadores de tipos vamos destruyendo, y conforme me encuentro constructores de tipos vamos construyendo la pila. Si me encuentro con un modificador que no es el que se esperaba, entonces emitimos un error y en la pila pondremos u (undefined). (No podemos usar la i de indefinido porque se confunde con la i de integer )
21 Traductores, Compiladores e Intérpretes 21 Gramática a reconocer. Sistemas de tipos % /* El caracter 0 indica el número de posiciones ocupadas en el resto de la cadena */ typedef char cadena_tipo[21]; % %union cadena_tipo tipo; char nombre[20]; %token INTEGER REAL CHAR BOOLEAN POINTER TO %token ARRAY OF PROCEDURE %token NUM CARACTER NUMREAL CTELOGICA %token <nombre> ID %type <tipo> tipo expr decl %start prog Sistemas de Tipos %% prog decl tipo expr : prog decl '\n' prog expr '\n' prog error '\n' ; : ID ',' decl ID ':' tipo ; : INTEGER REAL CHAR BOOLEAN POINTER TO tipo ARRAY '[' NUM ']' OF tipo PROCEDURE '('')'':'tipo ; : ID NUM NUMREAL CARACTER CTELOGICA expr '^' expr'['num']' expr'('')' ;
22 Traductores, Compiladores e Intérpretes 22 Sistemas de Tipos En el lenguaje que estamos definiendo, existe zona de declaraciones y zona de utilizaciones de variables, por lo tanto es el analizador sintáctico (YACC ) quien inserta en la tabla de símbolos. En la regla prog tenemos una regla J que nos permite entrar alguna vez por prog, como paso base de la recursión de las reglas de prog sobre sí misma. En la regla decl, hacemos la gramática recursiva a la derecha a,b,c : POINTER TO INTEGER Los constructores de tipos son recursivos a la derecha, para crear la pila de derecha a izquierda. tipo : es recursivo a la derecha, para, cuando se encuentra un tipo primitivo. Cuando hacemos el tipo en la declaración, una vez metido en la tabla de símbolos el tipo ya no se modifica, los que se modifican son las copias de los tipos. Una vez construida la pila de tipos, tenemos que asociársela a los diferentes identificadores en la declaración. decl : ID, decl Ú esta decl también tiene un tipo, con objeto de ir propagándolo a todos los ID s. ID : tipo Ú Si está en la tabla de símbolos se está intentando redeclarar Error
23 Traductores, Compiladores e Intérpretes 23 Qué ocurre si me encuentro una redeclaración? Sistemas de Tipos expr : puede ser de 4 tipos : i, r, c, b Si es un identificador entonces lo busco en la tabla de símbolos, si no está quiere decir que estoy utilizando una variable que no he definido. Por lo tanto meto en la pila u ( indefinido) Una expresión también puede ser una expr (MT) con el modificador de tipo correspondiente. expr ^ Si la cima de la pila es p, copia el tipo de la pila menos la p. Si la cima no es la p entonces emite un error, y en la pila se mete el tipo u
24 Traductores, Compiladores e Intérpretes 24 #include <stdio.h> typedef struct nulo struct nulo * sig; char nombre[20]; cadena_tipo tipo; simbolo; Fichero : TabSimb4 simbolo * crear() return NULL; ; void insertar(p_t,s) simbolo **p_t; simbolo * s; s->sig = (*p_t); (*p_t) = s; ; simbolo * buscar(t,nombre) simbolo * t; char nombre[20]; while ( (t!= NULL) && (strcmp(nombre, t->nombre)) ) t = t->sig; return (t); ; void imprimir(t) simbolo * t; while (t!= NULL) printf("%s\n", t->nombre); ver_tipo(t->tipo); t = t->sig;
25 Traductores, Compiladores e Intérpretes 25 Código LEX : Ejem4l.lex %% [0-9]+ return NUM; [0-9]+.[0-9]+ return NUMREAL; ""."" return CARACTER; "VERDAD" "FALSO" return CTELOGICA; "INTEGER" return INTEGER; "REAL" return REAL; "CHAR" return CHAR; "BOOLEAN" return BOOLEAN; "POINTER" return POINTER; "TO" return TO; "ARRAY" return ARRAY; "OF" return OF; "PROCEDURE" return PROCEDURE; [a-za-z_][a-za-z0-9_]+ strcpy(yylval.nombre, yytext); return ID; [ \t]+ ;. \n return yytext[0];
26 Traductores, Compiladores e Intérpretes 26 % #include <stdio.h> #include <stdlib.h> /* El caracter 0 indica el número de posiciones ocupadas en el resto de la cadena */ typedef char cadena_tipo[21]; void ver_tipo(tipo) cadena_tipo tipo; unsigned char cont; printf("el tipo es "); for(cont = tipo[0]; cont>0; cont--) switch(tipo[cont]) case('i'): printf("un entero."); break; case('r'): printf("un real."); break; case('b'): printf("un booleano."); break; case('c'): printf("un caracter."); break; case('p'): printf("un puntero a "); break; case('a'): printf("un array de "); break; case('f'): printf("una funcion que devuelve "); break; Código YACC : Ejem4y.yac
27 Traductores, Compiladores e Intérpretes 27 case('u'): printf("indefinido."); break; ; printf("\n"); #include "tabsimb4.c" simbolo *t; % %union cadena_tipo tipo; char nombre[20]; %token INTEGER REAL CHAR BOOLEAN POINTER TO %token ARRAY OF PROCEDURE %token NUM CARACTER NUMREAL CTELOGICA %token <nombre> ID %type <tipo> tipo expr decl %start prog %% prog : prog decl '\n' ver_tipo($2); prog expr '\n' ver_tipo($2); prog error '\n' yyerrok; ; decl : ID ',' decl simbolo * aux; strcpy($$,$3); if(buscar(t,$1)!= NULL) printf("%s ya existe.\n",$1); aux = (simbolo *)malloc(sizeof(simbolo)); strcpy(aux->nombre,$1); strcpy(aux->tipo,$3); insertar(&t,aux); ; Código YACC : Ejem4y.yac
28 Traductores, Compiladores e Intérpretes 28 ID ':' tipo simbolo * aux; strcpy($$,$3); if(buscar(t,$1)!= NULL) printf("%s ya existe.\n",$1); aux = (simbolo *)malloc(sizeof(simbolo)); strcpy(aux->nombre,$1); strcpy(aux->tipo,$3); insertar(&t,aux); ; ; tipo : INTEGER $$[0]=1; $$[1]='i'; REAL $$[0]=1; $$[1]='r'; CHAR $$[0]=1; $$[1]='c'; BOOLEAN $$[0]=1; $$[1]='b'; Código YACC : Ejem4y.yac POINTER TO tipo ARRAY '[' NUM ']' OF tipo strcpy($$,$3); $$[0]++; $$[$$[0]]='p'; strcpy($$,$6); $$[0]++; $$[$$[0]]='a';
29 Traductores, Compiladores e Intérpretes 29 Código YACC : Ejem4y.yac PROCEDURE '('')'':'tipo strcpy($$,$5); $$[0]++; $$[$$[0]]='f'; ; expr : ID if(buscar(t,$1)==null) $$[0] = 1; $$[1] ='u'; printf("%s no encontrada.\n",$1); strcpy($$,buscar(t,$1)->tipo); NUM $$[0] = 1; $$[1] ='i'; NUMREAL CARACTER CTELOGICA expr '^' $$[0] = 1; $$[1] ='r'; $$[0] = 1; $$[1] ='c'; $$[0] = 1; $$[1] ='b'; if($1[$1[0]]!= 'p') $$[0] = 1; $$[1] ='u'; printf("esperaba un puntero.\n"); strcpy($$,$1); $$[0]--;
30 Traductores, Compiladores e Intérpretes 30 Código YACC : Ejem4y.yac expr'['num']' expr'(' ')' ; if($1[$1[0]]!= 'a') $$[0] = 1; $$[1] ='u'; printf("esperaba una tabla.\n"); strcpy($$,$1); $$[0]--; if($1[$1[0]]!= 'f') $$[0] = 1; $$[1] ='u'; printf("esperaba una funcion.\n"); strcpy($$,$1); $$[0]--; %% #include "ejem4l.c" void main() t=crear(); yyparse(); imprimir(t); void yyerror(char * s) printf("%\n",s);
Tema 5 Tabla de Símbolos
Traductores, Compiladores e Intérpretes 1 Tema 5 También se la llama tabla de nombres o tabla de identificadores y tiene dos funciones principales: - Efectuar chequeos semánticos. - Generación de código.
PRÁCTICA. Apellidos, Nombre: Calificación:
Examen de Traductores, Intérpretes y Compiladores. Convocatoria ordinaria de Junio de 2004 3 er Curso de I.T. Informática de Sistemas. Apellidos, Nombre: Calificación: PRÁCTICA El lenguaje Protolen posee
TEORÍA. N T f n h g $ S S P f C n S S P f C n S S C h P n S S C h P n S S P P f P n f P
1.- Sea la gramática: S P f C n S C h P n S P n f P f C g C h %token f n h g cuya tabla de reconocimiento LL(1) es: Examen de Traductores, Intérpretes y Compiladores. Convocatoria extraordinaria de Diciembre
PRÁCTICA. Examen de Traductores, Intérpretes y Compiladores. Convocatoria ordinaria de Junio de er Curso de I.T. Informática de Sistemas.
Examen de Traductores, Intérpretes y Compiladores. Convocatoria ordinaria de Junio de 2002 3 er Curso de I.T. Informática de Sistemas. Apellidos, Nombre: Calificación: PRÁCTICA Se desea construir un intérprete
TEÓRICO. 3 Curso de I.T. Informática de Sistemas. Examen de Traductores, Intérpretes y Compiladores. Convocatoria ordinaria de Junio de 2006 er
1.- Dado el programa Lex: %start S %% ^[ \t\n]* * BEGIN S (. \n)+ BEGIN 0 [a-z]+. \n en cuántos tokens se divide la entrada: \t\t\n\t* Hola \nejemplo@ cuáles son estos tokens y por qué? Examen de Traductores,
TEORÍA. definition TAG. PROPERTIES ID expr EXTENDS ID FIN_TAG. DELAYED : expr
Examen de Traductores, Intérpretes y Compiladores. Convocatoria ordinaria de Septiembre de 2004 3 er Curso de I.T. Informática de Sistemas. Apellidos, Nombre: Calificación: TEORÍA 1.- Escribir una gramática
TEÓRICO ID ; = [ ], $
N Examen de Traductores, Intérpretes y Compiladores. Convocatoria ordinaria de Septiembre de 2007 er 3 Curso de I.T. Informática de Sistemas. Apellidos, Nombre: Calificación: TEÓRICO 1.- Dibujar un único
YACC. Los símbolos terminales que la gramática empleará. El axioma o símbolo inicial de la gramática. %token. %start
YACC Yacc (Yet Another Compiler Compiler) es un programa que permite construir analizadores gramaticales en C a partir de una gramática libre al contexto. Junto con Lex permite construir rápidamente las
Capítulo 7 Gestión de tipos
Java a tope: Traductores y compiladores con Lex/Yacc, JFlex/Cup y JavaCC Capítulo 7 Gestión de tipos 7.1 Visión general Un compilador debe comprobar si el programa fuente sigue tanto las convenciones sintácticas
Examen de Traductores, Intérpretes y Compiladores. Convocatoria ordinaria de Junio de er Curso de I.T. Informática de Sistemas.
Examen de Traductores, Intérpretes y Compiladores. Convocatoria ordinaria de Junio de 2001 3 er Curso de I.T. Informática de Sistemas. Apellidos, Nombre: Calificación: PRÁCTICA Con el presente problema,
Análisis semántico. Análisis semántico. Índice (I)
Análisis semántico Índice (I) Marina de la Cruz Alfonso Ortega Objetivo del análisis semántico Decisiones para la construcción de un analizador semántico Análisis semántico con Bison Nivel de indirección
DESARROLLO DE LA PRÁCTICA DE ANÁLISIS SINTÁCTICO
1/5 DESARROLLO DE LA PRÁCTICA DE ANÁLISIS SINTÁCTICO CREACIÓN DEL FICHERO ALFA.Y 1. En la sección de definiciones, se incorporan los siguientes elementos: #include para utilizar la función fprintf.
Compiladores: Análisis Semántico. Pontificia Universidad Javeriana Cali Ingenieria de Sistemas y Computación Prof. Gloria Inès Alvarez V.
Compiladores: Análisis Semántico Pontificia Universidad Javeriana Cali Ingenieria de Sistemas y Computación Prof. Gloria Inès Alvarez V. Verificaciòn de tipos Se puede hacer en forma Estàtica: en tiempo
ESTRUCTURA DE DATOS. Memoria estática Memoria dinámica Tipo puntero Declaración de punteros Gestión de memoria dinámica Resumen ejemplo
ESTRUCTURA DE DATOS Memoria estática Memoria dinámica Tipo puntero Declaración de punteros Gestión de memoria dinámica Resumen ejemplo DATOS ESTÁTICOS Su tamaño y forma es constante durante la ejecución
Examen de Traductores, Intérpretes y Compiladores. Convocatoria ordinaria de Junio de 2007 er. 3 Curso de I.T. Informática de Sistemas.
1.- Sea la gramática: P > n P P O O > m s d cuya tabla de análisis LALR(1) es: Examen de Traductores, Intérpretes y Compiladores. Convocatoria ordinaria de Junio de 2007 er 3 Curso de I.T. Informática
Elementos de un programa en C
Elementos de un programa en C Un programa en C consta de uno o más archivos. Un archivo es traducido en diferentes fases. La primera fase es el preprocesado, que realiza la inclusión de archivos y la sustitución
Uso de la herramienta YACC
1 Compiladores / Guía VI / Ciclo 02-2016 Centro de Investigación y Transferencia de Tecnología Uso de la herramienta YACC Contenido Facultad: Ingeniería Escuela: Computación Asignatura: Compiladores En
Tema 1 INTRODUCCIÓN A LOS LENGUAJES DE PROGRAMACIÓN
Tema 1 INTRODUCCIÓN A LOS LENGUAJES DE PROGRAMACIÓN - Introducción - Sintaxis - Semántica básica - Tipos de datos - Expresiones y enunciados - Procedimientos y ambientes - Tipos abstractos de datos y módulos
Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones
Unidad Didáctica 2 Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Versión 1.0.3 Índice
FLEX: A FAST LEXICAL ANALYZER GENERATOR
FLEX: A FAST LEXICAL ANALYZER GENERATOR Especificación Léxica Fichero.l flex Programa con la implementación del AFD, código fuente, yy.lex.c yy.lex.c Compilador de C milex (ejecutable) Para compilar flex
Universidad Autónoma del Estado de México 2016, Año del 60 Aniversario de la Universidad Autónoma del Estado de México
Universidad Autónoma del Estado de México 2016, Año del 60 Aniversario de la Universidad Autónoma del Estado de México Unidad Académica Profesional Tianguistenco Ingeniería de Software Estructura de Datos
Capítulo 11 INTRODUCCIÓN A LA CODIFICACIÓN EN C. Presentación resumen del libro: "EMPEZAR DE CERO A PROGRAMAR EN lenguaje C"
Presentación resumen del libro: "EMPEZAR DE CERO A PROGRAMAR EN lenguaje C" Autor: Carlos Javier Pes Rivas (correo@carlospes.com) Capítulo 11 INTRODUCCIÓN A LA CODIFICACIÓN EN C 1 OBJETIVOS Aprender a
YACC (Yet Another Compiler Compiler) LALR(1) Parser Generator
YACC (Yet Another Compiler Compiler) LALR(1) Parser Generator 1 INDICE 1. Introducción 2. Especificaciones 3. Ambigüedad y conflictos 4. Tratamiento de errores 5. Uso con el LEX 6. Algunos consejos prácticos
Bison. Introducción. Índice. Introducción Uso de Bison con Flex. Formato del fichero de especificación de Bison
Bison Índice Marina de la Cruz Alfonso Ortega Introducción Uso de Bison con Flex Construcción del programa objetivo alfa Comunicación entre las funciones main(), yylex() e yyparse() Formato del fichero
Tema: Análisis Semántico
Compiladores. Guía 7 1 Facultad: Ingeniería Escuela: Computación Asignatura: Compiladores Tema: Análisis Semántico Contenido En esta guía se desarrollará una tabla de símbolos y se asociará al analizador
Realizar el ejercicio anterior utilizando Punteros
PUNTEROS Y ARRAYS En C existe una relación entre punteros y arrays tal que cualquier operación que se pueda realizar mediante la indexación de un arrays, se puede realizar también con punteros. Para clarificar
Tema 5. Análisis semántico
Departamento de Tecnologías de la Información Tema 5 Análisis semántico Ciencias de la Computación e Inteligencia Artificial Índice 5.1 Características del análisis semántico 5.2 Gramáticas atribuidas
ANÁLISIS SEMÁNTICO VERIFICACIÓN DE TIPOS
Todos los derechos de propiedad intelectual de esta obra pertenecen en exclusiva a la Universidad Europea de Madrid, S.L.U. Queda terminantemente prohibida la reproducción, puesta a disposición del público
Tema 13: Apuntadores en C
Tema 13: Apuntadores en C M. en C. Edgardo Adrián Franco Martínez http://www.eafranco.com edfrancom@ipn.mx @edfrancom edgardoadrianfrancom Estructuras de datos (Prof. Edgardo A. Franco) 1 Contenido Introducción
Práctica 4 Análisis LALR para milenguaje y construcción de un traductor de milenguaje
Práctica 4 Análisis LALR para milenguaje y construcción de un traductor de milenguaje 1. Objetivos 1. Hacer una introducción práctica a la traducción dirigida por la sintaxis basada en el análisis LALR
Estructuras de Datos Dinámicas: Listas
Estructuras de Datos Dinámicas: Listas Teoría: Programación I http://proguno.unsl.edu.ar proguno@unsl.edu.ar Listas Capacidad: dinámica Orden: no cronológico. El orden puede ser definido por el programador.
2. Se puede aplicar a la representación intermedia un optimizador de código independiente de la máquina.
Traductores, Compiladores e Intérpretes 1 Tema 7 Generación de Código En el modelo de análisis y síntesis de un compilador, la etapa inicial traduce un programa fuente a una representación intermedia a
UNIDAD V. Analisis Semantico. 5.1 Introduccion. Analizador Semántico. Verifica que el significado de las construcciones del lenguaje tengan sentido.
UNIDAD V Analisis Semantico 5.1 Introduccion Analizador Semántico. Ejemplo: Verifica que el significado de las construcciones del lenguaje tengan sentido. Tareas del analizador semántico: 1) Comprobación
PRÁCTICA DE PROCESADORES DE LENGUAJE EVALUACIÓN ORDINARIA CURSO 2009/2010 OBJETIVO DE LA PRÁCTICA
PRÁCTICA DE PROCESADORES DE LENGUAJE EVALUACIÓN ORDINARIA CURSO 2009/2010 OBJETIVO DE LA PRÁCTICA El objetivo de la práctica es desarrollar un compilador utilizando las herramientas flex y bison y el lenguaje
Procesadores de lenguaje Tema 5 Comprobación de tipos
Procesadores de lenguaje Tema 5 Comprobación de tipos Departamento de Ciencias de la Computación Universidad de Alcalá Resumen Sistemas de tipos. Expresiones de tipo. Equivalencia de tipos. Sobrecarga,
8- LEX-Expresiones regulares
8- LEX-Expresiones regulares Objetivos: Utilizar la herramienta KEX para trabajar con expresiones regulares Recursos: Maquina virtual Linux distribución Bodhi LXterminal y FLEX Introducción Flex le permite
Unidad V Análisis Semántico. M.C. Juan Carlos Olivares Rojas
Unidad V Análisis Semántico M.C. Juan Carlos Olivares Rojas Agenda 5.1 Analizador semántico 5.2 Verificación de tipos en expresiones. 5.3 Conversión de tipos. 5.4 Acciones agregadas en un analizador sintáctico
Programación. Test Autoevaluación Tema 3
Programación Test Autoevaluación Tema 3 Autores: M. Paz Sesmero Lorente Paula de Toledo Heras Fco. Javier Ordoñez Morales Juan Gómez Romero José A. Iglesias Martínez José Luis Mira Peidro SOLUCIONES 1.
Sobrecarga de Operadores II
D é c i m o q u i n t a S e s i ó n Metodologías y Técnicas de Programación II Programación Orientada a Objeto (POO) C++ Sobrecarga de Operadores II 1 Sobrecarga de operadores unitarios (o unarios) Son
APUNTADORES. Un apuntador es un objeto que apunta a otro objeto. Es decir, una variable cuyo valor es la dirección de memoria de otra variable.
APUNTADORES Un apuntador es un objeto que apunta a otro objeto. Es decir, una variable cuyo valor es la dirección de memoria de otra variable. No hay que confundir una dirección de memoria con el contenido
GENERACIÓN DE CÓDIGO INTERMEDIO ÁRBOLES DE SINTAXIS ABSTRACTA (ASA)
Todos los derechos de propiedad intelectual de esta obra pertenecen en exclusiva a la Universidad Europea de Madrid, S.L.U. Queda terminantemente prohibida la reproducción, puesta a disposición del público
Curso de Java Introducción a la Programación II
Curso de Java Introducción a la Programación II Jaime Fernández Martín Curso INEM 02830. Programación en Java Marzo 2010 Índice 1 Tipos Java 2 Decalaración de variables 3 Operadores aritméticos Índice
Unidad II: Análisis semántico
Unidad II: Análisis semántico Se compone de un conjunto de rutinas independientes, llamadas por los analizadores morfológico y sintáctico. El análisis semántico utiliza como entrada el árbol sintáctico
Cursosindustriales. Curso de C / C++ Por Deimos_hack
MÓDULO 1. OPERADORES, PUNTEROS Y REFERENCIAS LÓGICAS Cualquier lenguaje informático es capaz de realizar operaciones matemáticas, pues un ordenador, es por así decirlo una calculadora un tanto cara. La
DEFINICIONES BÁSICAS DE LAS ESTRUCTURAS DE DATOS
DEFINICIONES BÁSICAS DE LAS ESTRUCTURAS DE DATOS En programación, una estructura de datos es una forma de organizar un conjunto de datos elementales con el objetivo de facilitar su manipulación Un dato
Unidad III Análisis Léxico. M.C. Juan Carlos Olivares Rojas
Unidad III Análisis Léxico M.C. Juan Carlos Olivares Rojas Agenda 3.1 Introducción a los Autómatas finitos y expresiones regulares. 3.2 Analizador de léxico. 3.3 Manejo de localidades temporales de memoria
PUNTEROS (APUNTADORES)
2010 UNAN LEON Departamento de Computación Ing. En Sistemas Sabatino Autor: Ing: Karina Esquivel Alvarado. Asignatura: Algoritmo y Estructura de Datos. PUNTEROS (APUNTADORES) TEMA 4: PUNTEROS (APUNTADORES)
GENERACIÓN DE CÓDIGO INTERMEDIO EJEMPLOS PARA DISTINTAS ESTRUCTURAS DE DATOS
Todos los derechos de propiedad intelectual de esta obra pertenecen en exclusiva a la Universidad Europea de Madrid, S.L.U. Queda terminantemente prohibida la reproducción, puesta a disposición del público
Variables. Una variable no es más que un nombre simbólico que identifica una dirección de memoria: vs.
Variables Una variable no es más que un nombre simbólico que identifica una dirección de memoria: Suma el contenido de la posición 3001 y la 3002 y lo almacenas en la posición 3003 vs. total = cantidad1
Tipos Recursivos de Datos
1/1 Tipos Recursivos de Datos Josefina Sierra Santibáñez 27 de noviembre de 2016 2/1 Introducción La recursividad no sólo se puede aplicar a la definición de procedimientos (i.e. funciones o acciones),
Desarrollo de Programas. Prof. Lisbeth C. Pérez Rivas
Desarrollo de Programas Prof. Lisbeth C. Pérez Rivas lisbethpe@ula.ve Desarrollo de Programas Ejercicio: Calcular el sueldo neto de un trabajador conociendo el número de horas trabajadas, la tarifa horaria
VARIABLES, CONSTANTES Y EXPRESIONES ASIGNACIÓN. TIPOS ELEMENTALES. PRECEDENCIA DE LOS ESTRUCTURAS DE CONTROL. CONDICIONAL E
Java Java es un lenguaje de programación presentado en 1995 enfocado a: soportar los fundamentos de la programación orientada a objetos. generar código independiente de la arquitectura de la computadora
Informática General 2016 Cátedra: Valeria Drelichman, Pedro Paleo, Leonardo Nadel, Norma Morales
UNA / AREA TRANSDEPARTAMENTAL DE ARTES MULTIMEDIALES Licenciatura en Artes Multimediales Informática General 2016 Cátedra: Valeria Drelichman, Pedro Paleo, Leonardo Nadel, Norma Morales JavaScript Algoritmo
ANÁLISIS SINTÁCTICO II GENERADOR DE ANALIZADORES SINTÁCTICOS ASCENDENTES
Todos los derechos de propiedad intelectual de esta obra pertenecen en exclusiva a la Universidad Europea de Madrid, S.L.U. Queda terminantemente prohibida la reproducción, puesta a disposición del público
Concepto de compilador Intérprete Fases de un Compilador Herramientas de construcción de Compiladores
18:55 1 2 Temas Concepto de compilador Intérprete Fases de un Compilador Herramientas de construcción de Compiladores Objetivo Que el estudiante logre conocer, comprender y manejar conceptos y técnicas
Java. Introducción a la Programación Orientada a Objetos
Java Java es un lenguaje de programación presentado en 1995 enfocado a: soportar los fundamentos de la programación orientada a objetos. generar código independiente de la arquitectura de la computadora
Autoestudio 2: Variables y Operadores
Autoestudio 2: Variables y es Componentes de un programa Cuando escribimos en un lenguaje de programación tenemos que entender la sintaxis del lenguaje. A continuación empezaremos con la sintaxis básica
Analizador Sintáctico RECURSIVO
Compiladores 1 Argueta Cortes Jairo I. Universidad Nacional Autónoma de México Facultad de Ingeniería Compiladores Grupo 1 Analizador Sintáctico RECURSIVO ALUMNOS: ARGUETA CORTES JAIRO I. MENDOZA GAYTAN
Analizador Léxico en ANSI C
Compiladores 1 Argueta Cortes Jairo I. Universidad Nacional Autónoma de México Facultad de Ingeniería Compiladores Grupo 1 en ANSI C ALUMNOS: ARGUETA CORTES JAIRO I. MENDOZA GAYTAN JOSE TRINIDAD PROFESORA:
Tipos de Datos Estructurados
- Unidad 3 Tipos de Datos Estructurados 1 Tipos de Datos Compuestos en C 2 Arreglos (1) Un arreglo (array) una colección homogénea de datos simples ó compuestos, que se referencian con un nombre comú,
2.2 Nombres, Ligado y Ámbito
2.2 Nombres, Ligado y Ámbito Ligado estático y dinámico, reglas de ámbito y prueba de tipos. Conceptos Nombres e Identificadores Variables Tipos Ámbito Constantes Nombres Identificador que designa en el
Programación I Funciones
1 Funciones Iván Cantador 2 Funciones: definición, sintaxis, ejemplos (I) Una funciónes un bloque de sentencias identificado con un nombre que se ejecutan de manera secuencial ofreciendo una funcionalidad
Programación de Videojuegos Tema 15 Tipos de Dato I. 15. Tipos de Dato I
15. Por ahora ya sabemos lo suficiente sobre el muestreo de textos por pantalla, aunque por supuesto a falta de practicar un poco. Vamos a cambiar un poco de temática y vamos a ver otros aspectos avanzados
Análisis semántico Tabla de símbolos, chequeo de tipos y representaciones internas
Análisis semántico Tabla de símbolos, chequeo de tipos y representaciones internas Análisis semático c 2001 José Fortes Gálvez p.1 Análisis?... semántico? La semántica corresponde al significado asociado
OPERADORES Y EXPRESIONES
OPERADORES Y EXPRESIONES Una expresión es una combinación de variables, literales y operadores, que representan un valor Operadores aritméticos Operador Función + suma - resta * producto / división % operador
Lección 2 Introducción al lenguaje C
Lección Introducción al lenguaje C Decimal Binario Hexadecimal A B C D E F Octal Equivalencia entre decimal, binario, hexadecimal y octal. Código ASCII (American Standard Code for Information Interchange)
Compiladores e intérpretes Introducción
Introducción Profesor: Eridan Otto Introducción Perspectiva histórica Motivación Definiciones Componentes y fases de un compilador 1 Introducción Definiciónes básicas Traductor: desde un punto de vista
ESTRUCTURAS DINÁMICAS DE DATOS (PILAS) EN C
2013 ESTRUCTURAS DINÁMICAS DE DATOS (PILAS) EN C Departamento de Computación UNAN-León TEMA 4: ESTRUCTURAS DINÁMICAS DE DATOS (PILAS) 4.1 INTRODUCCIÓN: En términos de listas lineales, una pila puede ser
Unidad 2. Introducción Lenguajes y Compiladores
Unidad 2 Introducción Lenguajes y Compiladores Principal material bibliográfico utilizado Compiladores Principios, técnicas y herramientas. Aho y Ullman. Addison Wesley. www.jorgesanchez.net www.iqcelaya.itc.mx/~vicente/programacion/tradcomp.pdf
Construyendo Programas más Complejos
Arquitectura de Ordenadores Construcciones de Alto Nivel en Ensamblador Abelardo Pardo abel@it.uc3m.es Universidad Carlos III de Madrid Departamento de Ingeniería Telemática Construyendo Programas más
Programación Estructurada
Programación Estructurada PROGRAMACIÓN ESTRUCTURADA 1 Sesión No. 2 Nombre: El lenguaje de programación C Contextualización Una constante en todos los lenguajes de programación (viejos y nuevos) es la implementación
3 - Tipos Inductivos (Recursivos)
Programación 2 3 - Tipos Inductivos (Recursivos) Estructuras Dinámicas: Punteros y Listas 1 Tipos inductivos tienen, en general, cardinalidad infinita contienen valores de "tamaño arbitrario" Ejemplos:
PROGRAMACIÓN EN LENGUAJE C VARIABLES Y CONSTANTES
VARIABLES Y CONSTANTES Variables: Es un espacio reservado en la memoria donde podemos almacenar un valor durante la ejecución de un programa, a dicho espacio se le asocia un nombre (identificador). El
UNIVERSIDAD NACIONAL DE JUJUY FACULTAD DE INGENIERÍA APUNTES DE CÁTEDRA EL METACOMPILADOR BISON INTERFAZ FLEX - BISON
UNIVERSIDAD NACIONAL DE JUJUY FACULTAD DE INGENIERÍA Compiladores APUNTES DE CÁTEDRA EL METACOMPILADOR BISON INTERFAZ FLEX - BISON 1. Qué es BISON? BISON, al igual que FLEX, permite generar programas de
Instituto Tecnológico de Celaya
CADENAS DE CARACTERES Hasta ahora se han manejado variables de tipo caracter cuyo valor es un sólo caracter. En algunos casos, sin embargo, es necesario usar variables cuyos valores sean un conjunto (cadena)
Informática PRÀCTICA 9 Curs Práctica Nº 9: Rango y precisión de representación de números en el ordenador.
Departamento de Práctica Nº 9: Rango y precisión de representación de números en el ordenador. Uso de punteros Objetivos de la práctica: - Entender la representación de números (enteros y reales) en el
Principal material bibliográfico utilizado
Vectores y Punteros Principal material bibliográfico utilizado www.jorgesanchez.net Fundamentos de Programación C/C++ - Ernesto Peñaloza Romero. Lenguaje C Adolfo Beltramo, Nélida Matas. En C el primer
TADs en C. Matías Bordese Algoritmos y Estructuras de Datos II - Laboratorio 2013
TADs en C Matías Bordese Algoritmos y Estructuras de Datos II - Laboratorio 2013 1. Objetivos Definición de TADs en C Ocultación de la implementación del TAD Manejo básico de memoria dinámica 2. Usando
Unidad I Tipos de Datos en C
Tipos de Datos en C 1. El concepto de los tipos de datos. 2. Tipos de datos básicos del C. 3. Modificadores de tipo. 4. Declaración de variables. 5. Inicialización de variables. 6. Declaración de identificadores
Algoritmos y Estructuras de Datos Ingeniería en Informática, Curso 2º SEMINARIO DE C++ Sesión 1
Algoritmos y Estructuras de Datos Ingeniería en Informática, Curso 2º SEMINARIO DE C++ Sesión 1 Contenidos: 1. Características generales de C++ 2. Entrada/salida estándar 3. Variables y tipos de datos
/* Compilador del Lenguaje Micro (Fischer) */ #include <stdio.h> #include <string.h> #include <ctype.h>
1 /* Compilador del Lenguaje Micro (Fischer) */ #include #include #include #define NUMESTADOS 15 #define NUMCOLS 13 #define TAMLEX 32+1 #define TAMNOM 20+1 /******************Declaraciones
Instituto Tecnológico de Celaya
ELEMENTOS BÁSICOS DE C++: DECLARACIÓN DE VARIABLES A través de operaciones aritméticas (suma, resta, etc.) y lógicas (por ejemplo, comparaciones) los programas manipulan datos tales como números y caracteres.
Números enteros (cortos, largos y sin signo) Números reales (precisión simple y doble) Carácter y cadenas de caracteres. Lógicos.
Universidad Rafael Urdaneta Escuela de Ingeniería de Computación Números enteros (cortos, largos y sin signo) Números reales (precisión simple y doble) Carácter y cadenas de caracteres. Lógicos. Asignación
Programación 1 Tema 3. Información, datos, operaciones y expresiones
Programación 1 Tema 3 Información, datos, operaciones y expresiones Índice Datos y tipos de datos Datos primitivos en C++ Expresiones e instrucción de asignación Datos y tipos de datos Problema información
Es un lenguaje estructurado, tiene una abundante cantidad de operadores y tipos de datos.
Lenguaje C Un poco de historia C es un lenguaje de propósito general, es decir, se pueden desarrollar aplicaciones de diversas áreas. Dentro de sus principales características podemos mencionar que: Es
Apunte Laboratorio ALPI - El lenguaje de programación Pascal
Apunte Laboratorio ALPI - El lenguaje de programación Pascal 1 2 ÍNDICE GENERAL Índice 1. Estructura de un Programa en Pascal 3 2. Sintaxis de Pascal 4 2.1. Uso de mayúsculas.....................................
Tema 2: Desarrollo de Algoritmos. E.E. de Algorítmica
Tema 2: Desarrollo de Algoritmos E.E. de Algorítmica Temas a tratar Identificadores Variables Constantes Tipos de Datos Separadores Operadores Aritméticos Unarios Relacionales y Condicionales Nivel de
Tipos de datos y Operadores Básicos
Módulo I: Conceptos Básicos Tema 1. Qué es un ordenador? Tema 2. Cómo se representan los datos en un ordenador? Tema 3. Qué es un lenguaje de programación? Tema 4. Cómo se hace un programa informático?
Una expresión es una combinación de uno o más operandos y operadores para obtener un resultado.
1.6. EXPRESIONES CONCEPTO: Una expresión es una combinación de uno o más operandos y operadores para obtener un resultado. Los operandos pueden ser constantes, variables, otras expresiones e incluso funciones.
Tema 2: Análisis léxico
Tema 2: Análisis léxico Procesamiento de Lenguajes Dept. de Lenguajes y Sistemas Informáticos Universidad de Alicante Procesamiento de Lenguajes Tema 2: Análisis léxico 1 / 22 Fundamentos del análisis
ESTRUCTURAS DINÁMICAS DE DATOS (PILAS)
200 UNAN LEON Departamento de Computación Ingeniería en Sistema y Telemática Docente: Ing. Juan Carlos Antón S. Asignatura: Algoritmo y Estructuras de Datos ESTRUCTURAS DINÁMICAS DE DATOS (PILAS) Pilas
Lenguaje de Programación: C++ ARCHIVOS I/O
UG C++ Lenguaje de Programación: C++ ARCHIVOS I/O Universidad de Guanajuato Octubre 2010 Como abrir un archivo Antes de poder escribir datos en un archivo, debemos abrirlo, esto significa que debemos decirle
Conceptos básicos sobre gramáticas
Procesamiento de Lenguajes (PL) Curso 2014/2015 Conceptos básicos sobre gramáticas Gramáticas y lenguajes Gramáticas Dado un alfabeto Σ, un lenguaje es un conjunto (finito o infinito) de cadenas de símbolos
TEMA 02 TIPOS, OPERADORES Y EXPRESIONES
TEMA 02 TIPOS, OPERADORES Y EXPRESIONES 2.1.- Introducción. 2.2.- Datos. 2.3.- Entrada y salida básica. 2.4.- Modificadores. 2.5.- Cadenas de caracteres. 2.6.- Operadores. 2.7.- Precedencia de operadores.
ANÁLISIS SEMÁNTICO GRAMÁTICAS DE ATRIBUTOS Y TIPOS
Todos los derechos de propiedad intelectual de esta obra pertenecen en exclusiva a la Universidad Europea de Madrid, S.L.U. Queda terminantemente prohibida la reproducción, puesta a disposición del público
Tipos de variables. Lenguaje C. Departamento de Electrónica. Tipos de datos, variables y constantes. Fundación San Valero
Lenguaje C Tipos de variables Departamento de Electrónica Fundación San Valero Tipos de datos, Cinco tipos de datos básicos: Carácter (char): 8 bits -128 a 127. Entero (int): 32 bits -2.147.483.648 a 2.147.483.647.
ANEXO XVII DE LA RESOLUCION N
Hoja 1 de 7 UNIVERSIDAD NACIONAL DE CÓRDOBA Facultad de Ciencias Exactas Físicas y Naturales República Argentina Programa de: Código: Informática Carrera: Materia común Res. Nº Plan: Puntos:3.5 Escuela:
Ficha de Aprendizaje N 13
Ficha de Aprendizaje N 13 Curso: Lógica y lenguaje de programación Tema: Fundamentos de programación Duración: 2 horas pedagógicas Logros de aprendizaje Identifica los diferentes tipos de operadores que
1. Sean los siguientes dos tipos de datos: a : INTEGER; b : ARRAY [1..3] OF CHAR; c : ARRAY [4..5] OF CHAR; END;
Examen de Traductores, Intérpretes y Compiladores. Convocatoria ordinaria de Junio de 2003 3 er Curso de I.T. Informática de Sistemas. TYPE UNO = DOS = TEST DE TEORÍA 1. Sean los siguientes dos tipos de
Componentes Básicos. InCo. InCo Componentes Básicos 1 / 28
Componentes Básicos InCo InCo Componentes Básicos 1 / 28 Modelo de Computación Vemos al computador como un procesador de datos. +------------+ Entrada ===> Computador ===> Salida +------------+ InCo Componentes