【问题标题】:Setup ANTLR 4 grammar to handle Java and C# environments设置 ANTLR 4 语法来处理 Java 和 C# 环境
【发布时间】:2015-03-27 16:10:39
【问题描述】:

我在 C# 和 Java 环境中都使用 ANTLR 4 拆分语法,除非我将函数 NotifyErrorListeners 更改为使用驼峰式 notifyErrorListeners,否则我无法编译这两种语言的语法。

C# 示例:

statement       
:   expression SEMICOLON
|   { NotifyErrorListeners("; expected."); } expression // They forgot the semicolon.

Java 示例:

statement       
:   expression SEMICOLON
|   { notifyErrorListeners("; expected."); } expression // They forgot the semicolon.

我的 C# ANTLR 环境是通过 Nuget 提取的:Antlr4 4.2.2-alpha001

我的 Java ANTLR 环境是从 antlr.org 下载的:antlr-4.5-complete.jar

有没有一种方法可以修改我的语法,以便在切换语言时不必修改它?有没有更好的功能可以促进这两种环境?

【问题讨论】:

  • C# 有一个预处理器——可以在这里使用吗? (我从未在 C# 中见过 antlr,所以请原谅我的无知。)
  • 我可以使用 C# 预处理器,但是根据我对 java 的有限经验,我找不到一种使它与两者兼容的方法。目标是在不改变语法本身的情况下使语法在两种环境中都能编译。
  • 要编译 C#,如果语法是为适合 Java 编写的,则需要 #define NotifyErrorListeners notifyErrorListeners
  • 据我所知,C# 无法使用#define 定义宏。它仅限于定义诸如 DEBUG 之类的标记,以便在 #if 块中使用。我错过了重点吗?
  • 没有。我只是认为这可能是可能的。 - 使用 C 预处理器可能是一种选择。 - 但是将静态方法定义为包装器呢?如果它不在 Java 中使用,它不会受到伤害。 - 最后:为什么你需要这两种语言? Java 应该在 C# 所在的地方可用。

标签: java c# antlr grammar


【解决方案1】:

我已经解决了我的问题。在 C# 项目中为 Parser 创建一个分部类,并确保它位于相同的程序集和命名空间中。然后很容易添加一个使用 Java 所期望的驼峰式套管的方法。现在我可以在不修改语法的情况下使用这两种环境。

public partial class ScriptParser
{
    public void notifyErrorListeners(string message)
    {
        this.NotifyErrorListeners(message);
    }
}

感谢 laune 提出的问题和建议。你把我推向正确的答案。

【讨论】:

    猜你喜欢
    • 2010-09-09
    • 2015-06-01
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    相关资源
    最近更新 更多