问题标签 [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.
parsing - 如何使用 Flex 实现两遍扫描仪?
作为一个宠物项目,我想尝试实现一种我自己设计的基本语言,可以用作网络脚本语言。将 C++ 程序作为 Apache CGI 运行是微不足道的,因此真正的工作在于如何解析包含非代码(HTML/CSS 标记)和服务器端代码的输入文件。
在我本科的编译器课程中,我们使用Flex和Bison为一种简单的语言生成扫描器和解析器。我们得到了一份语法副本,并编写了一个解析器,将简单的语言翻译成虚拟机的简单程序集。flex 扫描器对输入进行标记,并将标记传递给 Bison 解析器。
这与我想做的不同之处在于,就像 PHP 一样,这种语言可以有纯 HTML 标记,而脚本语言可以像下面这样穿插:
我假设按如下方式解析输入文件会很有效,我是否不正确:
- 扫描输入,直到找到脚本开始标记('
- 第二个扫描器标记输入文件的服务器端脚本部分(来自打开标记:'')并将标记传递给解析器,它不需要知道文件中的标记。
- 控制权返回到继续这种一般模式的第一个扫描仪。
基本上,第一个扫描器只区分标记(直接返回到浏览器未修改)和代码,它被传递给第二个扫描器,第二个扫描器反过来标记代码并将标记传递给解析器。
如果这不是一个可靠的设计模式,PHP 等语言如何有效地处理扫描输入和解析代码?
c++ - Antlr 的优势(相对于 lex/yacc/bison)
我过去曾在各种项目中使用过 lex 和 yacc(通常是 bison),通常是翻译器(例如流入 EDA 应用程序的 EDIF 子集)。此外,我不得不支持基于 lex/yacc 语法的代码,这些语法可以追溯到几十年前。因此,尽管我不是专家,但我知道如何使用这些工具。
过去我在各种论坛上看到过关于 Antlr 的正面评价,我很好奇我可能遗漏了什么。因此,如果您两者都使用过,请告诉我 Antlr 中哪个更好或更高级。我目前的限制是我在 C++ 商店工作,我们发布的任何产品都不会包含 Java,因此生成的解析器必须遵循该规则。
c++ - 清除野牛生成的解析器的解析器状态
我使用的是 Flex 生成的 C 词法分析器和 Bison 生成的 C++ 解析器。我已修改解析器以仅接受字符串输入。
我yyparse()
在循环中调用解析器函数,并逐行读取用户输入。如果输入是“退出”,我会停止循环。
我面临的问题是,当输入与任何规则都不匹配时,解析器会突然停止,并且在下一次迭代时以相同的状态开始,期望被停止的规则(由于语法错误)完成。
如果输入有效并且与解析器规则匹配,则它可以正常工作。
关于语法错误,我重新定义了该yyerror()
函数,该函数显示一条简单的错误消息。
当输入与任何解析器规则都不匹配时,如何清除解析器的状态,以便在下一次迭代时重新启动解析器?
bison - bison / yacc 是否有现代(例如 CLR)替代品?
我刚刚重新编写了一些使用野牛编写的类似编译器的旧代码。当我这样做的时候,我想知道现代的等价物是什么?是否有一个不错的 .NET(或类似的)编译器编写框架,它采用 BNF 语法并拆分出一个进行解析的 DLL?
parsing - 开发一个简单的解析器
我的日常工作包括开发一个类似 Pascal 的编译器。我一直致力于优化和代码生成。
我也想开始学习为同一种语言构建一个简单的解析器。但是,我不确定该怎么做。Flex 和 Bison 似乎是首选。但是,难道不能使用 C++ 或 C# 编写解析器吗?我对C有点毛骨悚然。
Yacc++ 支持 C#,但它是一个许可的。我正在寻找在这方面我能找到的所有帮助。建议将不胜感激。
gdb - 使用 GDB 调试 Bison 生成的代码
我正在尝试进入我的 yyparse 函数,该函数在 Bison 生成的代码中定义,但我从 GDB 收到一条消息说
Reading file "foo.tab.c"...No such file or directory.
Bison 生成的文件名为 foo.cc。它为什么要寻找foo.tab.c
,而不是?
parsing - 什么时候可以使用模棱两可的语法或产生式规则?(野牛移位/减少警告)
当然有很多关于解决移位/减少错误的文档和方法。野牛文档建议正确的解决方案通常只是 %expect 他们并处理它。
当你有这样的事情:
您可以像这样轻松解决它们:
我的问题是:最好是让语法有点模棱两可并期望转移/减少问题,还是尝试调整语法以避免它们更好?我怀疑有一个平衡,它是基于作者的需要,但我真的不知道。
parsing - Flex/Lex 和 Yacc/Bison 有什么区别?
Flex & Lex 和 Yacc & Bison 有什么区别。我在互联网上疯狂搜索,但没有找到任何可靠的答案。
我可以在 Ubuntu 上安装纯 Lex 和 Yacc,还是只能安装 flex 和 bison。我很困惑。
- Lex 或 Yacc 是否仍由某人维护?
- 他们都是免费的吗?
如果 Lex 不是免费的,为什么我要在我的 Ubuntu 发行版上安装它?
/li>
bison - flex 究竟是如何支持野牛定位的?
我正在尝试使用 flex 和 bison 创建过滤器,因为我想从复杂语言中获取某些语法元素。我的计划是使用 flex + bison 来识别语法,并转储出感兴趣元素的位置。(然后使用脚本根据转储的位置获取文本。)
我发现 flex 可以支持名为 bison-locations 的野牛功能,但它是如何工作的。我尝试了 flex 文档中的示例,似乎 yylloc 不是由 flex 自动设置的,我总是得到(1,0)-(1,0)
. flex 可以自动计算每个令牌的位置吗?如果没有,定义了哪些接口函数供我实现?有什么例子吗?
关于工具有更好的解决方案吗?
最好的问候,凯文
编辑:
现在yylex的界面变成了:
野牛手册未指定词法分析器应如何实现以正确设置 yylloc_param。对我来说,很难手动跟踪每个令牌的列号。
parsing - 词法分析器/解析器工具
哪个词法分析器/解析器生成器对于 C 或 C++ 来说是最好的(最容易使用、最快的)?我现在正在使用 flex 和 bison,但 bison 只处理 LALR(1) 语法。我正在解析的语言实际上并不需要无限前瞻,但无限前瞻会使解析变得容易得多。我应该尝试 Antlr 吗?可可/R?猎鹿犬?还有什么?