Bison Flex 编译器返回 "y.tab.h" 文件未找到错误
Bison Flex compiler returning "y.tab.h" file not found error
我正在尝试使用 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
的 bison 文件
然后 flex 文件使用 flex -o AnalizadorSintacticoLex.c SintLex.l
我通过这两个步骤获得文件 AnalizadorSintactico.c、AnalizadorSintactico.h 和 AnalizadorSintacticoLex.c
当我执行命令时
gcc AnalizadorSintactico.c AnalizadorSintacticoLex.c -lfl -o compilador
它 returns 以下错误 SintLex.l:3:11: fatal error: 'y.tab.h' file not found
#include "y.tab.h"
最后一步有误吗?我错过了什么吗?
我在最后一步尝试了不同的 sintaxis,但我总是遇到那个错误。我也尝试按照此处提出的类似问题的建议进行操作,但没有结果。
您在词法分析器中包含了 y.tab.h
,但 Bison 生成了 AnalizadorSintactico.h
。你对编译器的抱怨感到惊讶吗?
使用 #include "AnalizadorSintactico.h"
而不是 #include "y.tab.h"
。
默认情况下,bison 在编译 basename.y 时将其输出写入 basename.tab.h 和 basename.tab.c。您可以使用 -o
选项将其更改为您想要的任何其他内容(正如您所做的那样)。或者您可以使用 -y
标志来模拟 yacc 并写入 y.tab.c 和 y.tab.h
我正在尝试使用 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
的 bison 文件
然后 flex 文件使用 flex -o AnalizadorSintacticoLex.c SintLex.l
我通过这两个步骤获得文件 AnalizadorSintactico.c、AnalizadorSintactico.h 和 AnalizadorSintacticoLex.c
当我执行命令时
gcc AnalizadorSintactico.c AnalizadorSintacticoLex.c -lfl -o compilador
它 returns 以下错误 SintLex.l:3:11: fatal error: 'y.tab.h' file not found
#include "y.tab.h"
最后一步有误吗?我错过了什么吗?
我在最后一步尝试了不同的 sintaxis,但我总是遇到那个错误。我也尝试按照此处提出的类似问题的建议进行操作,但没有结果。
您在词法分析器中包含了 y.tab.h
,但 Bison 生成了 AnalizadorSintactico.h
。你对编译器的抱怨感到惊讶吗?
使用 #include "AnalizadorSintactico.h"
而不是 #include "y.tab.h"
。
默认情况下,bison 在编译 basename.y 时将其输出写入 basename.tab.h 和 basename.tab.c。您可以使用 -o
选项将其更改为您想要的任何其他内容(正如您所做的那样)。或者您可以使用 -y
标志来模拟 yacc 并写入 y.tab.c 和 y.tab.h