我发现lex&&yacc上的代码在flex下编译出错

发布于 2022-09-19 14:21:34 字数 3559 浏览 14 评论 0

第二章的ch2-05.l:

  1. %{
  2. #undef input
  3. #undef unput
  4. int input(void);
  5. void unput(int ch);
  6. unsigned verbose;
  7. char *progName;
  8. %}
  9. %%
  10. -h        |
  11. "-?"        |
  12. -help        { printf("usage is: %s [-help | -h | -? ] [-verbose | -v]"
  13.          " [(-file| -f) filename]\n", progName);
  14.         }
  15. -v        |
  16. -verbose { printf("verbose mode is on\n"); verbose = 1; }
  17. %%
  18. char **targv;        /* remembers arguments */
  19. char **arglim;        /* end of arguments */
  20. main(int argc, char **argv)
  21. {
  22.         progName = *argv;
  23.         targv = argv+1;
  24.         arglim = argv+argc;
  25.         yylex();
  26. }
  27. static unsigned offset = 0;
  28. int
  29. input(void)
  30. {
  31.         char c;
  32.         if (targv >= arglim)
  33.                 return(0);        /* EOF */
  34.         /* end of argument, move to the next */
  35.         if ((c = targv[0][offset++]) != '\0')
  36.                 return(c);
  37.         targv++;
  38.         offset = 0;
  39.         return(' ');
  40. }
  41. /* simple unput only backs up, doesn't allow you to */
  42. /* put back different text */
  43. void
  44. unput(int ch)
  45. {
  46.         /* AT&T lex sometimes puts back the EOF ! */
  47.         if(ch == 0)
  48.                 return;        /* ignore, can't put back EOF */
  49.         if (offset) {        /* back up in current arg */
  50.                 offset--;
  51.                 return;
  52.         }
  53.         targv--;        /* back to previous arg */
  54.         offset = strlen(*targv);
  55. }

复制代码

$ 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

迟月 2022-09-26 14:21:34

用lex ch2-05.l
或者flex -l ch2-05.l
试下

旧人 2022-09-26 14:21:34

还是不行:

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
$

花之痕靓丽 2022-09-26 14:21:34

最前面加两句

  1. %{
  2. #define YY_NO_INPUT
  3. #define YY_NO_UNPUT
  4. #undef input
  5. #undef unput
  6. int input(void);
  7. void unput(int ch);
  8. unsigned verbose;
  9. char *progName;
  10. %}

复制代码

随心而道 2022-09-26 14:21:34

感谢,这次可以编译过去了,我找找lex的说明,回头在这里给一个解释.

半世晨晓 2022-09-26 14:21:34

版主怎么想到这种解决方案?因为
#ifndef YY_NO_INPUT
#ifdef __cplusplus
static int yyinput YY_PROTO(( void ));
#else
static int input YY_PROTO(( void ));
#endif
#endif
吗?添加之后是可以正常编译,但为什么可以这样处理?难道lex生成的c中这些代码是冗余的?

樱花坊 2022-09-26 14:21:34

呵呵,确实是因为这段代码

薯片软お妹 2022-09-26 14:21:34

这么快就回复了, 不过你没完全回答我的问题啊-_-#
btw, 你的头像是名子组成的?!

感性不性感 2022-09-26 14:21:34

呵呵,你的观察力让我佩服.
那里有一堆宏,让你可以定制,不能说冗余的

七秒鱼° 2022-09-26 14:21:34

^^过奖~
多谢指教

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文