Bison Flex编译器返回“ y.tab.h”文件未找到错误

问题描述 投票:1回答:2

我正在尝试使用Bison和Flex构建语法分析器。我有以下.y / .l文件:

SintBis.y

%{
    #include <stdio.h>
%}

%token P_RESERVADA
%token OPERADOR
%token A_LLAVE
%token C_LLAVE
%token A_PARENTESIS
%token C_PARENTESIS
%token A_CORCHETE
%token C_CORCHETE
%token FIN_SENTENCIA
%token TIPO_DATO
%token SIMBOLOS
%token P_FOR
%token P_DEFINE
%token P_RETURN
%token DIGITO
%token LETRA
%token P_INCREMENTO
%token P_DECREMENTO


%token NUMERO
%token S_COMA
%token S_MENOR
%token S_MAYOR
%token S_IGUAL
%token S_NUMERAL
%token LIBRERIAS
%start INICIO
%% 
    INICIO: INCLUDES FUNCION_PRINCIPAL;

    INCLUDES: S_NUMERAL P_RESERVADA S_MENOR LIBRERIAS S_MAYOR|S_NUMERAL P_DEFINE LETRA NUMERO;

    FUNCION_PRINCIPAL: TIPO_DATO P_RESERVADA A_PARENTESIS C_PARENTESIS A_LLAVE EXPRESIONES C_LLAVE;

    EXPRESIONES: DECLARACIONES_VARIABLES BUCLE_FOR P_RETURN NUMERO;

    DECLARACIONES_VARIABLES: VARIABLE | VARIABLE DECLARACIONES_VARIABLES;

    VARIABLE: TIPO_DATO LETRA A_CORCHETE NUMERO C_CORCHETE S_COMA LETRA A_CORCHETE LETRA C_CORCHETE FIN_SENTENCIA
            | TIPO_DATO LETRA S_COMA  LETRA S_COMA LETRA S_IGUAL NUMERO FIN_SENTENCIA;

    BUCLE_FOR: P_FOR A_PARENTESIS LETRA S_IGUAL NUMERO FIN_SENTENCIA LETRA S_MAYOR FIN_SENTENCIA LETRA P_INCREMENTO C_PARENTESIS A_LLAVE 
        LETRA S_IGUAL LETRA OPERADOR NUMERO FIN_SENTENCIA
        LETRA A_CORCHETE LETRA C_CORCHETE S_IGUAL LETRA FIN_SENTENCIA
        LETRA S_IGUAL LETRA OPERADOR LETRA FIN_SENTENCIA
        C_LLAVE;

%%
int main (int argc, char *argv[])
{
    extern FILE *yyin;
    yyin = fopen("argv[1]", "rt");
    if(yyin == NULL)
        printf("\nNo se puede leer el archivo seleccionado");

    if(yyparse()==0)
    printf("\nAnalisis concluido sin errores\n");
    fclose(yyin);
    getch();
}
yyerror(char* mensaje){
    printf("\nAnalisis suspendido");
    printf("\nMensaje: %s",mensaje);
}

SintLex.l:

%option noyywrap
%{
    #include "y.tab.h"
    #include <stdio.h>
%}
DIGITO [0-9]+
LETRA  [a-zA-Z]+
%%
"include"|"Include"|"INCLUDE"|"main"|"MAIN"|"Main"|"VOID"|"void"|"Void"|"printf"|"scanf"        {return P_RESERVADA;}
"define"|"DEFINE"                                           {return P_DEFINE;}
"return"|"Return"|"RETURN"                                      {return P_RETURN;}
"+"|"-"|"*"|"/"                                             {return OPERADOR;}
"++"                                                    {return P_INCREMENTO;}
"--"                                                    {return P_DECREMENTO;}
"{"                                                 {return A_LLAVE;}
"}"                                                 {return C_LLAVE;}
"("                                                 {return A_PARENTESIS;}
")"                                                 {return C_PARENTESIS;}
"]"                                                 {return C_CORCHETE;}
"["                                                 {return A_CORCHETE;}
";"                                                 {return FIN_SENTENCIA;}
"int"|"double"                                              {return TIPO_DATO;}
"#"                                                 {return S_NUMERAL;}
"<"                                                 {return S_MENOR;}
">"                                                 {return S_MAYOR;}
","                                                 {return S_COMA;}
"="                                                 {return S_IGUAL;}
"for"                                                   {return P_FOR;}
"stdio.h"|"STDIO.H"|"STDLIB.H"|"stdlib.h"|"STRING.H"|"string.H"                     {return LIBRERIAS;}
{DIGITO}                                                {return DIGITO;}
{LETRA}                                             {return LETRA;}

我遵循的编译过程是:首先使用bison -d -o AnalizadorSintactico.c SintBis.y将野牛文件然后使用flex -o AnalizadorSintacticoLex.c SintLex.l

flex文件

我从这两个步骤中获取文件AnalizadorSintactico.cAnalizadorSintactico.hAnalizadorSintacticoLex.c

当我执行命令时gcc AnalizadorSintactico.c AnalizadorSintacticoLex.c -lfl -o compilador它返回以下错误SintLex.l:3:11: fatal error: 'y.tab.h' file not found #include "y.tab.h"

最后一步不正确吗?我想念什么吗?

我在最后一步尝试了不同的sintaxis,但我总是会遇到该错误。我也尝试遵循此处提出的类似问题的建议,但没有结果。

c compiler-construction bison flex-lexer
2个回答
2
投票

您在词法分析器中包括了y.tab.h,但Bison生成了AnalizadorSintactico.h。您对编译器抱怨感到惊讶吗?


0
投票

默认情况下,野牛在编译basename.y时将其输出写入basename.tab.h和basename.tab.c。您可以使用-o选项将其更改为所需的其他任何内容(完成操作)。或者,您可以使用-y标志来模拟yacc并写入y.tab.c和y.tab.h

© www.soinside.com 2019 - 2024. All rights reserved.