Ввод простого языка выражений в Java - PullRequest
5 голосов
/ 09 июня 2011

Я являюсь моим Java-приложением, пользователи могут указать, как называть свои файлы из ряда полей метаданных. то есть

%artist% - %album% - %disctotal%

Мой код затем анализирует эти поля и переименовывает файл соответствующим образом. Но я хочу, чтобы пользователь мог использовать «язык выражения», чтобы он мог сказать что-то вроде:

$if(%disctotal% >= 01,%discno%) 

Используйте ifelse, сравните длину и регистр и т. Д.

Я не хочу писать это с нуля, есть что-то, что предлагает мне это, что я могу просто подключить к своему коду?

РЕДАКТИРОВАТЬ: Я думаю, что у меня были некоторые хорошие ответы, но мои знания подводят меня. Позволяет упростить проблему. Я хочу, чтобы пользователь мог писать

$ if (% disctotal%> = 01,% discno%)

в поле в графическом интерфейсе.

Затем в моем Java-коде я хочу иметь возможность применять это выражение к набору файлов, поэтому для каждого файла у меня есть значение disctotal и discno, но я хочу иметь возможность преобразовать выражение в нечто как

if (discTotal> = 1) { возврат дискаНет } еще { вернуть "" }

Что я не хочу делать, так это писать код, который распознает строку (" $ if (% disctotal%> = 01,% discno%) "является оператором if, потому что это неудобно.

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

В качестве альтернативы: возможно, это должно работать следующим образом: пользователь вводит выражение, затем позднее для каждого файла код Java заменяет каждую переменную реальным значением

т.е. $ if (% disctotal%> = 01,% discno%) -> $ if (2> = 01,1)

затем это передается на язык exopression для анализа и выдачи результата,

Это идея Javascript?

Ответы [ 4 ]

8 голосов
/ 09 июня 2011

Как насчет использования движка JavaScript, который поставляется в комплекте с Java 1.6 ?

Вы можете видеть, как вы будете передавать все параметры:

ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
engine.put("artist", artist);
...

Вы бы прочитали значение, используя

ScriptEngine.get(...)

Последний кусочек клея - окружить выражение пользователя объявлением функции и написать выражение, которое вызывает функцию и присваивает результат общеизвестной переменной.

Итак, чтобы начать экспериментировать, давайте иметь функцию для проверки выражений:

private static void printResult(final ScriptEngine jsEngine, String name, String expr) throws ScriptException {
    Object result = jsEngine.eval(expr);
    System.out.println(name + " result: " + result + "; expr: " + expr);
}

Теперь давайте назовем это:

public static void main(String[] args) throws Exception {
    ScriptEngineManager sem = new ScriptEngineManager();
    ScriptEngine jsEngine = sem.getEngineByName("JavaScript");
    printResult(jsEngine, "Hello World", "'Hello World'");
    printResult(jsEngine, "Simple Math", "123 + 456");
}

Это производит:

Hello World result: Hello World; expr: 'Hello World'
Simple Math result: 579.0; expr: 123 + 456

Теперь давайте попробуем использовать ваш вариант использования:

public static void main(String[] args) throws Exception {
    ScriptEngineManager sem = new ScriptEngineManager();
    ScriptEngine jsEngine = sem.getEngineByName("JavaScript");

    String expr = "artist + '-' + album + (disktotal > 1 ? ('-D' + diskno) : '')";

    jsEngine.put("artist", "U2");
    jsEngine.put("album", "The Joshua Tree");
    jsEngine.put("disktotal", 1);
    jsEngine.put("diskno", 1);
    printResult(jsEngine, "Single Disk", expr);

    jsEngine.put("artist", "Tori Amos");
    jsEngine.put("album", "To Venus and Back");
    jsEngine.put("disktotal", 2);
    jsEngine.put("diskno", 2);
    printResult(jsEngine, "Muti-Disk", expr);
}

Производит результат:

Single Disk result: U2-The Joshua Tree; expr: ...
Muti-Disk result: Tori Amos-To Venus and Back-D2; expr: ...

Обратите внимание, что у Tori в конце есть 'D2'.

2 голосов
/ 09 июня 2011

Я бы посмотрел на FreeMarker .Это шаблонный движок.Вы можете передать свою строку с помощью конструкций el во Freemarker и передать ей объекты, которые хотите связать с вашей строкой, и она вернет вам строку.

0 голосов
/ 09 июня 2011

Полагаю, вы ищете шаблонизатор

0 голосов
/ 09 июня 2011

Один из вариантов - использовать генератор парсера.

ANTLR является одним из таких инструментов для Java.Если вы новичок в создании грамматик, вы найдете грамматику IDE ANTLRWorks полезной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...