Кодирование парсера для языка, специфичного для домена, на Java

Мы хотим создать простой язык для конкретного языка для написания тестовых скриптов для автоматической проверки интерфейса на основе XML одного из наших приложений. Пример теста:

  • Получить входной XML файл из общей сетевой папки или хранилища подрывных средств
  • Импортировать XML файл с помощью интерфейса
  • Проверьте, успешно ли было получено сообщение о результатах импорта
  • Экспортировать XML, соответствующий объекту, который был только что импортирован с помощью интерфейса, и проверить, правильно ли он.

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

newObject = GET FILE "http://svn/repos/template1.xml"
reponseMessage = IMPORT newObject
newObjectID = GET PROPERTY '/object/id/' FROM responseMessage
(..)

Но тогда я не уверен, как реализовать простой парсер для этого языка в Java. Еще в школе, 10 лет назад, я закодировал парсер языка, используя Lex и Yacc для языка C. Может быть, подход должен был бы использовать некоторый эквивалент для Java?

Или я могу отказаться от идеи иметь декларативный язык и вместо этого выбрать язык на основе XML, который, возможно, будет проще создать парсер? Какой подход вы бы порекомендовали?

Ответ 1

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

Ответ 2

Взгляните на Xtext - он примет определение грамматики и сгенерирует синтаксический анализатор, а также полнофункциональный заголовок редактора затмения с подсветкой синтаксиса и -четкой.

Ответ 3

ANTLR должно быть достаточно

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

Ответ 4

Посмотрите на библиотеку Antlr. Вам нужно будет использовать EBNF grammatic для описания вашего языка, а затем использовать Antlr для создания классов java из вашей грамматики.

Ответ 5

Посмотрите, как Cucumber определяет свои тесты:

alt text
(источник: cukes.info)

http://cukes.info/ - можно запустить в JRuby.

Ответ 6

Или я мог отказаться от идеи иметь декларативный язык и вместо этого выберите язык на основе XML, что, возможно, было бы легче создать парсер? Какой подход вы бы порекомендовали?

  • Это можно легко сделать с помощью XML для описания тестовых сценариев.

    < GETFILE object = "newObject" file = "http://svn/repos/template1.xml" /" >

  • Поскольку ваш пример синтаксиса довольно прост, также должно быть возможно просто использовать StringTokenizer для токенизации и анализа таких сценариев.

Если вы хотите ввести более сложные выражения или структуры управления, вероятно, лучше выбрать ANTLR

Ответ 7

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

Get an input XML file from network shared folder or subversion repository
Import the XML file using the interface
Check if the import result message was successfull
Export the XML corresponding to the object that was just imported
   using the interface and check if it correct.

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

file InputFile
message Message

get InputFile from http://<....>
import Message from InputFile
if validate Message export Message
else
begin
   ! Signal an error
end

В вышеприведенном ключе ключевые слова file, message, get, import, validate и export - это все пользовательские ключевые слова, для каждого из которых требуются два простых класса, меньших, чем страница кода для реализации их функций компилятора и выполнения. По мере завершения каждой части функциональности она попадает в структуру, где она сразу же доступна для выполнения своей работы.

Обратите внимание, что это всего лишь одна возможная форма; точный синтаксис может быть свободно выбран разработчиком. Система представляет собой язык ассемблера высокого уровня DIY, используя предварительно написанные классы Java для выполнения всех функциональных блоков как для компиляции, так и для среды выполнения. Структура определяет, где эти биты функциональности должны быть размещены, и предоставляет необходимые абстрактные классы и интерфейсы, которые будут реализованы.

Система удовлетворяет основную потребность ясности, где не-программисты могут легко увидеть, что происходит. Изменения могут быть сделаны быстро и запускаться немедленно, поскольку компиляция почти мгновенная.

Полный (открытый) исходный код доступен по запросу. Там есть общая версия Java, а также одна для Android.