我该在哪里找到C# 3.0语法?

27

我打算用C#编写C# 3.0编译器。我在哪里可以获取用于解析生成的语法?

最好是一个可以与ANTLR v3无需修改就能使用的语法。


6
你知道我们已经免费提供一个编译器来编译C# 3了,对吧? :-) 但说真的,你为什么要自己建一个呢?只是出于乐趣,还是有商业目的? (我问这个问题是因为我们非常想了解人们希望从我们的编译器中获得哪些“服务”,除了简单地“给我输出一些这个源代码的IL代码”之外。) - Eric Lippert
1
Eric: 主要是为了好玩。然而,我偶尔会想出一些语言的想法,希望能够测试一下。 - Mehrdad Afshari
2
@Mehrdad:“……语言想法”相当模糊。如果你想用C#(或任何其他语言)做任何有趣的事情,你不仅需要一个解析器(因此需要语法),还需要构建树、构建符号表、分析符号使用等等。这比语法要复杂得多。Mono框架可能比你想象的更有帮助。 - Ira Baxter
1
Ira:当然,我看过那个问题。我明确提到了C# 3.0,因为我发现有很多关于1.0的东西。顺便说一下,对我来说,编写自己的代码并使用它来测试我的东西比尝试理解Mono团队编写的代码结构更有趣,所以我说“主要是为了好玩”。 - Mehrdad Afshari
@Mehrdad:我已经建立了一些操作语言的工具。它们需要比你想象的更多的工作。你正在犯一个我认为是“如果我只有一个解析器……”的经典错误。祝你好运。 - Ira Baxter
显示剩余6条评论
4个回答

12

请查看C# 语言规范。在B. 语法章节中,您可以找到语法。


当然,规范包含语法。但是,那个Word文档中的语法分散在整个文档中,不适合用于解析器生成。 - Mehrdad Afshari
8
不仅仅是分散的,我们在最后附录中整合了所有内容。你可能是对的,为了让它适用于解析器生成器,需要进行一些修改。 - Eric Lippert
1
Eric:哦,没有注意到那个部分。谢谢指出。 - Mehrdad Afshari
1
迈克尔:它不到40页。当我考虑这个问题时,重新开始处理是可能的。+1 - Mehrdad Afshari

7
我发现了CodePlex上的ANTLR C#语法。这是一个相对较新的项目,使用ANTLR 3.2。它声称支持C# 4.0,并在Eclipse Public License(EPL)下获得许可。
我稍微试用了一下。它有一堆包含表达式的测试文件。它支持Lambda、不安全上下文等,正如您所期望的那样。它解析C#文件并提供一个抽象语法树。您可以随心所欲地使用它。

3

1
关联的语法不是 C# 3.0 的。它不支持 Lambda 表达式。这对我来说特别重要。 - Mehrdad Afshari
2
似乎在语法中添加对lambda的支持是相当简单的,因为你只需要定义参数列表。然而,这可能需要LL(),因为你可以解析类似(a**这样的东西,但不知道它最终会成为像(a**b)这样的表达式(即将a乘以b的解除引用结果),还是一个lambda表达式(a** b) =>,直到你遇到=>。由于间接引用的数量没有限制(指向指针的指针...),所以我认为它是LL()。但由于ANTLR3支持选择性的LL(*),所以这不是问题。 - Pavel Minaev
@Pavel:不仅如此,它还不支持泛型。如果我找不到一个相当不错的C# 3.0语法,我可能会从头开始编写自己的解析器或语法。 - Mehrdad Afshari

3

看一下 COCO/R,似乎他们有 C# 3.0 的语言规范。


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