У меня есть относительно простой DSL, который я бы хотел обработать более надежно, чем пучок закодированных вручную java.util.regex.Pattern
операторов + логика синтаксического анализа.
Наиболее цитируемый инструмент, похоже, ANTLR. Я не знаком с этим и готов попробовать. Однако, когда я смотрю на примеры (например, ANTLR пример оценщика выражений, или, например, Martin Fowler HelloAntlr, или qaru.site/info/6362/...). Причиной этого является то, что файлы грамматики кажутся похожими на то, что они являются мешаниной определений грамматики, чередующихся с фрагментами языка реализации (например, Java), которые являются императивными по своей природе.
То, что я бы предпочел, состоит в том, чтобы отделить часть императива/оценки парсера. Есть ли способ использовать ANTLR (или какой-либо другой инструмент) для определения грамматики и создания набора исходных файлов Java, чтобы он компилировался в классы, которые я могу использовать для синтаксического анализа ввода в структуру без влияния на эту структуру?
например, если бы я хотел использовать оценку выражения только с операторами +
и *
и ()
, и у меня был вход
3 * (4 + 7 * 6) * (3 + 7 * (4 + 2))
то то, что я хотел бы сделать, это написать грамматику, чтобы преобразовать ее в иерархическую структуру типа
Product
Term(3)
Sum
Term(4)
Product
Term(7)
Term(6)
Sum
Term(3)
Product
Term(7)
Sum
Term(4)
Term(2)
где я могу использовать такие классы, как
interface Expression<T> {
public T evaluate();
}
class Term implements Expression<Double> {
final private double value;
@Override public Double evaluate() { return value; }
}
class Product implements Expression<Double> {
final private List<Expression<Double>> terms;
@Override public Double evaluate() {
double result = 1;
for (Expression<Double> ex : terms)
result *= ex.evaluate();
return result;
}
}
class Sum implements Expression<Double> {
final private List<Expression<Double>> terms;
@Override public Double evaluate() {
double result = 0;
for (Expression<Double> ex : terms)
result += ex.evaluate();
return result;
}
}
и использовать ANTLR для построения структуры. Есть ли способ сделать это? Я бы предпочел продолжить этот подход, поскольку он позволяет мне (и другим разработчикам программного обеспечения) редактировать и визуализировать полные классы Java, не имея при этом, чтобы эти классы были фрагментированы в странные фрагменты в файлах грамматики ANTLR.
Есть ли способ сделать это?
пояснение:. Я хочу как можно больше использовать мои усилия двумя способами: определение самой грамматики и независимой от ANTLR Java (например, моих классов Product/Sum/Term). Я хочу свести к минимуму время/опыт, которые я должен потратить на изучение синтаксиса ANTLR, quirks и API. Я не знаю, как создавать и управлять АСТ из грамматики ANTLR. Поскольку это всего лишь небольшая часть большого Java-проекта, это не только я, это кто-то из моей команды, который должен проверить или поддерживать мой код.
(Я не хочу звучать неловко: я готов вложить время и энергию в использование инструмента, но только если инструмент станет полезным инструментом и не станет становиться камнем преткновения).