【发布时间】:2012-08-23 14:08:26
【问题描述】:
以下是 C# 语言规范的语法部分的摘录:
这是以特定格式编写的吗?我查看了我发现的旧 C++ ISO 中的语法部分,它似乎遵循相同的格式,那么这里是否使用了一些标准来编写这个语法?我问是因为我希望能够创建一个工具,我可以在其中直接粘贴语法并立即拥有一个工作的 C# 解析器。
微软似乎免费发布了他们的 C# 规范,但我在任何地方都找不到 C++11 格式。我要买这个才能看吗?
【问题讨论】:
以下是 C# 语言规范的语法部分的摘录:
这是以特定格式编写的吗?我查看了我发现的旧 C++ ISO 中的语法部分,它似乎遵循相同的格式,那么这里是否使用了一些标准来编写这个语法?我问是因为我希望能够创建一个工具,我可以在其中直接粘贴语法并立即拥有一个工作的 C# 解析器。
微软似乎免费发布了他们的 C# 规范,但我在任何地方都找不到 C++11 格式。我要买这个才能看吗?
【问题讨论】:
它是 Yacc 使用的 BNF 的变体。 Yacc 通常将; 作为其语法的一部分,但是使用像 C# 和 C++ 这样的语言进行更改会使事情变得更简单,其中; 本身就非常重要。与大多数 BNF 变体不同,它有一个 :,而 BNF 经常使用 =(另请参阅 Van Wijngaarden 语法,您很快就会知道这个答案的来源,而不仅仅是一点点知识)。
ISO 没有关于必须在其标准中使用哪种语法的规则,因此其他人使用 BNF、ABNF、EBNF、Wirth 语法,也许还有其他语法。
ISO 标准通常起源于国家标准或其他标准,然后被 ISO 采用。由于不同的标准机构使用不同的语法(IETF 在 RFC 中使用 ABNF [自己在 RFC 5234 中定义],BSI 和 W3C 使用不同的 EBNF 变体,等等)ISO 中的语法通常反映了它的起源。
这里就是这种情况。 Kernigan 和 Ritchie 在他们的书The C Programming Language 中使用了这种格式。虽然 ANSI 标准和后来的 ISO 标准在语法本身上有所不同,但它们使用相同的格式,并且从那时起它就被用于其他类似 C 的语言。
【讨论】:
每个标准都有自己的特色。但是在编译器编写者中,有一种相当标准的语法描述方式,这就是您在此处和 C++ 标准中看到的内容。
【讨论】:
这是您在此处看到的 backus naur form 语法的变体。虽然不完全是标准格式,但它非常相似。这通常是显示应该如何解析语言的标准方式,也是解析器生成器的常见输入。
【讨论】:
C++ 标准不是免费提供的。您可以在 webstore.ansi.org 上以 30 美元的价格购买一份副本。搜索文档编号 14882,然后查找 C++ 标准。
【讨论】:
描述语法的常用方法是使用Backus-Naur Form (BNF) 或Extended Backus-Naur Form (EBNF)。如果您希望在 C# 中轻松解析语言,请查看 Irony,它是 C# 的语言工具包,它允许您使用与 EBNF 非常相似的东西来描述语法。
除了这些语法之外,还有Parsing Expression Grammar (PEG),但我认为它不像 BNF 或 EBNF 那样普遍。
【讨论】: