lex/yacc嵌入VC的编译问题
近来在做一个Windows下VC项目时,需实现一个类似SQL语法正确性检查的程序。
听人介绍,用了lex/yacc工具。用他们生成c语言时不会出错,但一旦嵌入VC中就编译不通过。我的操作过程是这样的:
1. 下载了Parser Generater 2.75版本,安装并联合VC编译它的lib库,都通过了
2. 配置VC环境,将PG的include,lib,source目录路径设置在tools-> options-> directories中
3. 建了一个空的Windows console application,添加PG生成的.h和.c文件
4. 在VC的project settings-> c/c++-> general中加入YYDEBUG
到此为止,VC编译,出现如下错误:
ch1-05.obj : error LNK2001: unresolved external symbol _yytop
ch1-05.obj : error LNK2001: unresolved external symbol _yyin
ch1-05.obj : error LNK2001: unresolved external symbol _yyparse
我的c程序中是这样写的
...
%%
// programs section
extern FILE* yyin;
main(void)
{
do {
yyparse();
} while(!feof(yyin));
}
后来我按照网上说的,加了如下一步
5. 在VC的project settings-> link-> general中加入yld.lib,yld.lib是在PG的lib库中
再编译,出现了30个连接错误:
yld.lib(yyaslex.obj) : error LNK2001: unresolved external symbol _yylexeraction
yld.lib(yyaslex.obj) : error LNK2001: unresolved external symbol _yybackup
yld.lib(yyaslex.obj) : error LNK2001: unresolved external symbol _yymatch
......
请高手帮忙看看,很紧急的!!!
[解决办法]
在安装了Parser Generator后,执行以下步骤,即可使VC++编译和连接由Parser Generator产生的文件。
1.目录设置
在VC++中执行以下步骤,每个步骤只执行一次。
(1) 选择Tools菜单中的Options命令,在屏幕上即会出现Options对话框。
(2) 选择Directories选项卡。
(3) 在Show Directories for下拉列表框中选择Include Files。
(4) 在Directories框中,点击最后的空目录,并填入Parser Generator的include子目录的路径。
(5) 在Show Directories for下拉列表框中选择Library Files。
(6) 在Directories框中,点击最后的空目录,并填入Parser Generator的lib\msdev子目录的路径。
(7) 在Show Directories for下拉列表框中选择Source Files。
(8) 在Directories框中,点击最后的空目录,并填入Parser Generator的Source子目录的路径。
(9) 点击OK按钮,Options对话框将接受设置并关闭。
VC++在就可以找到包含文件yacc.h和lex.h以及YACC和Lex的库文件。
2.项目设置
对于每个VC++项目,都需在VC++中执行以下步骤:
(1) 选择Project菜单中的Settings命令,在屏幕上即会出现Project Settings对话框。
(2) 在Settings for下拉列表框中选择Win32 Debug。
(3) 选择C/C++标签。
(4) 在Category下拉列表框中选择General。
(5) 在Preprocessor Definitions框中,在当前文本的最后,输入YYDEBUG。
(6) 选择Link标签。
(7) 在Category下拉列表框中选择General。
(8) 在Object/Library Modules框中,在当前文本的后面,输入yld.lib ylmtd.lib 。
(9) 在Settings for下拉列表框中选择Win32 Release。
(10) 重复第8步的工作。
(11) 点击OK按钮,Project Settings对话框将接受设置并关闭。
VC++现在可以从特定的库中接受YACC和Lex所需的函数和变量。
3.应用
(1)在Parser Generator下的编辑窗口输入YACC源程序(扩展名必须为.y)。
(2)用Parser Generator下的Project菜单的Compile file命令编译源程序,生成相应的C语言源程序(.cpp)。
(3)用VC++编译,连接C语言源程序,生成可执行程序(.exe)后即可执行。
[http://blog.csdn.net/maray/archive/2007/04/03/1550696.aspx]
[解决办法]
呃,还是用GnuWin32里的bison和flex吧,比Parser Generator好用多了。
在sourforge下载。
[解决办法]
直接下 flex , bison 源代码编译个版本吧, 那些做发行版的总是比较懒, 版本总是比较低...
不过好像它们版本都很稳定了, 没什么大的改动... flex 的新版本倒是可以生成可重入的 C 版本了 这个改动倒不错 ....