野牛重新定位被截断以适应:R_X86_64_PC32与未定义的符号“fprint”
flex1.l文件: 我编译了.l文件: 我跑:野牛重新定位被截断以适应:R_X86_64_PC32与未定义的符号“fprint”,c,bison,C,Bison,flex1.l文件: 我编译了.l文件: 我跑: gcc bison1.tab.c lex.yy.c -lfl 我得到以下信息: /tmp/ccPPnaPa.o:bison1.tab.c:.text+0x93f:对的未定义引用 'fprint'/tmp/ccPPnaPa.o:bison1.tab.c:.text+0x93f:重新定位 根据未定义的符号“fprint”截断以适合:R_X86_64_PC32 集合2: 错误:ld返回了1个退出状态 在fprintstderr处,%s\n,msg;:
gcc bison1.tab.c lex.yy.c -lfl
我得到以下信息:
/tmp/ccPPnaPa.o:bison1.tab.c:.text+0x93f:对的未定义引用
'fprint'/tmp/ccPPnaPa.o:bison1.tab.c:.text+0x93f:重新定位
根据未定义的符号“fprint”截断以适合:R_X86_64_PC32
集合2:
错误:ld返回了1个退出状态
在fprintstderr处,%s\n,msg;:fprintf而不是fprintf将flag-Wall添加到gcc命令中。@rici谢谢!成功了!!
%{
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include "bison1.tab.h"
void yyerror(char const *);
extern FILE *yyin;
extern FILE *input;
extern FILE *output;
extern int yylval;
extern int yyparse(void);
extern int n;
int errNum = 0;
int forNum = 0;
%}
%left '+' '-'
%left '*' '/' '%'
%nonassoc ISOTITA DIAFORA LESSTHAN GREATERTHAN LESSISO GREATERISO
%token SEMICOLON ASSIGN THAUMASTIKO AND1 KOMMA
%token PLUS MINUS
%token PARENTHESI1 PARENTHESI2 AGGILI1 AGGILI2
%token POLLAPL DIAIRESI MOD
%token ISOTITA DIAFORA LESSTHAN GREATERTHAN LESSISO GREATERISO
%token AND2 OR
%token TRUE FALSE
%token INTEGER BOOLEAN STRING VOID EXTERN
%token BEGIN1 END1 IF1 ELSE1 WHILE1 FOR1 RETURN1
%token ID1 DIGIT STRING1
%token NEWLINE
%start program
%%
program : externaldecl kefalidaprog tmimaorismon tmimaentolon
;
externaldecl : externaldecl externalprototype
|
;
externalprototype : EXTERN prototypefun
;
kefalidaprog : VOID ID1 PARENTHESI1 PARENTHESI2
;
tmimaorismon : tmimaorismon orismos
|
;
orismos : orismosvar
| orismosfun
| prototypefun
;
orismosvar : typedata listvar SEMICOLON
;
typedata : INTEGER
| BOOLEAN
| STRING
;
listvar : extralist ID1
|
;
extralist : KOMMA listvar
|
;
orismosfun : kefalidafun tmimaorismon tmimaentolon
;
prototypefun : kefalidafun SEMICOLON
;
kefalidafun : typefun ID1 PARENTHESI1 listtyppar PARENTHESI2
| typefun ID1 PARENTHESI1 PARENTHESI2
;
typefun : INTEGER
| BOOLEAN
| STRING
;
listtyppar : otherlistpar typpar
|
;
otherlistpar : listtyppar KOMMA
|
;
typpar : typedata AND1 ID1
| typedata ID1
;
tmimaentolon : BEGIN1 entoles END1
;
entoles : entoles entoli
|
;
entoli : simpleentoli SEMICOLON
| domimenientoli
| sinthetientoli
;
sinthetientoli : AGGILI1 entoles AGGILI2
;
domimenientoli : entoliif
| entoliwhile
| entolifor
;
simpleentoli : anathesi
| klisifun
| entolireturn
| entolinull
;
entoliif : IF1 PARENTHESI1 genikiekfrasi PARENTHESI2 entoli elseclause
| IF1 PARENTHESI1 genikiekfrasi PARENTHESI2 entoli
;
elseclause : ELSE1 entoli
;
entoliwhile : WHILE1 PARENTHESI1 genikiekfrasi PARENTHESI2 sinthetientoli
;
entolifor : FOR1 PARENTHESI1 conditions PARENTHESI2 sinthetientoli
;
conditions : condition SEMICOLON condition SEMICOLON condition SEMICOLON
;
condition : genikiekfrasi
|
;
anathesi : ID1 ASSIGN genikiekfrasi
;
klisifun : ID1 PARENTHESI1 listrealpar PARENTHESI2
| ID1 PARENTHESI2 PARENTHESI2
;
listrealpar : realpar otherlistreal
;
otherlistreal : KOMMA realpar otherlistreal
|
;
realpar : genikiekfrasi
;
entolireturn : RETURN1 genikiekfrasi
;
entolinull :
;
genikiekfrasi : genikaterms genikosoros
;
genikaterms : genikiekfrasi OR
|
;
genikosoros : genikosparags genikosparag
;
genikosparags : genikosoros AND2
|
;
genikosparag : THAUMASTIKO genikosprotparag
| genikosprotparag
;
genikosprotparag : simpleekfrasi tmimasigrisis
| simpleekfrasi
;
tmimasigrisis : sigritikostelestis simpleekfrasi
;
sigritikostelestis : ISOTITA
| DIAFORA
| LESSTHAN
| GREATERTHAN
| LESSISO
| GREATERISO
;
simpleekfrasi : simpleoros ekfrasi
;
ekfrasi : PLUS simpleekfrasi
| MINUS simpleekfrasi
|
;
simpleoros : muloroi simpleparag
;
muloroi : simpleoros POLLAPL
| simpleoros DIAIRESI
| simpleoros MOD
|
;
simpleparag : PLUS simpleprotoros
| MINUS simpleprotoros
| simpleprotoros
;
simpleprotoros : ID1
| stathera
| klisifun
| PARENTHESI1 genikiekfrasi PARENTHESI2
;
stathera : DIGIT
| STRING1
| TRUE
| FALSE
;
%%
void yyerror(char const *msg)
{
fprint(stderr, "%s\n", msg);
}
int main(int argc, char **argv)
{
FILE *input;
FILE *output;
++argv;
--argc;
if(argc>0)
{input = fopen(argv[0], "r");}
else
{output = fopen("output.exe","w");}
int a = yyparse();
if(a==0)
{printf("Done parsing\n");}
else
{printf("Yparxei lathos sti grammi: %d\n", n);}
printf("Estimated number of errors: %d\n", errNum);
return 0;
}
bison -d bison1.y
flex flex1.l
gcc bison1.tab.c lex.yy.c -lfl