问题标签 [bison]

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 投票
2 回答
3387 浏览

c++ - Bison 似乎无法正确识别 C 字符串文字

我的问题是我试图运行一个我使用 flex-bison 扫描仪解析器编码的问题。我的程序应该做的是接受用户输入(在我的例子中,查询我正在设计的数据库系统)、lex 和解析,然后执行相应的操作。实际发生的是我的解析器代码没有正确解释我提供给它的字符串文字。

这是我的代码:

我的输入,按照“查询:”提示:

查询:插入 abc(5);
输入:1.0-5:语法错误,意外字符串,预期文件结尾或行尾或 INSERT 或 ';'

现在,如果我从第 130 行的 parser.yy 代码中删除“INSERT”字符串文字,程序运行得很好。事实上,在存储输入数据(即“abc”和整数 5)后,它会正确返回给我。

起初,我认为这是字符编码的问题。Bison 代码需要使用相同的编码进行编译和运行,这应该不是问题,因为我正在从同一个终端编译和运行。

我的系统详情:

Ubuntu 8.10 (Linux 2.6.24-16-generic)
flex 2.5.34
bison 2.3
gcc 4.2.4

如果您需要更多信息或代码,请告诉我!

0 投票
1 回答
1510 浏览

parsing - 使用 yyparse() 制作两遍汇编程序?

我正在为正在开发的自定义微控制器编写汇编程序。我已经让汇编器达到了将指令汇编成二进制的程度。

但是,我现在在让标签工作时遇到问题。目前,当我的汇编程序遇到一个新标签时,它会存储标签的名称和它所引用的内存位置。当一条指令引用一个标号时,汇编器查找该标号并用适当的值替换该标号。

这很好,很漂亮,但是如果标签是在引用它的指令之后定义的呢?因此,我需要让我的解析器对代码运行两次。

这是我目前的主要功能:

我在 flex/bison 配置中使用它。

0 投票
4 回答
1082 浏览

parsing - 同一个应用程序中是否可以有两个或多个 Lex/Yacc 解析器

我有一个应用程序,其中我已经有一个用于一种语法的解析器,我需要为另一个目的添加第二种不同的语法。

是否可以拥有多个?

如果是这样,你如何获得另一个入口点?

谢谢

大卫艾伦芬奇

0 投票
1 回答
1548 浏览

bison - Lex/Yacc:输入前打印消息

我试图弄清楚在使用 lex/yacc (flex/bison) 时如何显示消息/提示。

例如, main 看起来像这样:

哪个调用yacc,哪个调用yylex()。这会产生一个在 STDIN 上等待的空行。我怎样才能显示类似...的消息

代替

其中下划线表示光标位置,等待来自 STDIN 的输入...

忘了提,我希望重复打印提示......所以在每次 lex/yacc 从标准输入请求输入之前......

0 投票
5 回答
24018 浏览

c++ - 如何在 flex 和 bison 中使用 C++?

我有一个学校项目,我们需要使用 flex 和 bison。我想使用 C++,以便可以访问 STL 和我自己编写的类。我们获得了以下 Makefile:

scan.l 和 parse.y 有一些初始的 flex/bison 东西来生成扫描器和解析器。我需要将我自己的东西添加到这些文件中。symtab.{h, c} 应该是符号表的实现。attr.{h, c} 用于某些属性魔法。我想制作 symtab.ca .cc 文件,这样我就可以使用 STL。我还有其他想要使用 C++ 的原因。

我尝试使用 parse.ypp 文件,以便生成 .cpp 文件。但问题是我没有得到正确的 .h 文件。我将 Makefile 更改为如下所示:

有人可以告诉我需要添加什么或做什么才能使 C++ 正常工作吗?应该注意的是,我在 .y(或 .ypp)文件中添加了一些东西来处理从 C 到 C++ 的迁移。特别是,我不得不将一些东西声明为 extern。我的主要问题是,当我运行 make 时,scan.l 有一堆语法错误,它们似乎是因为它不能包含 parse.tab.h(因为它永远不会生成)。

