Кодирование парсера для предметно-ориентированного языка в Java - PullRequest
11 голосов
/ 08 марта 2010

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

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

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

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

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

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

Ответы [ 7 ]

6 голосов
/ 08 марта 2010

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

5 голосов
/ 08 марта 2010

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

4 голосов
/ 08 марта 2010

ANTLR должно хватить

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

2 голосов
/ 08 марта 2010

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

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

http://cukes.info/ - может работать в JRuby.

2 голосов
/ 08 марта 2010

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

1 голос
/ 08 марта 2010

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

  1. Это можно легко сделать, используя XML для описания ваших тестовых сценариев.

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

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

0 голосов
/ 12 июля 2013

Я понимаю, что этой теме уже 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.

...