У меня есть относительно простой DSL, который я хотел бы обрабатывать более надежно, чем набор java.util.regex.Pattern
операторов + логика синтаксического анализа, кодированных вручную.
Наиболее цитируемым инструментом, по-видимому, является ANTLR.Я не знаком с этим и готов попробовать.Однако, когда я смотрю на примеры, мне становится немного подозрительнее (например, пример оценщика выражений ANTLR или HelloAntlr Мартина Фаулера или этого другого Q для stackoverflow ),Причина этого заключается в том, что файлы грамматики выглядят так, как будто они являются мешаниной определений грамматики, вкрапленных фрагментами языка реализации (например, 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 (например, мой продукт/ Сумма / Срок занятий).Я хочу минимизировать количество времени / опыта, которое я должен потратить на изучение синтаксиса ANTLR, причуд и API.Я не знаю, как создавать и управлять AST из грамматики ANTLR.Поскольку это лишь небольшая часть большого Java-проекта, не только я, но и кто-то в моей команде должен проверять или поддерживать мой код.
(я не хочу показаться дерзким: я 'Я готов потратить время и силы на использование инструмента, но только если инструмент становится полезным инструментом и не становится камнем преткновения.)