代码之家  ›  专栏  ›  技术社区  ›  Yulin

如何处理Java解析器中的类型?

  •  1
  • Yulin  · 技术社区  · 6 年前

    我正在学习ANTLR4,并尝试构建一个简单的DSL(特定于领域的语言),因为我的应用程序的后端是用Java开发的,目的是解析DSL并用Java后端运行。我的DSL是Java和GOSE这样的简化版本:

    typeA a = expression;
    

    语法和词法是基于 this . 这就像用Java实现Java一样。现在我遇到的问题是分析如下语句 typeA a = expression; 变量的类型 a 仅在运行时已知,可以是任何类型,在解析实现中,我使用类来表示变量、表达式和变量值:

    Variable{
      String identifier;
      int scopeId;
      //...
    }
    Value<T>{
      Exprssion<T> expression
      T get(){return expression.evaluate()}
      //...
    }
    Exprssion<T>{
      T evaluate(){return ...}
      //...
    }
    

    在解析器中我需要这样的东西

    new Expression<TypeA>(); 
    new Value<TypeA>(); 
    //to represent a assignment: 
    Value<TypeA> va; ... va.set(vb.get());
    

    这些将不起作用,因为泛型是编译的东西,类型a只能在运行时确定,即使我使用对象作为泛型类型t,我仍然需要在某个时刻将值强制转换为类型a,一般来说,处理这个问题的正确方法是什么?

    1 回复  |  直到 6 年前
        1
  •  4
  •   Mike Lischke    6 年前

    如果您想允许任意类型,这是一项非常重要的任务。你需要的是 Type System ,负责处理DSL中的每种可能类型。不能使用泛型(正如您已经发现的那样),但必须在类型系统中提供允许在表达式中使用特定类型的类。它们将检查类型(名称、值域)的有效性,并执行可能的操作、隐式/显式转换到其他类型等。