问题标签 [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 投票
1 回答
93 浏览

c++ - 我应该提供什么样的数据结构来处理我的编译器中的范围?

我正在 ubuntu 中开发一个带有 flex 和 bisonc++ 的“玩具”编译器,它将类似 C 的输入语言编译成优化的 C++。在输入语言中包含一个 main 函数(必须有)并且可以在 main 之外有 optionals 函数,例如:

在语义分析部分我遇到了麻烦,我不知道如何处理范围,我现在不知道我应该提供什么样的符号表结构或者我应该为这个问题创建什么样的数据结构。我的问题有一个复杂的案例(语义分析部分):

0 投票
0 回答
49 浏览

bison - 有没有在windows下生成c++代码的flexc++/bisonc++?我从哪里下载它们

我想用c++写一个flex/bison解析器,但是我安装的flex/bison只能使用和生成c代码。昨天找了一天,gitlab里面有flexc++ / bisonc++之类的项目。但是这个对应的是linux系统,我需要一个windows版本

0 投票
0 回答
19 浏览

c++ - 使用 Bisonc++ 跳过 Parser::lex() 方法预定义

我正在尝试在虚拟词法分析器和解析器上运行 Flex 和 Bisonc++。这是 Flex 从中生成正确lex.yy.cc文件的词法分析器:

这是我的虚拟句法分析器:

Bisonc++——它应该——生成一个Parserbase.h, Parser.h, Parser.ih, 和parse.cc文件。但是,Parser.ih其中包含以下方法:

我在 Bisonc++ 的文档中读到,如果提供了该方法,则会生成此方法--scanner=<pathname>,尽管我在没有它的情况下运行 Bisonc++。生成的文件不包含d_scanner对象。当我尝试编译生成的 *.cc 文件时,出现以下错误:

error: ‘d_scanner’ was not declared in this scope

我的问题是,我该怎么做才能使 Bisonc++ 跳过此方法的生成,或者以不同的方式生成它?

0 投票
0 回答
22 浏览

bison - 如何在 Bison c++ 中分别将 yy::parser::token 提取到头文件中

我正在使用 GNU Bison 3.7.4。每次编译parser.y文件,token都会直接编译到parser.h文件中。我想将令牌单独提取到头文件中,就像 location.hh 文件一样,这样我就可以在需要的地方使用它。是否有相关的 %define 可以实现我的想法?谢谢

0 投票
1 回答
76 浏览

c++ - 在 C++ Bison 中重新定义位置类型?

Bison 的标准版本通过确保以下四个字段可用,使重新定义位置类型变得非常简单:

customsourcelocation.h

解析器.y

然而,C++ 版本的 location 似乎更高级,因为构成 location 类型的结构也由多个position对象组成。

谁能提供一个为 C++ Bison 解析器重新定义位置类型的基本示例,以便位置数据对象独立于 Bison,因此可以从任何文件中包含,而无需同时包含任何 Bison 生成的代码?

提前致谢。

0 投票
2 回答
87 浏览

c++ - Bison C++ 获取令牌名称 - yytname_ 是私有的

我正在尝试在 C++ Bison 中获取令牌的名称:例如%token <int> TPLUS "+" TMINUS "-" TMUL "*" TDIV "/"

然而,在 Bison 的 C++ 变体中,%token-table不做任何事情。

我注意到生成的野牛代码中有一个令牌映射: const char* const parser::yytname_[];但是它是私有的。

有谁知道如何在 C++ Bison 中获取这些标记的名称?这甚至可以使用 C++ 变体吗?

我知道这里有人问过这个问题,但没有公认的答案。

使用版本 3.4.3

0 投票
1 回答
75 浏览

c++ - Bison中的“语法错误”没有解释

我正在开发一个控制台应用程序。为了创建一个解释器,我使用了 Flex 和 Bison。我创建了一个语法,但每次尝试使用字符串时都会收到“语法错误”而没有任何其他解释。我正在尝试使用的字符串是: MKDISK -PATH=./home/erick/disk.dk -u=k -size=1000\n

我知道生产有问题

因为我注意到,如果我添加一个没有 lista_param 的产品,只是 MKDISK,它可以工作,并且解析器将始终执行该产品,如果字符串与另一个字符串匹配。

解析器.yy:

词法分析器

0 投票
1 回答
32 浏览

parsing - 解析语句并向它们添加括号

我正在尝试解析逻辑 BNF 语句,并尝试对它们应用括号。

例如: 我正在尝试将语句a=>b<=>c&d解析为((a)=>(b))<=>((c)&(d))以及类似的语句。

面临的问题:有些陈述工作正常,而有些则不然。上面提供的示例不起作用,解决方案打印为 ((c)&(d))<=>((c)&(d)) 第二个 expr 似乎覆盖了第一个。

有效的条件:虽然其他简单的例子,如 a<=>b , a|(b&c) 工作正常。

我想我在我的代码中犯了一些基本错误,我无法弄清楚。

这是我的代码

文件

yacc 文件

请让我知道我犯的错误。

谢谢

0 投票
1 回答
25 浏览

bison - 在 Bison 中访问产品的价值以及从另一个产品中分配类型

我正在与野牛一起工作,目前遇到了一个问题,并且对所有这些工作方式非常陌生,我需要能够判断一个特定的产品是否是 > 或 + 或 >= 但我不知道最好的方法存储和检索此值,这是以下代码:

if 语句显然现在不起作用,但我只需要能够查看它是有理运算符还是算术运算符等。

稍后我还需要能够使用一种产品,因此请说以下内容:

根据 T_PROGN 的返回类型,我需要能够更改 N_PROGN_OR_USERFUNCTCALL 的类型,最好的方法是什么?谢谢!

0 投票
1 回答
36 浏览

bison - BISON 一元减法与模运算

我正在用模算术实现一个简单的计算器(环Z_p,所以我知道{0, 1, 2, ..., p - 1}哪里p是素数)。如果输入是-x我想p-x在输出上打印正确的值。我的语法:

以前我有NUMBER现在num在哪里exp。然后打印的东西x而不是p-x. 我没有看到任何其他方法可以做到这一点 - 我怎么知道在下一步我是否会有终端?所以我想出了这个。然而,它给了我关于减少/减少冲突的警告(好吧,我明白为什么),但它给出了正确的结果。

我的问题是:我怎样才能做得更好?我可以摆脱警告但仍然拥有我想要的东西吗?

编辑: 假设p= 7。然后,如果我写-(8+5),我希望输出(反向波兰符号)1 5 +8mod7=1. 这可以通过中的第二条规则来处理exp。但是,如果我写-5,那么我想显示2它是正确的值。这不能仅通过规则来完成,exp因为我在那里打印了确切的数字:

这些规则不能按我想要的方式工作,所以我想出了上面介绍的解决方法。