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

yacc - 多个 flex/bison 解析器

在一个项目中处理多个 Flex/Bison 解析器的最佳方式是什么?

我写了一个解析器,现在我在同一个项目中需要第二个。到目前为止,parser1.y我在第三部分中插入了main(..)方法并yyparse从那里调用。

我想要获得的是拥有两个不同的解析器(parser1.yparser2.y)并能够从外部函数中使用它们(假设mainmain.cpp)。

我应该使用哪些预防措施将yyparse函数导出到.y文件之外,我应该如何处理两个解析器?

PS。我正在使用 g++ 编译但不是 Flex 和 Bison 的 C++ 版本,我想保持这种方式(因此避免将解析器封装在对象中)。

0 投票
0 回答
3808 浏览

parsing - Bison 中的 %union 指令

我试图在野牛解析器中使用抽象语法树,所以我尝试使用%union指令。语法文件如下所示:

在当前状态下,我试图只使用结构,所以在文件中ast.h我有以下声明:

我使用的是 g++ 而不是 gcc,它应该可以工作(我在网上找到了类似的示例),但ast_node在定义时似乎不知道,YYSTYPE因为我收到了这个错误:

/shady_parser/shady.y:22:错误:ISO C++ 禁止声明没有类型的“ast_node”。/shady_parser/shady.y:22:错误:预期的“;” 在'*'标记之前./shady_parser/shady.l:在函数'int cyylex()'中:./shady_parser/shady.l:35:错误:'union YYSTYPE'没有名为'node'的成员。/shady_parser/shady .l:37: 错误:'union YYSTYPE' 没有名为'node' 的成员 ./shady_parser/shady.l:38: 错误:'union YYSTYPE' 没有名为'node' 的成员

为什么会发生这种情况?

那么是否可以将 ast_node 定义为一个类并使用指向它的指针而不是指向结构的指针?

在此先感谢,杰克

0 投票
4 回答
3345 浏览

c - 使用 GCC 和 Flex/Bison 发出无效警告的声明

使用 gcc 和 -Wall 选项编译我的项目时,我收到一条警告,提示我的 flex 文件最后一行不存在的语句无效:

警告:

外壳命令:

lex 文件的最后一部分:

任何人都知道为什么我可能会收到此警告?

如果我禁止所有 #line 指令,则错误是:

其中指的是 ECHO 行:

0 投票
3 回答
6304 浏览

compiler-construction - 使用野牛解析元素列表

我正在为着色引擎编写一个编译器,并且每个编译器都运行良好,直到我到达语句解析部分。

我使用了一个用类定义的抽象语法树来完成所有工作(以简化类型检查和中间代码生成)。所以我有一个祖先类ASTNode和所有降级类,如ASTFloat,等等。ASTExpressionASTIdentifier

.y文件中,我能够以常见的方式构建 AST:

它工作得很好,但是后来我尝试以这种方式生成范围的语句(例如if语句的主体):我使用了一个类ASTStatements,该类具有ASTNode*必须由解析器在遇到的每个语句时填充的列表。

因此,该方法将类似于以下内容:

问题是每个语句块应该只初始化一次该项目,但我不知道该怎么做。Usingif ($$ == null)是我尝试过的一种技巧,但它不起作用,因为它yylval可以包含到目前为止的任何内容。

使用 Bison 处理这种情况的正常/最佳方法是什么?

0 投票
3 回答
2008 浏览

yacc - 从 BNF 文法导出状态机

我正在尝试整理 XSS 安全字符串插值方案的概念证明。

给定一个带有替换的字符串,

我想把它分解成文字部分和替换("Hello<b>" planetoid "</b>!"),然后在文字部分上从左到右运行一个状态机。当我达到一个插值(planetoid在上面)时,我需要能够从状态到一个适当的转义函数。

有谁知道如何使用 lex/yacc/bison 派生状态机并能够将语法中的标签与输出状态相关联的任何示例?我想派生一个我可以在 javascript 中使用的状态机,并尝试替换 PHP 的底层字符串实现。

这里描述了我这样做的原因。

干杯,迈克

0 投票
8 回答
2296 浏览

compiler-construction - 编写编译器......什么是对的,什么是错的?

