是否有工具在win7中使用yacc和lex制作c编译器?

时间:2010-11-27 06:15:27

标签: c yacc lex

找到唯一的工具是Parser Generator

Operating System:   Windows 95 / 98 / ME / NT / 2000 / XP

但似乎它不支持win7,当我尝试构建Visual C ++(32位)时,出现了这个错误:

yyaslvar.c
C:\Program Files\Parser Generator 2\Cpp\Source\yyaslvar.c(35) : error C2099: initializer is not a constant
C:\Program Files\Parser Generator 2\Cpp\Source\yyaslvar.c(36) : error C2099: initializer is not a constant
C:\Program Files\Parser Generator 2\Cpp\Source\yyaslvar.c(37) : error C2099: initializer is not a constant

FILE YYFAR *YYNEAR YYDCDECL yyin = stdin;
FILE YYFAR *YYNEAR YYDCDECL yyout = stdout;
FILE YYFAR *YYNEAR YYDCDECL yylexererr = stderr;

我正在使用Visual Studio 2010 Express。

3 个答案:

答案 0 :(得分:1)

我不知道VS2010,但我在VS2005上使用了这个Win32端口的Lex / Yacc(Flex / Bison)而没有任何问题:http://userpages.monmouth.com/~wstreett/lex-yacc/lex-yacc.html

此外,您的错误是由于VC ++实际上将stdinstdout等定义为宏,这些宏扩展为返回FILE *的函数调用。显然,这些不是编译时常量,这就是错误所说的。

答案 1 :(得分:0)

使用Windows不太容易。如果您准备支付一些钱,那么您可以使用MKS lex和Yacc工具包

答案 2 :(得分:0)

这个问题与Win7本身无关,而且与(更严格的!)ANSI C标准有关。 C编译器根本不允许您将宏(如“stdin”或“stdout”)分配给“非自动变量”:

http://msdn.microsoft.com/en-us/library/t801az8a%28VS.80%29.aspx

这是一个解决方法:

  

http://coding.derkeiler.com/Archive/C_CPP/comp.lang.c/2009-10/msg00982.html

     

stdin和stdout不一定是常量,所以你不能使用它们   初始化静态或全局变量。   而是在初始化函数中进行分配。

此外,此链接可能会让您指向正确的方向:

http://msdn.microsoft.com/en-us/library/aa730877%28VS.80%29.aspx

'希望有所帮助