问题标签 [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.
yacc - 多个 flex/bison 解析器
在一个项目中处理多个 Flex/Bison 解析器的最佳方式是什么?
我写了一个解析器,现在我在同一个项目中需要第二个。到目前为止,parser1.y
我在第三部分中插入了main(..)
方法并yyparse
从那里调用。
我想要获得的是拥有两个不同的解析器(parser1.y
和parser2.y
)并能够从外部函数中使用它们(假设main
在main.cpp
)。
我应该使用哪些预防措施将yyparse
函数导出到.y
文件之外,我应该如何处理两个解析器?
PS。我正在使用 g++ 编译但不是 Flex 和 Bison 的 C++ 版本,我想保持这种方式(因此避免将解析器封装在对象中)。
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 定义为一个类并使用指向它的指针而不是指向结构的指针?
在此先感谢,杰克
c - 使用 GCC 和 Flex/Bison 发出无效警告的声明
使用 gcc 和 -Wall 选项编译我的项目时,我收到一条警告,提示我的 flex 文件最后一行不存在的语句无效:
警告:
外壳命令:
lex 文件的最后一部分:
任何人都知道为什么我可能会收到此警告?
如果我禁止所有 #line 指令,则错误是:
其中指的是 ECHO 行:
compiler-construction - 使用野牛解析元素列表
我正在为着色引擎编写一个编译器,并且每个编译器都运行良好,直到我到达语句解析部分。
我使用了一个用类定义的抽象语法树来完成所有工作(以简化类型检查和中间代码生成)。所以我有一个祖先类ASTNode
和所有降级类,如ASTFloat
,等等。ASTExpression
ASTIdentifier
在.y
文件中,我能够以常见的方式构建 AST:
它工作得很好,但是后来我尝试以这种方式生成范围的语句(例如if语句的主体):我使用了一个类ASTStatements
,该类具有ASTNode*
必须由解析器在遇到的每个语句时填充的列表。
因此,该方法将类似于以下内容:
问题是每个语句块应该只初始化一次该项目,但我不知道该怎么做。Usingif ($$ == null)
是我尝试过的一种技巧,但它不起作用,因为它yylval
可以包含到目前为止的任何内容。
使用 Bison 处理这种情况的正常/最佳方法是什么?
yacc - 从 BNF 文法导出状态机
我正在尝试整理 XSS 安全字符串插值方案的概念证明。
给定一个带有替换的字符串,
我想把它分解成文字部分和替换("Hello<b>" planetoid "</b>!")
,然后在文字部分上从左到右运行一个状态机。当我达到一个插值(planetoid
在上面)时,我需要能够从状态到一个适当的转义函数。
有谁知道如何使用 lex/yacc/bison 派生状态机并能够将语法中的标签与输出状态相关联的任何示例?我想派生一个我可以在 javascript 中使用的状态机,并尝试替换 PHP 的底层字符串实现。
这里描述了我这样做的原因。
干杯,迈克
compiler-construction - 编写编译器......什么是对的,什么是错的?
好的,在我寻找编写编译器所需的东西的过程中,我遇到了一些障碍。似乎我发现的每一种技术或工具在某个地方都有一些反对意见。
我现在使用 Bison 和 Flex,但我感觉这种方法已经过时了。这是真的?这是继续编写完整的编程语言的一种良好的前向兼容方式吗?
在大量不同的概念和工具(ANTLR、LL(k)、GLR、LALR、LLVM、Flex、Bison)中,编写编译器的当前趋势和最佳实践是什么?龙书过时了吗?
makefile - 使用make生成bison语法
在使用make
and的项目中bison
,我很难指定编译的语法grammar.tab.c
取决于语法 input grammar.y
,每个目标文件都取决于相应的源文件(包括grammar.tab.o
),并且可执行文件取决于所有目标文件。
问题是make
在 Grammar.tab.c 还不存在时运行意味着没有尝试构建它,并且在构建可执行文件时yyparse
缺少该函数。
我Makefile
的是:
如果我改变它:
然后,如果它不存在,它将构建已编译的语法。但是如果它确实已经存在,那么在构建可执行文件时,就会出现关于yyparse
被提供两次的错误(大概是因为$OBJ
包含grammar.tab.o
两次)。
我的目标是一个Makefile:
- 将根据命令正确构建可执行
make
文件,并根据需要重新构建中间文件。 - 将拾取
*.c
目录中的所有文件(即添加新源文件时不需要更改)。 - 易于阅读和理解。
make
只要一次只有一两个,我不介意学习新功能。
其他人的语法构建 Makefile 是如何工作的?
编辑好的,这些都是很好的答案。我选择了过滤器,因为它是最小的变化。我真的很高兴每个人似乎都确切地知道我在说什么——我很担心被告知使用像 automake 这样的拜占庭式的东西 ;-)。
谢谢大家。
c - 语法中的左递归导致冲突
在整个 Bison 语法中,我都在使用右递归,并且我读过左递归更好,因为它不必先构建整个堆栈。
但是,当我尝试在其中任何一个上切换到左递归时,我总是会遇到很多冲突,我不明白为什么。
谁能告诉我一个通用示例,说明使用左递归而不是右递归会导致冲突(当右递归不会导致冲突时)。那么在切换到左时需要做什么来纠正这样的冲突。我认为一个基本的例子对我的帮助不仅仅是纠正我自己的语法。
编辑:
但我想无论如何我都应该包含一个特定的示例,因为我的理解还不够完整:-) 将“列表分隔符命令”更改为“命令分隔符列表”可以解决冲突。
c - 使用 GDB 检查 Bison 的 $$ 变量
如果我在 Bison .y 文件中设置断点,有没有办法可以在该断点检查 $$ 伪变量的内容?
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 的答案会让我哭泣。严重地。