难怪我无法从我的flex文件链接到它。 我检查了这一点,并取出声明“YYSTYPE yylval;”从yyparse开始,它按预期工作。当然,这不是使用野牛和flex的正确方法吗?有人能让我看到另一种方式吗? 谢谢。野牛语法:yylval嵌入yyparse
回答
在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的声明。
是的。只是想出了。在bison文件中启用了%纯解析器。它是我编辑/使用的php语法。野牛的选择非常多,令人印象深刻。无论如何,感谢您的帮助,我确信有人会在将来遇到这种情况,并会帮助他们。 – jmgunn87 2011-05-11 17:48:37
我检查了这个并取出了 声明“YYSTYPE yylval;”
我不知道是否有什么问题你的“取出来”,但你可以尝试
bison -d your-yacc-file.y
然后野牛会为你生成一个头文件与所有这些声明。
嗨神经。我已经解决了这个问题。当它生成纯粹的/可重入的解析器时,Bison不会全球化yylval和其他人。我把这个从我的.y文件中取出,一切正常。 – jmgunn87 2011-05-12 07:37:00
而不是使用
#define YY_DECL int yylex(YYSTYPE *val)
的你也可以用
%option bison-bridge
但是,如果你想用C++柔性+野牛解析器,那么这种方法是行不通的。
对于C++解析器,请检查this example。
- 1. 嵌入其他语言的Flex /野牛
- 2. 野牛/ yacc语法消歧
- 3. 语法错误野牛
- 4. 冲突语法YACC /野牛
- 5. 优化野牛语法
- 6. 野牛多行语法
- 7. 野牛语法警告
- 8. 在野牛中使用yylval恢复字符串
- 9. 未定义的yylval使用Flex和野牛
- 10. 如何在其他地方使用yyparse()的野牛?
- 11. 如何在野牛中取消定义yyparse()?
- 12. 与存在的问题和的yylval切换yylloc从野牛2.7升级到3.0后,野牛3.0
- 13. 野牛语法%类型和%令牌
- 14. 语法中无用的野牛
- 15. 收集参数的野牛语法
- 16. 野牛语法,访问返回变量
- 17. 在野牛语法否则叼着
- 18. 如何为WDI编写野牛语法?
- 19. 的Flex /野牛语法错误
- 20. 野牛语法中的歧义
- 21. 轮班减少野牛语法冲突?
- 22. 帮助这个语法,XMl在野牛
- 23. 野牛的if/else语法规则
- 24. 来自野牛的ANTLR语法
- 25. 野牛自定义语法错误
- 26. 野牛语法错误易文件
- 27. 转换减少野牛语法冲突
- 28. 野牛/ Flex如果语句
- 29. 把野牛语法分割成更小的语法文件
- 30. 如何在野牛中显示语法的抽象语法树?
你最好使用C++接口。 – 2011-05-11 16:59:51
嗨亚历山大。指定bison自带的C++框架? – jmgunn87 2011-05-11 17:05:16
是的。它具有不暴露全局变量的巨大优势,如果您有多个解析器(或者您只是不喜欢全局变量),这非常方便。 – 2011-05-11 17:56:40