Introducción a YACC

Un generador de analizadores es un programa que toma como entrada una especificación de una sintaxis y produce como salida un procedimiento para reconocer ese lenguaje. Históricamente, también se les llama compiladores-compiladores.
YACC (otro compilador-compilador más) es un generador de analizador LALR(1) (LookAhead, Left-to-right, Rightmost derivation product with 1 lookahead token). YACC fue diseñado originalmente para ser complementado por Lex.
Archivo de entrada: 
el archivo de entrada de YACC se divide en tres partes. 
 

/* definitions */
 ....

%% 
/* rules */ 
....
%% 

/* auxiliary routines */
.... 

Archivo de entrada: Parte de definición:
 

  • La parte de definición incluye información sobre los tokens utilizados en la definición de sintaxis: 
     
%token NUMBER 
%token ID 
  •  
  • Yacc asigna automáticamente números para tokens, pero puede ser anulado por 
     
%token NUMBER 621 
  •  
  • Yacc también reconoce caracteres individuales como tokens. Por lo tanto, los números de token asignados no deben superponerse a los códigos ASCII. 
     
  • La parte de definición puede incluir código C externo a la definición del analizador y declaraciones de variables, dentro de %{ y %} en la primera columna. 
     
  • También puede incluir la especificación del símbolo inicial en la gramática: 
     
%start nonterminal 
  •  

Archivo de entrada: Parte de la regla: 
 

  • La parte de las reglas contiene la definición de la gramática en un formato BNF modificado. 
     
  • Las acciones son código C en { } y se pueden incrustar dentro (esquemas de traducción). 
     

Archivo de entrada: Parte de rutinas auxiliares: 
 

  • La parte de las rutinas auxiliares es solo código C. 
     
  • Incluye definiciones de función para cada función necesaria en la parte de reglas. 
     
  • También puede contener la definición de la función main() si el analizador se va a ejecutar como un programa. 
     
  • La función main() debe llamar a la función yyparse(). 
     

Fichero de entrada:
 

  • Si yylex() no está definido en las secciones de rutinas auxiliares, entonces debería incluirse: 
     
#include "lex.yy.c"  
  •  
  • El archivo de entrada YACC generalmente termina con: 
     
 .y 
  •  

Archivos de salida: 
 

  • La salida de YACC es un archivo llamado y.tab.c 
     
  • Si contiene la definición main() , debe compilarse para que sea ejecutable. 
     
  • De lo contrario, el código puede ser una definición de función externa para la función int yyparse() 
     
  • Si se llama con la opción –d en la línea de comando, Yacc produce como salida un archivo de encabezado y.tab.h con toda su definición específica (particularmente importantes son las definiciones de tokens que se incluirán, por ejemplo, en un archivo de entrada Lex). 
     
  • Si se llama con la opción –v , Yacc produce como salida un archivo y.output que contiene una descripción textual de la tabla de análisis LALR(1) utilizada por el analizador. Esto es útil para rastrear cómo el analizador resuelve conflictos. 
     

Ejemplo:  
Archivo Yacc (.y)
 

C

%{
   #include <ctype.h>
   #include <stdio.h>
   #define YYSTYPE double /* double type for yacc stack */
%}
 
%%
 Lines :  Lines S '\n' { printf("OK \n"); }
       |  S '\n’
       |  error '\n' {yyerror("Error: reenter last line:");
                        yyerrok; };
 S     :  '(' S ')’
       |  '[' S ']’
       |   /* empty */    ;
%%
 
#include "lex.yy.c"
  
void yyerror(char * s)
/* yacc error handler */
{  
 fprintf (stderr, "%s\n", s);
}
  
int main(void)
 {
 return yyparse();
 } 

Archivo Lex (.l)
 

C

%{
%}
 
%%
[ \t]     { /* skip blanks and tabs */ }
\n|.      { return yytext[0]; }
%%

Para compilar el programa YACC: 
 

  1. Escriba el programa lex en un archivo file.l y yacc en un archivo file.y 
     
  2. Abra Terminal y navegue hasta el directorio donde ha guardado los archivos. 
     
  3. escriba archivo lex.l 
     
  4. escriba archivo yacc.y 
     
  5. escriba cc lex.yy.c y.tab.h -ll 
     
  6. escribe ./a.fuera 
     

Publicación traducida automáticamente

Artículo escrito por thakur_aman y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *