4

我想描述一个复杂的脚本和可能的编程语言。在做任何事情之前,我正在考虑用 Backus-Naur 形式描述它(不包括虚拟/示例脚本代码)

除了巴库斯-瑙尔形式,还有另一种描述语言的形式吗?我应该考虑哪些替代方案?

4

5 回答 5

7

显而易见的替代方案是扩展 Backus-Naur 形式,但是可以使用的其他形式很少,我找到了一些快速搜索的链接:

增强的 BNF

Wirth 语法符号

Van Wijngaarden 语法

我个人会坚持使用 BNF / EBNF,因为以某种形式使用它的信息和工具的流行。像bisonyacc这样的工具可以帮助从这样的语法生成解析器,并使生成解释器变得非常简单。

于 2009-02-13T12:09:07.937 回答
5

这取决于您希望描述该语言的正式程度。Backus-Naur 形式旨在描述上下文无关语法。因此,如果您想描述上下文无关的语法,巴库斯-瑙尔形式可能是最好的方法,因为它是描述这些的最广为人知的形式。

但是,如果您希望描述您的语义或更复杂的语法,您将需要使用其他方式。如果您还想描述您的语义,则需要根据语言特征(例如使用递归)在小步语义或大步语义之间进行选择。

请注意,如果您的语法不能使用上下文无关语法来表达,那么 BNF 根本不足以表达您的语言,您可能必须考虑使用上下文相关语法来描述您的语言。

于 2009-02-13T12:06:22.250 回答
1

BNF 是一个好的开始,有几个解析器生成器可以将其用作输入。如果您打算使用 C++,Boost.Spirit就是一个很好的例子。

于 2009-02-13T12:06:19.740 回答
0

您可能想查看 Microsoft 的“M”。这是一种语言/语法,允许您描述另一种语言(如 BNF 一样)。这被用作开发您自己的领域驱动语言的基础。

来自微软的“M”

于 2009-02-13T12:13:55.883 回答
0

您还可以考虑使用ANTLR,它使用接近 BNF 的语法/形式语言。它将帮助您构建解释器/编译器。

于 2009-02-13T13:20:03.463 回答