Tema: Compilador Micro C

Compiladores. Guía 13 1 Facultad: Ingeniería Escuela: Computación Asignatura: Compiladores Tema: Compilador Micro C Contenido En esta guía se modif...
25 downloads 0 Views 306KB Size
Compiladores. Guía 13

1

Facultad: Ingeniería Escuela: Computación Asignatura: Compiladores

Tema: Compilador Micro C Contenido En esta guía se modificará el resultado de las guías anteriores para integrar y desarrollar las partes restantes para conformar el compilador Micro C.

Objetivos Específicos Utilizar un compilador Micro C Conocer las convenciones léxicas.

Material y Equipo Guía de Laboratorio Nº 13. Computadora con DevC++

Introducción Teórica Convecciones léxicas: Guía 3 es case sensitive, es decir que las letras mayúsculas Micro-C y minúsculas se tratan como caracteres diferentes.

Guía 4

Comentarios y caracteres ignorados. fía comentarios son secuencias de carácter incluido dentro de Los par de secuencias de /*…*/ pareados. Los comentarios pueden extender sobre varias líneas, pero los comentarios anidados no se reconocen, es decir que el primer encontrado */ dentro de un comentario lo cierra. Los comentarios son ignorados. Otros caracteres ignorados incluyen el newline, la tabulación horizontal, el CR, y el espacio blanco.

