什么是一个好的C#编译器-编译器/解析器生成器?

24
我正在寻找一个解析器生成器,它可以根据LL(k)语言的EBNF为我提供C#解析器,并生成在EBNF中定义的类型的类。
7个回答

25

ANTLR (无需多言)


20
好的,你需要说些什么才能达到15个字符。+1 - kenny
2
我认为ANTLR在给出适当的错误消息方面存在真正的问题,祝你好运找出例如该放置@inlude规范的地方!文档令人困惑,从未显示首选的操作方式。树形语法是浪费时间的...ANTLR网站甚至有一个巨大的博客条目来解释这一点。 - Carlo V. Dango
2
嗯,看起来 http://www.antlr.org/wiki/display/ANTLR3/Antlr+3+CSharp+Target 最后更新于三年前并且所有代码块都已经丢失 - 等等,不对,这只是JavaScript禁用时会发生的情况。无论如何,C#一直是一个二等公民的ANTLR目标。当我第一次使用它时,C#运行时源代码是不可用的:作者(与ANTLR的作者不同)发布了没有指定许可证的二进制文件,并从地球上消失了。我使用Reflector重建了源代码。 - Qwertie

8

Gold 作为一个解析器生成器还是不错的。


3
OP 请求使用 LL(k)。Gold 是 LALR。 - Ira Baxter
如果我没说错的话:无 LL 文法是 LALR 文法的子集吗? - Thanasis Ioannidis
1
@Saysmaster:不是这样的。维基百科上说:“LALR(k)解析器与LL(k)解析器无法比较——对于任何大于0的j和k,都存在LALR(j)文法不是LL(k)文法,反之亦然。事实上,对于任何k >= 0,判断一个给定的LL(1)文法是否为LALR(k)文法是不可判定的。” - Qwertie
@Qwertie 谢谢你的信息。 - Thanasis Ioannidis
虽然有一个能够生成完整解析器代码并避免我们依赖其他文件的黄金引擎(例如C#)会很不错。 - BitTickler

5
有一款名为LLLPG的新解析器生成器,支持LL(k)文法和零宽断言。运行时库是可选的(一个基类就足够了)。文档现在相当详细,我已经使用LLLPG来解析了大部分名为Enhanced C#的C#语言方言(实际上,这是LLLPG的主要输入语言)。但输入语法不是EBNF格式,而是一种C#和ANTLR风格代码混合的格式。

完整披露:这是我写的。欢迎提问。

编辑:“C#解析器生成器”在谷歌搜索中排名最高的结果是由一位名叫“Tomassetti”的人撰写的,他声称我的解析器生成器“不能真正地独立使用”,这就像说一台电脑“不能真正作为独立的游戏主机使用”,因为它还可以进行网络浏览和制作电子表格。确实,在安装Visual Studio扩展后,您必须单独到NuGet获取运行时库(Loyc.Syntax),但我不认为这就是他的意思,也不认为他真正尝试过使用它。LLLPG的设计是一种特性,而不是一个错误。我只能说,请尝试一下,并让我知道您的想法。


4
你可能需要查看 MinosseCC,它是 JavaCC 到 C# 的移植版本。另一个选择是 Spart

1
MinosseCC已更名为CSharpCC。 当前版本在Google Code空间上,它是JavaCC 3.2的端口,而开发版本(JavaCC 5.0的端口)正在GitHub上开发中(http://github.com/deveel/csharpcc)。 - Antonello
Spart太糟糕了,你无法从表达式中获取AST。相反,你必须订阅Act事件,它只返回作为字符串匹配的文本。这使得它几乎没有用处。它应该是Spirit(用于C ++)的一个端口,但在实践中,由于它不支持Spirit的此功能,因此它是无用的。(即使对于简单的示例,文档也是不正确的) - TamaMcGlinn

4

2

1

Coco/R(来自SSW - "约翰内斯·开普勒"林茨大学)

,这是与IT相关的内容。

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