我发现lex&&yacc上的代码在flex下编译出错
第二章的ch2-05.l:
- %{
- #undef input
- #undef unput
- int input(void);
- void unput(int ch);
- unsigned verbose;
- char *progName;
- %}
- %%
- -h |
- "-?" |
- -help { printf("usage is: %s [-help | -h | -? ] [-verbose | -v]"
- " [(-file| -f) filename]\n", progName);
- }
- -v |
- -verbose { printf("verbose mode is on\n"); verbose = 1; }
- %%
- char **targv; /* remembers arguments */
- char **arglim; /* end of arguments */
- main(int argc, char **argv)
- {
- progName = *argv;
- targv = argv+1;
- arglim = argv+argc;
- yylex();
- }
- static unsigned offset = 0;
- int
- input(void)
- {
- char c;
- if (targv >= arglim)
- return(0); /* EOF */
- /* end of argument, move to the next */
- if ((c = targv[0][offset++]) != '\0')
- return(c);
- targv++;
- offset = 0;
- return(' ');
- }
- /* simple unput only backs up, doesn't allow you to */
- /* put back different text */
- void
- unput(int ch)
- {
- /* AT&T lex sometimes puts back the EOF ! */
- if(ch == 0)
- return; /* ignore, can't put back EOF */
- if (offset) { /* back up in current arg */
- offset--;
- return;
- }
- targv--; /* back to previous arg */
- offset = strlen(*targv);
- }
复制代码
$ flex ch2-05.l
Lichuang@LICHUANG /e/source/lex&&yacc
$ gcc lex.yy.c -lfl
lex.yy.c:514: warning: static declaration of 'input' follows non-static declaration
ch2-05.l:4: warning: previous declaration of 'input' was here
ch2-05.l:37: error: redefinition of 'input'
lex.yy.c:1096: error: previous definition of 'input' was here
环境是MSYS下的flex.
难道是lex和flex的有兼容问题?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
用lex ch2-05.l
或者flex -l ch2-05.l
试下
还是不行:
Lichuang@LICHUANG /e/source/lex&&yacc
$ flex -l ch2-05.l
Lichuang@LICHUANG /e/source/lex&&yacc
$ gcc lex.yy.c -lfl
lex.yy.c:559: warning: static declaration of 'input' follows non-static declaration
ch2-05.l:4: warning: previous declaration of 'input' was here
ch2-05.l:37: error: redefinition of 'input'
lex.yy.c:1128: error: previous definition of 'input' was here
Lichuang@LICHUANG /e/source/lex&&yacc
$
最前面加两句
复制代码
感谢,这次可以编译过去了,我找找lex的说明,回头在这里给一个解释.
版主怎么想到这种解决方案?因为
#ifndef YY_NO_INPUT
#ifdef __cplusplus
static int yyinput YY_PROTO(( void ));
#else
static int input YY_PROTO(( void ));
#endif
#endif
吗?添加之后是可以正常编译,但为什么可以这样处理?难道lex生成的c中这些代码是冗余的?
呵呵,确实是因为这段代码
这么快就回复了, 不过你没完全回答我的问题啊-_-#
btw, 你的头像是名子组成的?!
呵呵,你的观察力让我佩服.
那里有一堆宏,让你可以定制,不能说冗余的
^^过奖~
多谢指教