【发布时间】:2013-06-12 22:59:04
【问题描述】:
我有一种特定领域的语言,我想通过添加新关键字(或一些类似关键字的语法)与 C# 进行交互。使用属性是不够的(我不能在方法体中使用它们),并且将它硬塞进“有效”的 C# 符号中,然后编译成其他东西会很丑陋,并破坏与 DSL 的类比(以及类似 DSL 的翻译) C# 的符号很重要,所以每次只写 C# 是不可能的)。
我已经有办法解析 .cs 文件并将其转换为合法的、重要的、可以编译的 C# 代码。
问题是,即使我可以完成定义 DSL、解析它并将其翻译成有效 C# 的所有工作,Visual Studio 也不会让我使用它不理解的符号;它只是添加了红色曲线,发出错误“无法解析符号”,然后经常无法正确解析之后的内容。
有没有办法强制 Visual Studio 在其分析中忽略特定字符串?我看过visual studio插件,但看起来,虽然我可以做语法高亮和其他东西,但我不能强迫它忽略它不知道如何解析的东西(除非我错过了一些方法在扩展 API 中,这当然是可能的)。
我已经浏览了 Roslyn 的东西,也没有看到一种临时的方法来做到这一点。 (同样,可能遗漏了一些东西,它似乎没有很好的文档。)
【问题讨论】:
-
您不能强迫 VS 理解您的 C# 语法,因为它不是有效的 C# 语法。它是您的 DSL,而不是 C#。您可以更改文件的扩展名以使 VS 相信它不是 C# 文件,并为该新语言定义语法高亮插件。
-
我不希望它理解语法——我有一个可以理解它的预构建过程。我希望它忽略语法。
-
更改扩展名应该可以解决问题:VS 将忽略文件的语法,将其视为文本。
-
我不希望它被视为文本,我希望它被视为有效的 C#,因为除了对 DSL 的一些引用之外,它是有效的 C#...
-
这是我的观点:你不能让 VS 将你的代码视为有效的 C#,除非它是纯的、100% 有效的 C#。 “几乎有效”是“无效”的同义词——简单明了。当然,有一些方法可以使它有效——例如,将你的 DSL 伪装成解析器可以理解的某种特殊格式的 cmets。在这种情况下,您的语言将再次成为有效的 C#,并且 VS 不会抱怨。
标签: c# visual-studio code-generation metalanguage