【发布时间】:2012-02-17 01:46:13
【问题描述】:
我的问题基本上是“什么是 YACC / Bison 的好风格?”以及相关的,我是否让 Bison 做它擅长的事情。
例如,我发现我的 Bison 程序比我的原始代码更依赖全局变量。考虑以下几点:
prog :
vents{ /*handle semantics...*/ }
unity{ /*handle semantics...*/ }
defs;
如果我想在“vents”和“unity”之后的两个大括号分隔的块之间传递信息,我认为使用全局变量(从技术上讲,具有文件级范围和内部链接的变量)是最好的从信息隐藏的角度来看,我可以做到。我在这些块中声明的任何变量都是其块的本地变量(我认为......),我可以放置 C++ 声明的其他指定位置导致文件级范围。
如果我可以将变量声明注入“yyparse()”函数,这将更适合我的需要。是否有这种代码的钩子,或者注入这种变量的其他方式?还是全局变量只是使用 Bison 的公认部分?
我还想到,也许我什至不应该以这种方式在这些部分之间传递信息。但是对我来说,仅使用 $$、$1、$2 等来传递所有内容似乎很困难。我只是没有“明白”吗?
我发现我的一个全局变量特别值得怀疑,即使我接受了其余的变量。它是 std::stack 类型,与输入语言对条件的支持有关。
当我在编译器输入中遇到条件(“if/else”)时,这会导致最终发出三个汇编语言标签,由一个文本字符串和一个从序列中提取的数字组成。
所以,当我第一次遇到“if”时,我正在获取一个序列号,将它推入堆栈(因为“if”结构可以嵌套),然后再使用它(通过“peeks”或“pops” ) 来构造必要的标签和跳转,例如在我的条件、我的“if”块和我的“else”块之后。
我尝试改用 $-2 之类的东西来完成这项工作,但发现这个标识符与我的条件的开头无关,而是与刚刚编译的任何块的结尾有关。 $ 抽象的系统似乎与从左到右读取的代码有关,没有任何关于其中的结构如何嵌套的概念。
我不希望你们所有人都能为我完成这项工作......但我至少在尝试使用 $$、$1、$-1 等方面是正确的吗?很可能我只是太早放弃了,和/或我会受益于采用干净的工作表方法,即完全丢弃我的旧 ad hoc 代码。
是这样吗?或者我的 std:stack 和全局变量的组合方法好吗?
【问题讨论】:
标签: c++ unix yacc flex-lexer