Visual Studio 中的 Yacc 和 Bison

5

我将把原先为Unix编写的C项目移植到Windows。目前为止,我已经成功编译,但无法构建。出现的问题是,一些在头文件中声明的函数在yacc文件中定义。因此,我遇到了以下错误:

 error LNK2001: unresolved external symbol function_name

我正在将 .y 和 .l 文件添加到项目的源目录中。我认为我无法将 yacc 文件移植到 Windows 版本,或者我做了一些愚蠢的事情。我在网上搜索了它,但找不到合适的教程。你能告诉我怎么做吗?

  1. 我该如何将 .y 或 .l 文件添加到项目中。
  2. 我该如何使这些文件兼容 Windows 系统?
  3. 我该如何将它们与其他目标文件链接起来?

编辑

我尝试使用 flex.exe 将 .l 文件更改为 .yy.c 文件。以下是命令:

     c:\> flex.exe name.l

假设flex.exe和name.l都在C;>中。我将所有这些文件.l .y(之前在Unix系统中用于解析) .yy.c(对应的Windows Yacc文件)加载到先前存在的项目的解决方案中。一旦编译,我会得到以下结果:

 Can't read the header file  parserheaderfile.h 

这是需要在Unix系统中由bison生成的头文件。所以我认为我无法使bison兼容windows。请告诉我如何解决这个问题?

提前致谢。

1个回答

9
您需要为.y和.l文件添加自定义构建规则。要做到这一点,您需要:
  1. 为.l文件和.y文件创建一个虚拟的.c文件
  2. 将.l、.y和两个.c文件添加到项目中
  3. 右键单击.l文件并选择属性
  4. 配置 -> 所有配置
  5. 常规 -> 项类型 -> 自定义构建工具
  6. 应用
  7. 自定义构建工具 -> 常规 -> 命令行 ->flex -olexer.c lexer.l
  8. 自定义构建工具 -> 常规 -> 输出 ->lexer.c
  9. 自定义构建工具 -> 常规 -> 附加依赖项 ->parser.y parser.c
  10. 应用
  11. 在解决方案资源管理器中选择.y文件
  12. 配置 -> 所有配置
  13. 常规 -> 项类型 -> 自定义构建工具
  14. 应用
  15. 自定义构建工具 -> 常规 -> 命令行 ->bison -oparser.c parser.y
  16. 自定义构建工具 -> 常规 -> 输出 ->parser.c parser.h
此外,您需要在系统搜索路径中拥有flex.exe、bison.exe和m4.exe。另外一个缺点是VS不能正确地获取依赖关系,所以当您更改解析器或词法分析器文件时,需要手动重建项目。

这是每次使用f/lex和/或bison/yacc启动新项目时都必须设置的内容吗?还是可以设置一次,VS将永远记住设置?此外,有没有推荐使用这些库的IDE?从命令行执行f/lex和/或bison/yacc然后才能用gcc编译有时可能会很烦人。 - velocirabbit
1
@velocirabbit 这是一个项目特定的设置。因此,您需要为每个 .l 或 .y 文件进行配置。 - Rudi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接