2011-05-11 47 views
1

难怪我无法从我的flex文件链接到它。 我检查了这一点,并取出声明“YYSTYPE yylval;”从yyparse开始,它按预期工作。当然,这不是使用野牛和flex的正确方法吗?有人能让我看到另一种方式吗? 谢谢。野牛语法:yylval嵌入yyparse

+0

你最好使用C++接口。 – 2011-05-11 16:59:51

+0

嗨亚历山大。指定bison自带的C++框架? – jmgunn87 2011-05-11 17:05:16

+0

是的。它具有不暴露全局变量的巨大优势,如果您有多个解析器(或者您只是不喜欢全局变量),这非常方便。 – 2011-05-11 17:56:40

回答

1

在bison输出的y.tab.c文件中声明和定义yylval是正常的。它也在y.tab.h文件中声明(如extern),所以如果将它包含在词法分析器中,则可以将yylval作为全局变量来访问。这是flex/bison正常工作的方式,应该不需要编辑文件来取出东西 - 它应该“正常工作”

这种全局变量的使用会导致问题,如果您想要程序中有多个解析器,或者想要在不同线程中使用多个解析器(或以其他方式同时使用)。 Bison提供了一种避免这种情况的方法,%define api.pure将yylval作为一个全局变量来解析 - 相反,解析器会用YYSTYPE(一个指针)的地址调用yylex,而词法分析器应该将该标记值放在那里而不是放在yylval中。如果您使用的是flex,您需要在flex文件的顶部放置#define YY_DECL int yylex(YYSTYPE *val)以更改它用于yylex的声明。

+0

是的。只是想出了。在bison文件中启用了%纯解析器。它是我编辑/使用的php语法。野牛的选择非常多,令人印象深刻。无论如何,感谢您的帮助,我确信有人会在将来遇到这种情况,并会帮助他们。 – jmgunn87 2011-05-11 17:48:37

0

我检查了这个并取出了 声明“YYSTYPE yylval;”

我不知道是否有什么问题你的“取出来”,但你可以尝试

bison -d your-yacc-file.y

然后野牛会为你生成一个头文件与所有这些声明。

+0

嗨神经。我已经解决了这个问题。当它生成纯粹的/可重入的解析器时,Bison不会全球化yylval和其他人。我把这个从我的.y文件中取出,一切正常。 – jmgunn87 2011-05-12 07:37:00

1

而不是使用

#define YY_DECL int yylex(YYSTYPE *val) 

的你也可以用

%option bison-bridge 

但是,如果你想用C++柔性+野牛解析器,那么这种方法是行不通的。

对于C++解析器,请检查this example