Как написать ANTLR грамматический переводчик для возврата java класса с методами? - PullRequest
0 голосов
/ 12 марта 2020

Я пытаюсь написать грамматику ANTLR, которая выводит метод java. т.е. я написал грамматику для следующей формулы:

expr("L") + expr("R")

Я хочу, чтобы мой переводчик грамматики возвращал класс java с методом ниже после перевода, как показано ниже:

public class FormulaExecutor(){

    public Double formula1234(FormulaAPI apiReference) {
        return apiReference.evaluateResult("L") + apiReference.evaluateResult("R") ;
    }
}

т.е. перевод expr("L") должен сгенерировать строку apiReference.evaluateResult("L"), а expr("R") должен сгенерировать apiReference.evaluateResult("R"), а вывод должен быть похож на класс с исполняемым методом, как указано выше.

Как этого добиться во время перевода? Я видел транслятор, возвращающий двойное значение или строковое значение, но не такой, как транслятор, возвращающий сам класс с исполняемым методом.

Идея состоит в том, что этот класс, который возвращает транслятор, будет скомпилирован в байт-код, который будет использоваться программа, которая его использует.

Дополнительная информация: класс FormulaAPI, указанный в приведенном выше коде, выглядит следующим образом. Этот класс будет определен уже за пределами грамматики.

public class FormulaAPI(){

     public Double evaluateResult(String input){
        Double d = <value obtained from DB based on input string>;
        return d;
     }
}

1 Ответ

0 голосов
/ 12 марта 2020

Звучит так, как будто вы хотите использовать какую-то грамматику выражения (есть много примеров в сети) и генерировать:

1) начало объявления класса:

public class FormulaExecutor{

    public Double formula1234(FormulaAPI apiReference) {
        return 

2 ) переведенное выражение

3) конец объявления класса:

;
    }
}

переведенное выражение идентично входному выражению, за исключением expr(<subexpression>), который будет переведен в apiReference.evaluateResult(<subexpression>).

...