问题标签 [yacc]
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.
compiler-errors - 'yyerror' 的多重定义
使用 Bison(或 yacc)我如何解决错误
我尝试%option noyywrap nodefault yylineno
在顶部编写原型。没运气。
-编辑-
没关系。当我复制粘贴一个示例以使用时,我没有意识到我已经有一个 yyerror 函数。
yacc - Bison 语法错误(初学者)
我回来了,现在正在编写自己的语言和操作系统,但是由于我现在开始开发自己的开发语言,所以在使用 Bison 时遇到了一些错误,我不知道如何解决它们。这是我的 *.y 文件代码:
当我尝试将 Bison 与此源代码一起使用时,我收到此错误:
calc.y:1.1-5:语法错误,意外标识符:
yacc - 野牛和 lex 字符串与 char
我正在尝试评估和表达形式
expr 可以是由某些字符组成的字符串,也可以是上面的函数。所以这可能看起来像
问题是,如果我以
如果我有类似的东西,我在构建语法时遇到问题
而且我不太确定语法是否错误或我的 AST 实现。
我发现我的逻辑有缺陷,因为在 nm expr 的情况下, expr expr 将返回 n*m 的值,它仍然是 nm。这会导致无限循环吗?我应该如何解析这样的表达式。
不要扔石头。野牛新手
后来的编辑 我设法清理并测试了 AST 和一些链表背后的代码。唯一的问题仍然是语法。
对于 Frac[m^2][m^4] node / node K m^4 node K m^4 这样的 expr,此语法失败
c++ - 简单的 Flex/Bison C++
我已经在寻找答案,但是对于一个简单的示例,我没有得到任何快速响应。
我想使用 g++ 编译一个 flex/bison 扫描器+解析器,只是因为我想使用 C++ 类来创建 AST 和类似的东西。
在互联网上搜索我发现了一些漏洞,都说唯一需要的是在 lex 文件中使用 extern "C" 声明一些函数原型。
所以我的 shady.y 文件是
而 shady.l 文件是
最后在makefile中我使用g++而不是gcc:
flex 和 bison 工作正常,但在链接时出现以下错误:
当然,如果我尝试更改野牛文件中有关函数的任何内容,它会说 yylex 未在 yyparse 的范围内声明。
我是否试图简单地解决比看起来更复杂的问题?实际上,我不需要一个封闭的结构来以面向对象的方式访问解析器和词法分析器,我只是想让它工作。
我只想能够在野牛文件中使用 C++(创建 AST)并从 C++ 对象调用 yyparse() ..
提前致谢
macros - 在 yacc/bison lex 中处理 #define 宏
我将如何#define
使用 yacc/bison 实现宏?
我在想所有定义的字符都必须匹配一个常规变量。变量被定义为[a-zA-Z_][a-zA-Z0-9_]*
所以我想我可以在那里检查变量是否已定义有效。然后将文本替换为应有的内容。
我怎样才能做到这一点?现在我想完全忽略 BAD 这个词,就好像我#define BAD
在 C 中定义它一样。下面是该 lex 规则的代码,但我做错了。lex 还抱怨“BA”在流中。我知道下面是完全错误和不合逻辑的,所以我如何忽略 BAD,然后如何用 float 之类的东西替换它
我知道主要步骤是 1)定义定义,2)在源代码中检测它 3)让 lex 忘记宏字符 4)插入新的正确字符。
warnings - Bison 构建警告:“给出了 -s 选项,但可以匹配默认规则”
我收到警告
如果你用谷歌搜索“选项给定但默认规则可以匹配”,你会 在诊断部分的旧 Flex 手册页中找到Flex 手册中关于诊断的章节和此条目:
警告,'-s option given but default rule can be match' 意味着默认规则(匹配任何单个字符)有可能(可能仅在特定的开始条件下)是唯一匹配特定输入的规则。既然
-s
给出了,大概这不是故意的。
我的构建文件没有-s
选项。我写
如何解决此警告?
这是我的 lex 文件的一个小版本。此文件还会触发警告
yacc - 多个 flex/bison 解析器
在一个项目中处理多个 Flex/Bison 解析器的最佳方式是什么?
我写了一个解析器,现在我在同一个项目中需要第二个。到目前为止,parser1.y
我在第三部分中插入了main(..)
方法并yyparse
从那里调用。
我想要获得的是拥有两个不同的解析器(parser1.y
和parser2.y
)并能够从外部函数中使用它们(假设main
在main.cpp
)。
我应该使用哪些预防措施将yyparse
函数导出到.y
文件之外,我应该如何处理两个解析器?
PS。我正在使用 g++ 编译但不是 Flex 和 Bison 的 C++ 版本,我想保持这种方式(因此避免将解析器封装在对象中)。
java - 等效于 Java 的 Yacc
我正在使用 Java 进行编译器设计项目。词法分析已完成(使用 jflex),我想知道哪种类似 yacc 的工具最适合(最有效、最容易使用等)进行句法分析以及为什么。
c++ - 有 Yacc 语法调试器吗?
我一直在帮助增强公司内已有 20 年历史的专有语言。它是一种大型的图灵完备语言。将其翻译成另一种语法体系(例如 Antlr)不是一种选择(我无法决定这一点)。
在大多数情况下,扩展语法进展顺利。但每隔一段时间我就会得到一个 reduce-reduce 或 shift-reduce
- 很难消除
- 有时只是没有意义(对我脆弱的大脑)
经过大量痛苦地盯着y.output文件和实验性的语法重构之后,我通常已经到了我想去的地方。有时我不得不做出不令人满意的妥协。
那么,是否有任何工具可以吸收 yacc 语法,从而增强浏览、试验并允许调试更改?
如果我添加一个产品,我希望看到的不仅仅是“到处使用的原子产品”(想想标识符)“与规则 foo 冲突”(是的,有更多的信息,s/r,r/r,比这更多,但我想你明白我的意思)。除了戴上我的思考帽并试图想象一个符号堆栈和状态机之外,如果能有一些相互作用的暗示会很好。
更新:我想我应该澄清一下。我们使用伯克利 Yacc。我一直在使用最新版本的 Bison 进行测试。对于输出,我使用--report=itemset编译了语法。
我写这篇文章的目标是寻找外部工具来增强yacc 附带的语法调试工具。今天使用默认设置很痛苦。帮助我找到更好的交互工具,例如可以与 Antlr 一起使用的工具。
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 定义为一个类并使用指向它的指针而不是指向结构的指针?
在此先感谢,杰克