【问题标题】:Is there a way to use one ANTLR grammar that targets multiple languages?有没有办法使用一种针对多种语言的 ANTLR 语法?
【发布时间】:2013-01-30 12:58:02
【问题描述】:

我正在使用自定义语言的 ANTLR 语法在 Visual Studio 中开发语言服务。但是,语法中充满了 C++ 代码来处理预处理器指令和编译器的效率原因。

Visual Studio 的语言服务很难用 C++ 编写,因此我需要一个用于相同语言的 C# 解析器。这意味着我必须设置 language=CSharp2 并从语法中删除所有 C++ 代码。

我正在考虑编写一个小导出器,从语法中剥离所有 C++ 代码,并将像 { $channel = HIDDEN; } 这样的简单语句转换为 { $channel = TokenChannels.Hidden; }

有没有更聪明的方法来做到这一点?比如通过模板,或者在语法中嵌入两种语言的小技巧?

【问题讨论】:

  • 您不能将 C++ 视为托管 C++ 吗?这应该与它周围的 C# 世界兼容。
  • ANTLR 必须为语义表达定义它自己的抽象编程语言,但它没有。我选择对一个正在进行的项目做的是针对 Python,我可以直接使用它,或者使用 Jython(已测试)在 Java 中使用,或使用 Cython 的任何其他语言。

标签: antlr


【解决方案1】:

我会使用 AST 将问题分为两个阶段。让您的解析器采用目标语言中性语法(生成 AST),并使用 Antlr 工具的 -target 选项以您选择的目标语言(C++、C#、Java 等)生成解析器。

然后使用您的操作以目标语言实现 AST walkers。这样做的好处是,一旦您完成了一个 AST walker,您就可以复制它并更改另一种目标语言的操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多