好的,在我寻找编写编译器所需的东西的过程中,我遇到了一些障碍。似乎我发现的每一种技术或工具在某个地方都有一些反对意见。

我现在使用 Bison 和 Flex,但我感觉这种方法已经过时了。这是真的?这是继续编写完整的编程语言的一种良好的前向兼容方式吗?

在大量不同的概念和工具(ANTLR、LL(k)、GLR、LALR、LLVM、Flex、Bison)中,编写编译器的当前趋势和最佳实践是什么?龙书过时了吗?

0 投票
4 回答
3809 浏览

makefile - 使用make生成bison语法

在使用makeand的项目中bison,我很难指定编译的语法grammar.tab.c取决于语法 input grammar.y,每个目标文件都取决于相应的源文件(包括grammar.tab.o),并且可执行文件取决于所有目标文件。

问题是make在 Grammar.tab.c 还不存在时运行意味着没有尝试构建它,并且在构建可执行文件时yyparse缺少该函数。

Makefile的是:

如果我改变它:

然后,如果它不存在,它将构建已编译的语法。但是如果它确实已经存在,那么在构建可执行文件时,就会出现关于yyparse被提供两次的错误(大概是因为$OBJ包含grammar.tab.o两次)。

我的目标是一个Makefile:

  1. 将根据命令正确构建可执行make文件,并根据需要重新构建中间文件。
  2. 将拾取*.c目录中的所有文件(即添加新源文件时不需要更改)。
  3. 易于阅读和理解。make只要一次只有一两个,我不介意学习新功能。

其他人的语法构建 Makefile 是如何工作的?

编辑好的,这些都是很好的答案。我选择了过滤器,因为它是最小的变化。我真的很高兴每个人似乎都确切地知道我在说什么——我很担心被告知使用像 automake 这样的拜占庭式的东西 ;-)。

谢谢大家。

0 投票
2 回答
3673 浏览

c - 语法中的左递归导致冲突

在整个 Bison 语法中,我都在使用右递归,并且我读过左递归更好,因为它不必先构建整个堆栈。

但是,当我尝试在其中任何一个上切换到左递归时,我总是会遇到很多冲突,我不明白为什么。

谁能告诉我一个通用示例,说明使用左递归而不是右递归会导致冲突(当右递归不会导致冲突时)。那么在切换到左时需要做什么来纠正这样的冲突。我认为一个基本的例子对我的帮助不仅仅是纠正我自己的语法。

编辑:
但我想无论如何我都应该包含一个特定的示例,因为我的理解还不够完整:-) 将“列表分隔符命令”更改为“命令分隔符列表”可以解决冲突。

0 投票
3 回答
1279 浏览

c - 使用 GDB 检查 Bison 的 $$ 变量

如果我在 Bison .y 文件中设置断点,有没有办法可以在该断点检查 $$ 伪变量的内容?

0 投票
1 回答
212 浏览

python - 选择性合并两个或多个数据文件

我有一个可执行文件,其输入包含在一个 ASCII 文件中,格式为:

换句话说,一些通用输入和一些新实例的一些参数值。参数声明不规范;一些数字用逗号分隔,其他数字采用科学计数法,其他数字在引号内,间距不是恒定的,等等。

某些场景的评估要求我输入一个“主”数据文件并将实例 2 到 6 的参数数据复制到另一个数据文件,该文件可能已经包含所述实例的数据(在这种情况下,数据应该是覆盖)和可能的其他(应保持不变的数据)。

我写了一个 Flex 词法分析器和一个 Bison 解析器;他们可以一起吃一个数据文件并将参数存储在内存中。"general input from 'scenario'; instances 1 though 5 from 'master'; instances 6 through 9 from 'scenario'; ..."如果我使用它们打开两个文件(主文件和“场景”),那么选择性地向第三个新文件写入所需参数(如 中)、保存并删除原始场景文件应该不会太难。

其他信息: (1) 文件高度敏感,完全屏蔽用户更改主文件非常重要;(2) 文件大小可控(从 500K 到 10M)。

我知道我可以用十行代码完成,这里的一些人可以用两行代码完成。你会如何处理这个问题?一个 Pythonic 的答案会让我哭泣。严重地。