Простая библиотека разбора рекурсивного спуска Java с заполнителями - PullRequest
3 голосов
/ 20 октября 2011

Для приложения я хочу проанализировать строку с арифметическими выражениями и переменными. Просто представьте эту строку:

((A + B) * C) / (D - (E * F))

Итак, у меня есть заполнители, а не целые / двойные значения. Я ищу библиотеку, которая позволяет мне получить первый заполнитель, поместить (например, с помощью запроса к базе данных) значение в заполнитель и перейти к следующему заполнителю.

Итак, по сути, я хочу, чтобы пользователи могли писать строки на своем доменном языке, не зная фактических значений переменных. Таким образом, приложение будет предоставлять числовые значения в зависимости от некоторой «контекстной логики» и выводить результат вычисления.

Я гуглил и не нашел подходящей библиотеки. Я нашел ANTLR, но я думаю, что это будет очень "тяжеловесно" для моего варианта использования. Есть предложения?

Ответы [ 2 ]

2 голосов
/ 20 октября 2011

Вы правы, что ANTLR - это немного перебор. Однако анализ арифметических выражений в инфиксной нотации не так сложен, см .:

Также вам следует рассмотреть возможность использования некоторых языков сценариев, таких как Groovy или JRuby. Также JDK 6 и выше обеспечивает встроенную поддержку JavaScript. Смотрите мой ответ здесь: Создание метаязыка с Java .

0 голосов
/ 20 октября 2011

Если все, что вы хотите сделать, это простые выражения, и вы заранее знаете грамматику для этих выражений, вам даже не нужна библиотека; Вы можете написать это тривиально на чистом Java.

Смотрите этот ответ для подробной версии как: Есть ли альтернатива flex / bison, которую можно использовать в 8-битных встроенных системах?

Если пользователи определяют свой собственный язык выражений, если он всегда находится в форме нескольких монадических или двоичных операторов, и они могут указывать приоритет, вы можете изменить приведенный выше ответ, задав параметризацию парсер со списком операторов на нескольких уровнях приоритета.

Если язык может быть более сложным, вы можете изучить метакомпиляторы .

...