Tokens Las secuencias de caracteres encerrados dentro de dos apóstrofes (') son símbolos terminales. Cualquier otra secuencia de caracteres denota el nombre de una clase léxica, por ejemplo:

2

Compiladores. Guía 13

En secciones posteriores léxicas siguientes:

utilizaremos

las

definiciones

• letra = ' _ ' | ' a ' | ' b ' |... | ' z ' | ' A ' | ' B ' |... | ' Z ' • dígito = ' 0 ' | ' 1 ' |... | ' 9 ' Observe que el carácter del underscore (_) está tratando como una letra. Identificadores: Un identificador es una secuencia finita de letras y de dígitos que comienzan con una letra. Los identificadores pueden ser de cualquier longitud, sin embargo, los identificadores sin diferencia en sus primeros 8 caracteres correspondientes se consideran iguales. • identificador = (letra) (letra | dígito) *. Constantes numéricas. Un integer_constant es una secuencia de dígitos (no debe comenzar con un 0, a menos que sea el número 0). • integer_constant = digit+ Una constante numérica se debe separar de un identificador o de una palabra clave. Constantes de carácter. Un chat_constant se define como una comilla simple de apertura (“”), un carácter ASCII extendido imprimible y una comilla simple de cierre. Strings Constantes. Una constante de string es una secuencia de los caracteres incluidos dentro de dos comillas dobles ("). Una constante de string puede incluir la secuencia \” que representa un carácter de comillas doble en la secuencia en la cual ocurre, tal que no termina el string. La secuencia \n representa el carácter del NEWLINE, mientras que la secuencia \ \ representa el carácter del backslash y se puede incluir en un string también. Una secuencia consistente de un backslash seguido por cualquier carácter a excepción de 'n', ' \ ', o ' " ' es ilegal. Por consiguiente, un string constante no debe extenderse más allá del extremo de la línea. Un par de /*…*/ dentro de un string constante no se trata como comentario.

Compiladores. Guía 13 3

Operadores • add_op = ' + ' | ' - ' • mul_op = ' * ' | '/' • eq_op = ' = = ' | '! = ' • rel_op = ' < ' | ' < = ' | ' > = ' | ' > ' Otros símbolos Otros símbolos que aparecen en la gramática abajo se denotan dentro de comillas dobles. Las palabras reservadas están además marcadas en negrita. Los tokens que fueron definidos arriba se imprimen en negrilla. Gramática de Micro-C translation_unit -> external-declaration |translation_unit externaldeclaration external-declaration -> function-definition |declaration function_definition -> function_def_header function_body function_def_header -> return_type identifier "(" parameters _def ")" return_type -> type | "void" parameters_def -> parameter_def_list | "void" parameter_def_list -> type identifier |parameter_def_list "," type identifier function_body -> "{" declarations statement_list "}" declarations -> declarations declaration | _ declaration -> variable_declaration |function_declaration variable_declaration -> type identifier_list ";" function_declaration -> return_type identifier "(" parameters _decl ")" ";" parameters_decl -> parameter_decl_list | parameter_decl_list "," "..." | "void" parameter_decl_list -> parameter_decl_spec |parameter_decl_list "," parameter_decl_spec parameter_decl_spec -> type identifier | "char" "*"identifier statement_list -> statement_list statement | statement statement -> expression ";" | "return" ";" | "return" expression ";" | "while" "(" expression ")" statement | "if" "(" expression ")" statement | "if" "(" expression ")" statement "else"statement | "{" statement_list "}" expression -> equality_expression "=" equality_expression |equality_expression equality_expression->relational_expression eq_op relational_expression| relational_expression simple_expression -> simple_expression add_op term | term term -> term mul_op factor | factor factor -> constant | identifier | "(" expression ")" | add_op factor | identifier "(" expression_list ")" |identifier "(" ")" constant -> string_constant | numeric_constant| char_constant

4

Compiladores. Guía 13

numeric_constant -> integer_constant | floating_constant expression_list -> expression | expression_list "," expression identifier_list -> identifier | identifier_list "," identifier type -> "int" | "char"

Detalles de implementación. El lenguaje Micro C es un subconjunto pequeño del lenguaje de programación C y por tanto debe compilar correctamente con un compilador de ANSI C. Tipos de datos El Micro C ofrece dos tipos (predefinido): integer y char

de

datos

del

estándar

Bloques El Micro C sigue las reglas usuales de ámbito. Las funciones pueden ser recursivas. Cada identificador de variable o de función se debe declarar antes de su uso. Expresiones Hay cuatro operadores de aritmética binaria: +, -, *,/. + y tienen precedencia más baja que *, y/. Además, + y - pueden ser utilizados como operadores unarios. Con argumentos de tipo entero, cada operación devuelve resultado entero. Hay seis operadores relacionales binarios: =, >. Los tipos se manejan como arriba. Los operadores de igualdad (= = y! =) tienen precedencia más baja que los otros operadores relacionales. Las expresiones de asignación se hacen por medio del operador de asignación (=) que es de una precedencia más baja que los operadores relacionales. Sentencias o instrucciones El Micro C tiene cinco diferentes sentencias: expresión, retorno, while, if, y bloque. La semántica de cada sentencia es igual que en C. todos los parámetros son pasados a las funciones por valor.

Compiladores. Guía 13 5

Biblioteca de runtime para I/O El Micro C proporciona versiones simples de dos funciones de I/O de la biblioteca estándar de C: printf y scanf. scanf requiere un parámetro, el cual es una secuencia de formato (una constante de string) que puede ser " %d" o " %c" solamente. La función retorna el entero o char leído del stdin. printf acepta uno o dos parámetros. Esta función se utiliza para escribir el valor de una expresión (entera o char) o de una constante de string. El primer parámetro es una secuencia de formato (una constante de string) que puede contener una sola conversión “%d” o “%c” (para imprimir un % se escribe %%). El segundo parámetro (si existe) se imprime de acuerdo a lo especificado por el directivo de conversión especificado en el primer parámetro.

Procedimiento Cálculo de una expresión simple Guía 3 /* * a sample program #1 */ Guía 4 int scanf( char *fmt, ... ); int printf( char *fmt, ... ); fía main( void ) int { int i, j; i = scanf("%d"); /* lea i */ j = 9 + i * 8; /* evalue j */ printf( "Resultado es %d\n", j ); /* imprima j */ } Llamada simple a función /* * a sample program #2 */ int scanf( char *fmt, ... ); int printf( char *fmt, ... ); int count( int n ); int main( void ) { int i, sum; i = scanf( "%d", &i); /* lea i */ sum = count(i); /* llame a count */

6

Compiladores. Guía 13

printf( "%d\n", sum ); /* imprima resultados */ } int count( int n ) { int i, sum; i = 1; sum = 0; while ( i