syntaxique.tab.c:对yylex的未定义引用

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

我正在尝试运行示例,但是每次运行gcc命令时都会显示此错误。这是我运行的命令:

flex lexical.l
bison -d syntaxique.y
 gcc -o lex.yy.c syntaxique.tab.c

->此时,我收到此错误消息:

syntaxique.tab.c :(。text + 0x1ee):对'yylex'的未定义引用

这是我的代码:

lexical.l:

%{
    #include"stdio.h"
int nbr_ligne;
#include "syntaxique.tab.h"

extern YYSTYPE yylval;

%}
chiffre [0-9]
cst [1-9][0-9]*|0
vide [ \t]+
saut_ligne [\n]
idf [A-Z]([_]?[a-z0-9])*
int ([1-9][0-9]*|0)
float ([1-9][0-9]*|0)","([0-9]*[1-9])
bool       "FALSE"|"TRUE" 
varint        "INT"|"int"
varfloat      "FLOAT"|"float"
varbool       "BOOL"|"bool"
 const_int "const int"|"CONST INT"
const_float "const float"|"CONST FLOAT"
op "*"|"+"|"-"|"/"|"%"
rat "<"|"<="|"<>"|"=="|">"|">="|"!="
incr "++"
decr "--"
arc "("
farc ")"
aff "=" 
vg ","
pvg ";"
debut "{"
fin "}"
 if "if"|"IF"|"If"
for "for"|"FOR"
begin "begin"|"BEGIN"
end "end"|"END"
comment       "//" (.|\n)* "//"


%%
{idf}         {printf(" idf");if (yyleng <= 12 ){yylval.str=strdup(yytext);return(mc_idf);} }
{const_float} {printf(" const_float");return const_float;}
{const_int}   {printf(" const_int");return const_int;}
{vide}
{begin}     {return(mc_begin);}
{end}           {return(mc_end);}
{varint}        { yylval.type=strdup(yytext);return(mc_varint);}
{varfloat}      { yylval.type=strdup(yytext); return(mc_float);}
{varbool}       {yylval.type=strdup(yytext);return(mc_varbool);}
{int}           {yylval.entier=atoi(yytext);return(mc_int);}
{float}         {yylval.entier=atof(yytext);return(mc_float);}
{bool}          {yylval.type=strdup(yytext);return(mc_bool);}       
{if}              {return(mc_if);}
{for}             {return(mc_for);}
{rat} {return mc_rat;}
{op} {return mc_op;}

 {pvg} {printf(" pvg");return pvg;}
 {vg} {printf(" vg");return vg;}
{arc} {printf(" arc");return arc;}
{farc} {printf(" farc");return farc;}
 {debut} {printf(" debut");return debut;}
{fin} {printf(" fin");return fin;}
{incr} {printf(" incr");return incr;}
{decr} {printf(" decr");return decr;}
 {aff} {printf(" aff");return aff;}



 [\n] {nbr_ligne++;} 

.+ {printf("erreur");}


%%
int yywrap(){
return 1;}

int main(){
yylex();
return 0;
}

这里是syntaxique.y:

    %{
    #include "stdio.h"

#include "string.h"


int yyerror(char *s);

int yylex();

int yyerror(char *s);

int nb_ligne = 1;

float test;

char suavType [20];

char value [100] ;


%}

 %union{ 

int entier; 

float reel; 

char* str; 

char oper; 

char* type;

char* idf;

char symbol;

char* bool;}

// LISTE of terminal

%token  var <entier>mc_int <reel>mc_float<oper>mc_div

<bool>mc_bool <type>mc_varbool <idf>mc_idf <const>mc_const <type>mc_varint <type>mc_varfloat 
mc_begin

mc_for mc_if mc_end mc_rat <oper>mc_op <symbol>pvg <symbol>vg <symbol>aff debut fin arc farc incr 
decr

const_int const_float



%start S


%%


S:Declaration mc_begin LIST_INST mc_end {printf("programme correcte syntaxiquement ");YYACCEPT;}

;

TYPEVAR: mc_varfloat {strcpy(suavType,$1)} | mc_varint {strcpy(suavType,$1)} | mc_varbool 

{strcpy(suavType,$1)}

;

 // LE CAS D'UNE DÉCLARATION DE PLUSIEURS VARIABLES: int a,b...

VG: vg Idf VG |

;

// LE CAS D'UNE DÉCLARATION DE PLUSIEURS CONSTANTE: const int a=6,b=6...

VGCONST : vg Idf aff CONST VG|

;

Idf: mc_idf

;

 IDFConst: const_int  mc_idf | const_float mc_idf

;

Declaration:

      Declaration TYPEVAR Idf VG pvg |

     Declaration IDFConst aff CONST VGCONST pvg  |

 ;

// LISTE DES CONSTANTES

CONST: mc_float{ test=$1; strcpy(value,"FLOAT");}|mc_int{ 

test=$1;strcpy(value,"INT");}|mc_bool{strcpy(value,"BOOL");}|mc_idf|

;

// OPÉRATION ARITHMÉTIQUE

EXPARITH:CONST mc_op EXPARITH | CONST |arc EXPARITH farc|

CONST mc_op mc_idf EXPARITH | mc_idf mc_op CONST EXPARITH

AFFECOND:mc_idf aff EXPARITH 

;

LIST_INST:  AFFECOND LIST_INST | InstIF LIST_INST | InstFOR LIST_INST |

; 

InstIF: mc_if arc CONDITION farc debut LIST_INST fin 

;

InstFOR: mc_for arc AFFECOND vg CONDITION vg Compteur farc debut LIST_INST fin 

;

CONDITION:CONST mc_rat CONST | mc_bool | EXPARITH mc_rat EXPARITH

;

Compteur: mc_idf incr| mc_idf decr


;

%%

int yyerror(char *msg) {

printf("ERREUR syntaxique a la ligne %d" ,nb_ligne);

return 0;

}







int main () { 

yyparse();

return 0; } 

请帮助我进行编译

bison yacc
1个回答
0
投票

您正在告诉gcc编译并链接语法ique.tab.c,并将生成的可执行文件另存为lex.yy.c。您不是在编译或链接lex.yy.c的内容。

您应该删除-o或提供可执行文件的实际名称。

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