问题标签 [bisonc++]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
bison - 如何使用 flex 和 bison 解析嵌套函数
我想解析上面这样的东西..所以我需要在这里写什么staemnent或规则:
c++ - (Bison) 动态转换在解析时失败
我正在编写一个编译器作为作业,并且我在 dynamic_cast 方面遇到了一些关键问题。我将尝试分享无法工作的关键代码片段,以及人们可能需要了解这里发生了什么的基本代码。
相关类:
以及我的 .ypp 文件中的一些规则:
注意:与其他规则没有冲突。野牛确保了这一点。
解析一些输入时的输出,例如:
输入:
输出:
我想不通。一个动态转换如何正常工作(基于额外的代码,并返回正确的指针),而另一个应该做同样的事情却失败了。
c++ - 野牛转移/减少“其他”中的冲突
考虑以下语法:
在运行野牛(带有反例)时,我得到:
这在某种程度上是野牛手册here中表示的移位/减少。但是在这个语法之后我没有“then”。该手册说,这个问题可以通过定义左右关联性和优先级来解决。在上面,我为“else”定义了右关联性,但它对这种转变减少问题没有影响。
我不想通过移位/减少计数来抑制警告,因为它太危险了,因为我的语法太大了。
我能做些什么 ?
c++ - 在 Bison 中生成循环 IR
考虑以下语法规则:
它是如下 for 循环的解析器规则(通常的 C 类 for 循环):
我必须为这个 C 生成 IR,比如 for 循环(forstmt
)。
IR forexpr
已经写好了。
关键是 lastnexpr
的 IR 应该在stmt
.
我知道中间规则动作,我认为我可以使用堆栈以某种方式解决这个问题,但我的想法并没有得出任何结论。
究竟有没有办法阻止野牛最后生成 IRnexpr
并使其在stmt
?
换句话说,如何使最后的所有动作都nexpr
在stmt
?
有没有人遇到过这样的问题?
c++ - bisonc++ 中的索引运算符优先级(bison、bison++)
我正在设计自己的玩具语言,该语言可以编译成 Brainf*ck 代码,但遇到了索引运算符的运算符优先级问题。解析器由 Bisonc++ 生成,它的语法文件使用与其表兄弟 bison 和 bison++ 大致相同的语法。
由于 BF 中寻址内存的怪癖,我必须以不同的方式处理对数组元素的操作,这就是为什么我为它们生成特定规则的原因(我故意省略了规则的主体)。相关语法(不起作用)如下:
现在,我的印象是,通过indexing
为规则分配优先级array_element
,解析器将直接匹配其左侧的最小表达式。但是,请考虑以下代码:
我无法弄清楚为什么会这样。当代码更改为10 + (arr[0])
时,解析器会执行预期的操作,我认为这证明这与运算符优先级有关。我尝试过的许多事情之一是使用未使用的符号作为索引运算符。例如:
由于某种原因,这解决了该问题。我在做一些根本错误的事情吗?我是否误解了 bison 等人中运算符优先级的工作方式?
提前致谢!
编辑
我已将我的 dev 分支推送到 github,其中包含一个包含最小工作示例的文件夹,包括 Makefile 和测试文件。要使用不同的语法规范(文件:)重建解析器grammar
,您可以运行make regenerate
,但这需要bisonc++
和flexc++
(可从 Debian 存储库获得)。要仅使用当前(有故障的)解析器构建项目,请运行make
.
https://github.com/jorenheit/brainfix/tree/better_indexing/arraybug
c++ - 我的 parser.y (FLEX/BISON) 有问题。如何申报“$4”?
我正在学习 Flex/Bison,我们目前正在研究语义,以前处理过词汇和语法错误。我已经广泛搜索并无法找到解决我的错误的方法。当我认为它会自动完成时,我无法理解为什么我需要声明“$ 4”。
当我尝试生成文件时,我收到此错误:
弹性扫描仪.l
mv lex.yy.c 扫描仪.c
野牛 -d -v parser.y
paser.y:114.71-72:错误:'case' 的 $4 没有声明的类型
114 | case WHEN INT_LITERAL ARROW statement_ {case_statements.push_back($4);};
这是我试图遵循的伪代码:
陈述:
案例:
案子:
解析器.y: