Funciones del Analizador Sintáctico Elaborado el Martes 23 de Agosto de 2005
Funciones del Analizador Sintáctico Contenidos Función del Analizador Sintáctico. Definición de una Gramática. Representación BNF. Árboles de derivación. Lenguaje Yacc. 15/11/2018 Funciones del Analizador Sintáctico
Fases de un Compilador Funciones del Analizador Sintáctico 15/11/2018 generador de código intermedio programa objeto programa fuente objeto administrador de la tabla de símbolos optimizador de código manejador de errores analizador semántico sintáctico léxico 15/11/2018 Funciones del Analizador Sintáctico
Interacción entre Fases programa fuente administrador de la tabla de símbolos manejador de errores analizador sintáctico léxico obtén el siguiente componente léxico componente léxico 15/11/2018 Funciones del Analizador Sintáctico
Funciones del Analizador Sintáctico Recibir los componentes léxicos y producir como salida una representación del árbol sintáctico que reconoce la entrada de acuerdo a la gramática especificada. Interactuar con la Tabla de Símbolos. Una estructura que mantiene todos los símbolos presentes en la entrada. 15/11/2018 Funciones del Analizador Sintáctico
Funciones del Analizador Sintáctico Chequear que los tipos de datos están asignados correctamente para evitar la pérdida de información o los errores semánticos. Generar un Código Intermedio, ya sea para una máquina virtual o real, que permita la ejecución o interpretación de la entrada. Informar de los errores encontrados en la entrada. 15/11/2018 Funciones del Analizador Sintáctico
Gramáticas libres de contexto Una gramática es una especificación sintáctica precisa y fácil de entender de un lenguaje de programación. A partir de algunas clases de gramáticas se puede construir automáticamente un analizador sintáctico que determine si un programa fuente está bien construido. Los cambios a la gramática son más fáciles de realizar cuando se tiene una descripción gramatical del lenguaje. 15/11/2018 Funciones del Analizador Sintáctico
Definición formal de una gramática 1. Un conjunto de componentes léxicos ∑, denominados símbolos terminales. 2. Un conjunto de símbolos no terminales denominado N. 15/11/2018 Funciones del Analizador Sintáctico
Definición formal de una gramática 3. Un conjunto de producciones, en el que cada producción consta de un no terminal, llamado lado izquierdo de la producción, una flecha y una secuencia de componentes léxicos y no terminales, o ambos, llamado lado derecho de la producción. ( P : N ( N x ∑ ) * ) 4. Un símbolo no terminal S que se considera el símbolo de inicio (o símbolo inicial). 15/11/2018 Funciones del Analizador Sintáctico
Funciones del Analizador Sintáctico Ejemplo 1 Σ = { id, núm, (, ), -, +, *, / } N = { expresión, operador } S = { expresión } 15/11/2018 Funciones del Analizador Sintáctico
Funciones del Analizador Sintáctico P = { expresión expresión operador expresión, expresión - expresión, expresión ( expresión ), expresión id, expresión num, operador +, operador -, operador *, operador / } 15/11/2018 Funciones del Analizador Sintáctico
Convenciones respecto a la notación expresión expresión operador expresión | - expresión | ( expresión ) | id | num operador + | - | * | / 15/11/2018 Funciones del Analizador Sintáctico
BNF (Backus-Naur Form) <expresión>::=<expresión><operador><expresión> | - <expresión> | ( <expresión> ) | id | num <operador>::= + | - | * | / 15/11/2018 Funciones del Analizador Sintáctico
Funciones del Analizador Sintáctico EBNF <S> ::= {a}3-4 Es equivalente a: <S> ::= a a a | a a a a 15/11/2018 Funciones del Analizador Sintáctico
Árbol de derivación (a+3)*b expresión expresión operador expresión ( expresión ) * id expresión operador expresión + id núm 15/11/2018 Funciones del Analizador Sintáctico
Funciones del Analizador Sintáctico Ejemplo 2 Σ = { id, núm, (, ), -, +, *, / } N = { expresión } S = { expresión } 15/11/2018 Funciones del Analizador Sintáctico
Funciones del Analizador Sintáctico P = { expresión expresión + expresión, expresión expresión - expresión, expresión expresión * expresión, expresión expresión / expresión, expresión - expresión, expresión ( expresión ), expresión id, expresión num } 15/11/2018 Funciones del Analizador Sintáctico
BNF(Backus-Naur Form) <expresión>::= <expresión> + <expresión> | <expresión> - <expresión> | <expresión> * <expresión> | <expresión> / <expresión> | - <expresión> | ( <expresión> ) | id | num 15/11/2018 Funciones del Analizador Sintáctico
Árbol de derivación (a+3)*b expresión expresión expresión * ( expresión ) id expresión expresión + id núm 15/11/2018 Funciones del Analizador Sintáctico
Funciones del Analizador Sintáctico Lenguaje Yacc La herramienta de software que se utiliza para construir un analizador sintáctico en lenguaje C es llamada compilador YACC (yacc en un ambiente linux). Esta herramienta fue utilizada en la especificación de analizadores sintácticos para varios lenguajes en los ambientes operativos de Unix. La especificación del archivo fuente para el compilador YACC se denomina lenguaje YACC. 15/11/2018 Funciones del Analizador Sintáctico
Compilación yy.tab.c a.out compilador de YACC de C Programa fuente en YACC parser.yac Archivo de entrada Salida especificada 15/11/2018 Funciones del Analizador Sintáctico
Especificación en YACC Declaraciones %% Reglas sintácticas Procedimientos auxiliares 15/11/2018 Funciones del Analizador Sintáctico
Especificación mínima %% Reglas sintácticas 15/11/2018 Funciones del Analizador Sintáctico
Sección Declaraciones [ %{ /* Declaraciones y funciones en C */ %} ] /*Definiciones de YACC que comienzan con %*/ 15/11/2018 Funciones del Analizador Sintáctico
Sección Reglas sintácticas %% /* Reglas representando la forma BNF */ [ ] 15/11/2018 Funciones del Analizador Sintáctico
Funciones del Analizador Sintáctico Ejemplo de Reglas %% expresión : expresión ‘+’ expresión | expresión ‘-’ expresión | expresión ‘*’ expresión | expresión ‘/’ expresión | ‘-’ expresión | ‘(‘ expresión ‘)’ | ID | NUM ; 15/11/2018 Funciones del Analizador Sintáctico
Sección Procedimientos auxiliares %% /* Declaraciones y funciones en C */ 15/11/2018 Funciones del Analizador Sintáctico
Ejemplo de Procedimientos %% #include”lex.yy.c” extern FILE* yyin; main(int argc, char** argv) { yyin = fopen(argv[1],”r”); return ( yyparse ( ) ); } 15/11/2018 Funciones del Analizador Sintáctico
Funciones del Analizador Sintáctico Compilación con -ly main() { return ( yyparse ( ) ); } yyerror (char *s) fprintf( stderr, “%s\n”, s); 15/11/2018 Funciones del Analizador Sintáctico
Funciones del Analizador Sintáctico Definiciones de YACC %token ‘+’ %token ‘-’ %token ‘*’ %token ‘/’ %token ‘(’ %token ‘)’ %token ID %token NUM 15/11/2018 Funciones del Analizador Sintáctico
Funciones del Analizador Sintáctico Definiciones de YACC %left ‘+’ ‘-’ %left ‘*’ ‘/’ %rigth MINUS %start expresión %% 15/11/2018 Funciones del Analizador Sintáctico
Funciones del Analizador Sintáctico Uso de %prec %% expresión : expresión ‘+’ expresión | expresión ‘-’ expresión | expresión ‘*’ expresión | expresión ‘/’ expresión | ‘-’ expresión %prec MINUS | ‘(‘ expresión ‘)’ | ID | NUM ; 15/11/2018 Funciones del Analizador Sintáctico
Conflictos de una gramática El conflicto shift/reduce se soluciona seleccionando shift por parte del parser. El conflicto reduce/reduce no se puede solucionar y deben reescribirse las reglas gramáticales que producen el conflicto. 15/11/2018 Funciones del Analizador Sintáctico