Páginas

Mostrando entradas con la etiqueta Analizador Léxico. Mostrar todas las entradas
Mostrando entradas con la etiqueta Analizador Léxico. Mostrar todas las entradas

sábado, 16 de julio de 2011

YACC - Yet another Compiler-Compiler

¿Qué es YACC?
Es una herramienta que genera automáticamente un parser ( nalizador sintáctico/semántico ) para una gramática dada en especificación YACC (fichero .y).
YACC es un programa diseñado para compilar una gramática LALR(1) (ver analizadores LARL) y producir el código fuente del analizador sintáctico del lenguaje producido por esta gramática.
¿Cómo trabaja YACC?

Formato del fichero YACC
%{
Declaraciones en C
%}
Declaraciones YACC
%%
Reglas de Gramática
%%
Código C adicional

Comentarios entre /*  y  */ pueden aparecer en cualquiera de las secciones

%{ 
< Variables globales C, prototipos, comentarios >  Esta parte será enmbebida en el fichero *.c
%}
[SECCIÓN DE DEFINICIONES YACC]    Contiene declaraciones de tokens. Los tokens serán reconocidos por el analizador léxico.
%%
[SECCIÓN DE REGLAS DE PRODUCCIÓN] Definición de cómo se estructura el lenguaje de entrada, y qué acciones realizar para cada sentencia.
%%
<Subrutinas auxiliares C> Código de usuario. Por ejemplo, main con llamada al analizador yyparse().


Sección de definiciones

%{
#include <stdio.h>
#include <stdlib.h>
%}
%token ID NUM  Símbolos terminales (tokens) 
%start expr   Símbolo inicial de la gramática


Sección de reglas


%%
producción1: simbolo1 simbolo2...{accion}
                  | simbolo 3 simbolo4...{accion}
                  | ...
produccion2: simbolo1 simbolo2...{accion}


Ejemplo:
expr: expr '+' term | term;
term: term '*' factor | factor;
factor: '('expr')' | ID | NUM;


Sección de reglas


Los símbolos terminales van encerrados entre ''.
Las cadenas sin comillas de letras y dígitos no declaradas como componentes léxicos se los considera no terminales.
Una acción semántica es una secuencia de proposiciones en C.
Los símbolos $$ se refiere al valor del atributo asociado con el no terminal del lado izquierdo.
$i se refiere al valor asociado con el i-ésimo símbolo gramatical (terminal o no terminal) del lado derecho. La acción semántica se realiza siempre que se reduzca por la producción asociada. Generalmente, la acción semántica calcula un valor para $$ en función de $i.
Si se omite la acción semántica entonces por defecto $$ = $1


Valores semánticos


%%
statement: expression { printf("=%g\n",$1);}
expression : expression '+' expression { $$ = $1 + $3; }
                  | expression '-' expresion { $$ = $1 - $3; }
                  | NUMBER { $$ = $1; }


%%


Según estas dos producciones, 5 + 4 - 3 +2 se transforma en: 

FLEX: Analizador Léxico Rápido

En la cátedra de Sintaxis y Semántica de los Lenguajes tenemos que hacer un proyecto en el cual, debemos usar el analizador léxico FLEX.


FLEX es un lenguaje de Open Source para el desarrollo de scanner, en el que puedes basarte para crear tus propios analizadores léxicos, dependiendo de tus necesidades, por ejemplo, si tienes un código en cualquier lenguaje, solo delimitas cada uno de los keywords, palabras reservadas, símbolos de operación, etc.
Máquina de Turing.
Un personaje, el cual hizo aportes
grandes con su máquina.




Una vez que tienes tu código en  C o C++, con las restricciones y la estructura de flex, corres tu código con flex y automáticamente te creará un archivo llamado lex.yy.c. Este archivo nuevo tiene mas de 1000 líneas que agrega flex, y que tu código con restricciones no tiene mas de 50 líneas. Al revisar este archivo te das cuenta de que posiblemente es mucho código sin utilizar.


Bueno, después con lex.yy.c, lo compilas con gcc y al ejecutarlo, podrás señalar un archivo con código o tomar la entrada estándar. Una vez funcionando correctamente y sin errores, te señalará palabra por palabra dependiendo de tus restricciones escritas con anterioridad.


Para descargar el instalador desde la web.
Para consultar el manual.