flex bison windows 介绍
flex bison windows introduction
由于我是词法分析器和解析器的新手,所以我正在尝试阅读和理解其他人的代码。
这是我尝试使用的代码:https://gist.github.com/justjkk/436828
但它给我错误。我该如何解决?
E:\flex_bison_test>gcc lex.yy.c y.tab.c -o json.exe
json.l: In function 'yylex':
json.l:34:11: warning: assignment to 'YYSTYPE' {aka 'int'} from 'char *' makes integer from pointer without a cast [-Wint-conversion]
yylval=strclone(yytext);
^
json.l:38:11: warning: assignment to 'YYSTYPE' {aka 'int'} from 'char *' makes integer from pointer without a cast [-Wint-conversion]
yylval=strclone(yytext);
^
json.l: In function 'strclone':
json.l:82:15: warning: implicit declaration of function 'strlen' [-Wimplicit-function-declaration]
int len = strlen(str);
^~~~~~
json.l:82:15: warning: incompatible implicit declaration of built-in function 'strlen'
json.l:82:15: note: include '<string.h>' or provide a declaration of 'strlen'
json.l:79:1:
+#include <string.h>
%%
json.l:82:15:
int len = strlen(str);
^~~~~~
json.l:84:5: warning: implicit declaration of function 'strcpy' [-Wimplicit-function-declaration]
strcpy(clone,str);
^~~~~~
json.l:84:5: warning: incompatible implicit declaration of built-in function 'strcpy'
json.l:84:5: note: include '<string.h>' or provide a declaration of 'strcpy'
y.tab.c: In function 'yyparse':
y.tab.c:627:16: warning: implicit declaration of function 'yylex' [-Wimplicit-function-declaration]
# define YYLEX yylex ()
^~~~~
y.tab.c:1272:16: note: in expansion of macro 'YYLEX'
yychar = YYLEX;
^~~~~
y.tab.c:1540:7: warning: implicit declaration of function 'yyerror'; did you mean 'yyerrok'? [-Wimplicit-function-declaration]
yyerror (YY_("syntax error"));
^~~~~~~
yyerrok
json.y: At top level:
json.y:80:6: warning: conflicting types for 'yyerror'
void yyerror (char const *s) {
^~~~~~~
y.tab.c:1540:7: note: previous implicit declaration of 'yyerror' was here
yyerror (YY_("syntax error"));
^~~~~~~
E:\flex_bison_test>
或者这些应该保持原样。
所有命令,我已经给出了:
flex json.l
bison -dy json.y
gcc lex.yy.c y.tab.c -o json.exe
简单地说:
#include <string.h>
在 json.l
顶部的 flex 定义部分应该会为您修复它。
您指向的存储库中还有一个 Makefile
。也许你应该使用它。您似乎没有正确生成解析器文件。请参阅下面的评论。
至于剩下的警告:
warning: implicit declaration of function 'yyerror';
warning: implicit declaration of function 'yylex';
这些可以通过添加 yylex()
的声明轻松解决,并且 yyerror
应该出现在 json.y
顶部的 bison
序言部分:
%{
int yylex();
void yyerror(const char *s);
%}
至于这些:
json.l:34:11: warning: assignment to 'YYSTYPE' {aka 'int'} from 'char *' makes integer from pointer without a cast [-Wint-conversion]
yylval=strclone(yytext);
^
json.l:38:11: warning: assignment to 'YYSTYPE' {aka 'int'} from 'char *' makes integer from pointer without a cast [-Wint-conversion]
yylval=strclone(yytext);
^
它们更微妙一些。我建议看一下 here 如何使用 yylval
将字符串从 lex 的标记正确传递到解析器的操作中。现在的问题是 yylval
是一个裸 int
但它最终被分配 char
指针用于 NUMBER
和 STRING
标记。
由于我是词法分析器和解析器的新手,所以我正在尝试阅读和理解其他人的代码。
这是我尝试使用的代码:https://gist.github.com/justjkk/436828
但它给我错误。我该如何解决?
E:\flex_bison_test>gcc lex.yy.c y.tab.c -o json.exe
json.l: In function 'yylex':
json.l:34:11: warning: assignment to 'YYSTYPE' {aka 'int'} from 'char *' makes integer from pointer without a cast [-Wint-conversion]
yylval=strclone(yytext);
^
json.l:38:11: warning: assignment to 'YYSTYPE' {aka 'int'} from 'char *' makes integer from pointer without a cast [-Wint-conversion]
yylval=strclone(yytext);
^
json.l: In function 'strclone':
json.l:82:15: warning: implicit declaration of function 'strlen' [-Wimplicit-function-declaration]
int len = strlen(str);
^~~~~~
json.l:82:15: warning: incompatible implicit declaration of built-in function 'strlen'
json.l:82:15: note: include '<string.h>' or provide a declaration of 'strlen'
json.l:79:1:
+#include <string.h>
%%
json.l:82:15:
int len = strlen(str);
^~~~~~
json.l:84:5: warning: implicit declaration of function 'strcpy' [-Wimplicit-function-declaration]
strcpy(clone,str);
^~~~~~
json.l:84:5: warning: incompatible implicit declaration of built-in function 'strcpy'
json.l:84:5: note: include '<string.h>' or provide a declaration of 'strcpy'
y.tab.c: In function 'yyparse':
y.tab.c:627:16: warning: implicit declaration of function 'yylex' [-Wimplicit-function-declaration]
# define YYLEX yylex ()
^~~~~
y.tab.c:1272:16: note: in expansion of macro 'YYLEX'
yychar = YYLEX;
^~~~~
y.tab.c:1540:7: warning: implicit declaration of function 'yyerror'; did you mean 'yyerrok'? [-Wimplicit-function-declaration]
yyerror (YY_("syntax error"));
^~~~~~~
yyerrok
json.y: At top level:
json.y:80:6: warning: conflicting types for 'yyerror'
void yyerror (char const *s) {
^~~~~~~
y.tab.c:1540:7: note: previous implicit declaration of 'yyerror' was here
yyerror (YY_("syntax error"));
^~~~~~~
E:\flex_bison_test>
或者这些应该保持原样。
所有命令,我已经给出了:
flex json.l
bison -dy json.y
gcc lex.yy.c y.tab.c -o json.exe
简单地说:
#include <string.h>
在 json.l
顶部的 flex 定义部分应该会为您修复它。
您指向的存储库中还有一个 Makefile
。也许你应该使用它。您似乎没有正确生成解析器文件。请参阅下面的评论。
至于剩下的警告:
warning: implicit declaration of function 'yyerror';
warning: implicit declaration of function 'yylex';
这些可以通过添加 yylex()
的声明轻松解决,并且 yyerror
应该出现在 json.y
顶部的 bison
序言部分:
%{
int yylex();
void yyerror(const char *s);
%}
至于这些:
json.l:34:11: warning: assignment to 'YYSTYPE' {aka 'int'} from 'char *' makes integer from pointer without a cast [-Wint-conversion]
yylval=strclone(yytext);
^
json.l:38:11: warning: assignment to 'YYSTYPE' {aka 'int'} from 'char *' makes integer from pointer without a cast [-Wint-conversion]
yylval=strclone(yytext);
^
它们更微妙一些。我建议看一下 here 如何使用 yylval
将字符串从 lex 的标记正确传递到解析器的操作中。现在的问题是 yylval
是一个裸 int
但它最终被分配 char
指针用于 NUMBER
和 STRING
标记。