0 投票
8 回答
35055 浏览

c - 弹性词法分析器的字符串输入

我想使用 flex/bison 解析器创建一个 read-eval-print 循环。麻烦的是,flex 生成的词法分析器需要 FILE* 类型的输入,我希望它是 char*。有没有办法做到这一点?

一个建议是创建一个管道,向它提供字符串并打开文件描述符并发送到词法分析器。这相当简单,但感觉很复杂,而且不是很独立于平台。有没有更好的办法?

0 投票
2 回答
482 浏览

parsing - 使用 BISON 等解析器生成器,同时仍能优雅地处理错误输入

我需要一个不那么复杂的语言的解析器。唯一的问题是,我从不希望解析器在收到格式错误的输入时引发错误。相反,我希望它继续,尽可能多地理解输入,类似于 Web 浏览器中的 HTML 解析器所做的。

我很自然地想使用解析器生成器,但我对它们没有太多经验,而且我看到的所有关于 Bison 和 Antlr 的示例都具有脆弱的解析器,一旦遇到语法错误就会放弃。这对他们可行吗,还是我应该考虑手动滚动它?考虑到语言,它可能(我认为)不会那么困难。

0 投票
1 回答
435 浏览

antlr - ANTLR 相当于野牛 REJECT 动作?

我正在尝试解析一个Name=Value对列表,其中值可以包含除空格以外的任何内容(即值可以包含等号)。
该名称仅限于通常的标识符字符。

问题是,“价值”标记匹配一切。例如,对于输入:

解析器会将整个输入与“值”标记匹配(并抛出一个MismatchedTokenException)。

bison中,有可能将状态分配给标记(或者这只是用于非终结符?),以便它们只有在显式转换到该状态后才变得“有资格”进行匹配。

编辑考虑一下,这在野牛中也不起作用-令牌拆分已经发生(在flex中);但是,我认为有一种方法可以REJECT标记,迫使flex尝试次优匹配。

这是我的 ANTLR 语法。

0 投票
5 回答
9379 浏览

parsing - 如何修复后增量运算符的 YACC 移位/减少冲突?

我正在用 YACC(实际上是 Bison)编写语法,并且遇到了移位/减少问题。它是由于包含后缀递增和递减运算符而产生的。这是语法的精简版:

Bison 告诉我有 12 个移位/减少冲突,但如果我注释掉后缀递增和递减的行,它就可以正常工作。有谁知道如何解决这个冲突?在这一点上,我正在考虑迁移到 LL(k) 解析器生成器,这使它更容易,但 LALR 语法似乎总是更自然地编写。我也在考虑 GLR,但我不知道有什么好的 C/C++ GLR 解析器生成器。

0 投票
2 回答
992 浏览

parsing - 如何在编译器中实现前向引用?

我正在使用 Lex 和 YACC(实际上是 Flex 和 Bison)创建一个编译器。该语言允许无限前向引用任何符号(如 C#)。问题是在不知道标识符是什么的情况下解析语言是不可能的。

我所知道的唯一解决方案是对整个源进行 lex,然后进行“广度优先”解析,因此类声明和函数声明等更高级别的内容在使用它们的函数之前得到解析。但是,对于大文件,这会占用大量内存,并且很难用 YACC 处理(我必须为每种类型的声明/正文创建单独的语法)。我还必须手写词法分析器(这不是什么大问题)。

我不太关心效率(尽管它仍然很重要),因为一旦我完成它,我将自己重写编译器,但我希望那个版本很快(所以如果有任何快速通用的不能在 Lex/YACC 中完成但可以手工完成的技术,也请提出建议)。所以现在,易于开发是最重要的因素。

这个问题有什么好的解决方案吗?这通常如何在 C# 或 Java 等语言的编译器中完成?