ANTLR (или альтернатива): отделение синтаксического анализа от оценкиJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 ANTLR (или альтернатива): отделение синтаксического анализа от оценки

Сообщение Anonymous »

У меня есть относительно простой DSL, с которым я хотел бы работать более надежно, чем с кучей написанных вручную операторов java.util.regex.Pattern + логики синтаксического анализа.

Самым цитируемым инструментом, по-видимому, является 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 без необходимости фрагментации этих классов на странные фрагменты в файлах грамматики ANTLR.

Есть ли способ сделать это?



уточнение: Я хочу потратить как можно больше усилий на два пути: определение грамматики сам по себе, а также в независимой от ANTLR Java (например, мои классы Product/Sum/Term). Я хочу свести к минимуму количество времени и опыта, которые мне придется потратить на изучение синтаксиса, особенностей и API ANTLR. Я не знаю, как создавать AST из грамматики ANTLR и манипулировать ими. Поскольку это лишь небольшая часть большого Java-проекта, проверять или поддерживать мой код должен не только я, но и любой член моей команды.

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

Подробнее здесь: https://stackoverflow.com/questions/390 ... evaluation
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Преобразование грамматики Antlr 4 в Antlr 3.5
    Anonymous » » в форуме Php
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Отделение пустых папок от папок, содержащих только другие папки
    Anonymous » » в форуме Python
    0 Ответы
    69 Просмотры
    Последнее сообщение Anonymous
  • Отделение ввода игрового цикла от симуляции
    Anonymous » » в форуме C++
    0 Ответы
    37 Просмотры
    Последнее сообщение Anonymous
  • Отделение верхнего и нижнего колонтитула от index.html
    Anonymous » » в форуме CSS
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Обработка изображения: Отделение руки от лица
    Anonymous » » в форуме Python
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»