Самым цитируемым инструментом, по-видимому, является ANTLR. Я с этим не знаком и готов попробовать. Однако я становлюсь немного настороженным, когда смотрю на примеры (например, пример оценщика выражений ANTLR, или HelloAntlr Мартина Фаулера, или этот другой вопрос в stackoverflow). Причина этого в том, что файлы грамматики кажутся смесью определений грамматики, перемежающихся фрагментами языка реализации (например, Java), которые являются императивными по своей природе.
Что я действительно предпочел бы, так это выделить императивную/оценочную часть парсера. Есть ли способ использовать ANTLR (или какой-либо другой инструмент) для определения грамматики и создания набора исходных файлов Java, чтобы он компилировался в классы, которые я могу использовать для анализа входных данных в структуру без воздействия на эту структуру? /p>
например, если бы я хотел использовать оценку выражения только с операторами + и * и (), и у меня было бы ввод
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 {
public T evaluate();
}
class Term implements Expression {
final private double value;
@Override public Double evaluate() { return value; }
}
class Product implements Expression {
final private List terms;
@Override public Double evaluate() {
double result = 1;
for (Expression ex : terms)
result *= ex.evaluate();
return result;
}
}
class Sum implements Expression {
final private List terms;
@Override public Double evaluate() {
double result = 0;
for (Expression ex : terms)
result += ex.evaluate();
return result;
}
}
Есть ли способ сделать это?
уточнение: Я хочу потратить как можно больше усилий на два пути: определение грамматики сам по себе, а также в независимой от ANTLR Java (например, мои классы Product/Sum/Term). Я хочу свести к минимуму количество времени и опыта, которые мне придется потратить на изучение синтаксиса, особенностей и API ANTLR. Я не знаю, как создавать AST из грамматики ANTLR и манипулировать ими. Поскольку это лишь небольшая часть большого Java-проекта, проверять или поддерживать мой код должен не только я, но и любой член моей команды.
(Я не Не хочу показаться дерзким: я готов потратить время и энергию на использование инструмента, но только в том случае, если инструмент станет полезным инструментом и не будет продолжать становиться камнем преткновения.)
Подробнее здесь: https://stackoverflow.com/questions/390 ... evaluation