问题标签 [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.

0 投票
0 回答
26 浏览

bison - 如何使用 flex 和 bison 解析嵌套函数

我想解析上面这样的东西..所以我需要在这里写什么staemnent或规则:

0 投票
0 回答
34 浏览

c++ - (Bison) 动态转换在解析时失败

我正在编写一个编译器作为作业,并且我在 dynamic_cast 方面遇到了一些关键问题。我将尝试分享无法工作的关键代码片段,以及人们可能需要了解这里发生了什么的基本代码。

相关类:

以及我的 .ypp 文件中的一些规则:

注意:与其他规则没有冲突。野牛确保了这一点。

解析一些输入时的输出,例如:

输入:

输出:

我想不通。一个动态转换如何正常工作(基于额外的代码,并返回正确的指针),而另一个应该做同样的事情却失败了。

0 投票
1 回答
36 浏览

c++ - 野牛转移/减少“其他”中的冲突

考虑以下语法:

在运行野牛(带有反例)时,我得到:

这在某种程度上是野牛手册here中表示的移位/减少。但是在这个语法之后我没有“then”。该手册说,这个问题可以通过定义左右关联性和优先级来解决。在上面,我为“else”定义了右关联性,但它对这种转变减少问题没有影响。
我不想通过移位/减少计数来抑制警告,因为它太危险了,因为我的语法太大了。
我能做些什么 ?

0 投票
2 回答
54 浏览

c++ - 在 Bison 中生成循环 IR

考虑以下语法规则:

它是如下 for 循环的解析器规则(通常的 C 类 for 循环):

我必须为这个 C 生成 IR,比如 for 循环(forstmt)。
IR forexpr已经写好了。
关键是 lastnexpr的 IR 应该在stmt.
我知道中间规则动作,我认为我可以使用堆栈以某种方式解决这个问题,但我的想法并没有得出任何结论。
究竟有没有办法阻止野牛最后生成 IRnexpr并使其在stmt?
换句话说,如何使最后的所有动作都nexprstmt?
有没有人遇到过这样的问题?

0 投票
1 回答
57 浏览

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

0 投票
0 回答
29 浏览

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: