Как бороться с типом в парсере Java? - PullRequest
0 голосов
/ 26 января 2019

Я изучаю antlr4 и пытаюсь создать простой DSL (предметно-ориентированный язык), поскольку бэкэнд моего приложения разработан на Java, цель состоит в том, чтобы проанализировать DSL и запустить с бэкэндом Java.Мой DSL является упрощенной версией Java и выглядит следующим образом:

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());

Они не будут работать, так как генерики являются компиляцией, а TypeA можно определить только во время выполнения, даже если я использую Object какуниверсальный тип TI все еще должен приводить значение к TypeA в какой-то момент, каков правильный способ справиться с этим в целом?

1 Ответ

0 голосов
/ 26 января 2019

Это нетривиальная задача, если вы хотите разрешить произвольные типы.Вам нужна система типов , которая отвечает за обработку каждого возможного типа в вашем DSL.Вы не можете использовать для этого дженерики (как вы уже узнали), но должны предоставить классы в вашей системе типов, которые позволяют использовать определенный тип в выражениях.Они проверят достоверность типов (имя, домен значений) и выполнят возможные операции, неявные / явные преобразования в другие типы и т. Д.

...