我正在尝试运行示例,但是每次运行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; }
请帮助我进行编译
您正在告诉gcc编译并链接语法ique.tab.c,并将生成的可执行文件另存为lex.yy.c。您不是在编译或链接lex.yy.c的内容。
您应该删除-o
或提供可执行文件的实际名称。