【问题标题】:Using Roslyn for a new language implementation使用 Roslyn 实现新的语言
【发布时间】:2016-01-13 20:13:35
【问题描述】:

我正在探索如何为 .NET 平台实现通用/DSL 语言。据我所见,有几种工具可以使语言实现(解析源代码)相对容易。 IronyYaccANTLR……这些项目的问题是有些没有发展,有些生成缓慢的解析器,有些无法在 .NET 上运行Core CLR 等。总是有一些障碍将我推向“编写自己的解析器”的解决方案。

所以我想知道...... 是否有可能编写我自己的解析器并将其与 Roslyn 连接/集成? 是否有任何书籍、教程或示例如何做到这一点?

【问题讨论】:

  • 当然,您可以编写自己的代码并使用结果调用 Roslyn 元素。您会发现您必须针对您的语言做很多工作(Rosyln 不会),并且与 Roslyn 集成可能相当于构建一个从您的语言到 Roslyn 提供的任何中间形式的翻译器(AST、MSIL、 ...)。请参阅stackoverflow.com/a/3460977/120163 了解如何进行此操作的详细讨论,尤其是关于解析后的生活

标签: .net parsing roslyn


【解决方案1】:

Roslyn 不是为此而生的。

使用 Roslyn 能做的最好的事情是在手动解析语言后生成 C#(或 VB)语法树和编译,让 Roslyn 处理类型系统和代码生成。

只有当您的语言可以完全翻译成 C#(或 VB)语法时,这才有效。

【讨论】:

  • "only (if)...can be fully translate to C#" 这个注释假装的意思是有些语言不能翻译成 C# 什么是谬误(作者不能指出这样的语言)...参见 Church-Turing 论文。
  • @RomanPokrovskij:如果您的语言与 C# 过于不同(例如,更强大的类型系统),Roslyn 不会帮助您。您实际上是在编写一个将 C# 视为程序集的编译器。这仅在您可以进行句法级转换时才有用。
  • @RomanPokrovskij 谬论是你的。如果目标是在 C# 中计算可以用所选语言计算的任何函数,则 CT 论文将适用,但这与 translating 所选语言转换为 C# 的目标非常不同。如果我们只关心计算函数,那么我们根本不会关心 Roslyn 或 C#。例如,假设您的语言允许覆盖访问修饰符,或者在返回类型上有函数重载。您将无法将其转换为 C#。用 C# 为您的语言编写解释器不是“翻译”。
  • 每个人都可以编写一种“允许覆盖访问修饰符”的语言,当保存“原始信息”以供引用时,在编译级别进行检查 - 使用属性。关于“返回类型重载”也是如此 - 使用“花哨名称”编码名称,就像通用函数一样,向属性添加附加信息。
  • @RomanPokrovskij:不; CLR 也不允许这样做,因此您必须从头开始编写所有内容,此时 Roslyn 将毫无用处。
【解决方案2】:

罗斯林不允许这样做。

看看这个项目:Nitra。 它正在积极开发中。

【讨论】:

  • 还有一些上下文:Roslyn 有意无意成为构建编译器的通用框架。虽然那会很酷,但我们还必须,嗯,实际运送一些东西。 :-)
  • @JasonMalinowski 未来“非目标”可能会改变吗?有讨论的地方吗?
  • 要为语言构建新的编译器,这仍然不是目标。
  • @JasonMalinowski 我可以使用 Roslyn 解析 c# 代码并以不同的语言(例如 Java)发出一些代码吗?我想这应该无论如何都可以遍历语法树,但是 roslyn 是否为自己提供了一些工具来插入一些自定义代码生成?
  • 看起来“今天”不那么活跃;最新的更新是 2 年前在此回复时。
【解决方案3】:

我知道这是一个旧线程,但您最好的选择(至少在 Visual Studio 中)是创建一个 IVsSingleFileGenerator,将您的代码转换为 c# 或其他 Roslyn 语言。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-08
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多