所有的解析器都是用yacc或bison(以及lex/flex)制作的吗?

5
我认为Bison和Yacc经常用于解析编程语言的语法(lex/flex用于标记化...)。
我的问题是:所有编译器都是用这些工具制作的吗?还是有人从头开始编写他们自己的解析器?(我大多数情况下都不使用“编译器编译器”,但我知道它们)
构建解析器而没有使用这些工具是否“赚钱”?
是否有替代yacc/bison和lex/flex的更“开放”且不那么严格的选项?是否存在用于C的库以帮助我完成解析?是否有其他选项可以构建解析器,而不是使用yacc但也不必从头开始编写?
此致 Lukas

2
有很多解析器生成器可供使用。它们都被用于某些方面,而且可能大部分仍在使用。有时候,对于非常简单的语法,通过手写代码解析特定领域的语言(通常是某种配置文件)会更容易一些。 - Ken Clement
1
不行。考虑使用JavaCC和ANTLR。有些人会自己编写解析器生成器。 - erip
1
有很多解析器生成器可供选择。以下是部分列表:https://en.wikipedia.org/wiki/Comparison_of_parser_generators。 - Ira Baxter
SO的关停者们:我觉得这个问题并没有要求资源或推荐。他在问的是实践的现状。我认为你的关闭请求不恰当。(投票重新开放)。 - Ira Baxter
3个回答

3
所有的解析器都是用yacc或bison(和lex/flex)制作的吗?
不是的。例如,GCC就没有使用它们。
参考链接:c - Are GCC and Clang parsers really handwritten? - Stack Overflow

3
许多高性能的解析器(如C++编译器)都是手写的,或至少是由工具预先生成,并经人工修改。然而,这显著增加了维护工作量,并引入了更多的错误可能性。
良好编写的语法和选择合适的解析器生成工具可以产生几乎与手写解析器同样好的性能,甚至更好。
因此,如果您没有大型组织的开发和测试资源,解析器生成器是首选。
有许多解析和分析工具可用,根据平台、解析器类型(LLk、LALR(1)等)和输出语言,既有通用的也有专业的。
还有像Programmar这样的通用解析引擎,它接受一个输入语法并在运行时解释它,以便应用程序分析符合该语法的输入。
Gold Parser是一个免费且易于使用的LALR(1)解析器生成器,运行在Windows操作系统上。
Spirit框架附带了C++ Boost库,使用预处理宏和聪明的泛型结合,使开发人员能够在一个C++文件中生成语法,尽管看起来很像标准的EBNF语法文件,但它本质上是由C++编译器本身编译的。自然,它的输出目标是C++。
Elk是一个用于创建基于C++的GLR解析器的工具包。GLR是一种特别高效和灵活的解析器类型,经常用于复杂的语法(如C++本身)。
还有许多其他的工具,包括ANTLR和ACCENT,每个工具都有自己的优点和缺点。

2
请参考https://dev59.com/kG015IYBdhLWcg3w6QHA,了解如何有效地使用语法分析器处理复杂的编程语言,例如C++。 - Ira Baxter

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接