Написание парсера для предметно-ориентированного языка на Java

Мы хотим разработать простой предметно-ориентированный язык для написания тестовых сценариев для автоматического тестирования 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 для языка C. Может быть, можно было бы использовать какой-нибудь эквивалент для Java?

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


person b.roth    schedule 08.03.2010    source источник
comment
Этот поиск: stackoverflow.com/search?q=parser+generator+java оказался stackoverflow.com/questions/2144082/ и stackoverflow.com/questions/611820/ и stackoverflow.com/questions/674466/ и многих других возможных дубликатов.   -  person dmckee --- ex-moderator kitten    schedule 08.03.2010
comment
@dmckee, эти сообщения относятся к синтаксическим анализаторам в Java, но определенно НЕ дублируют. Пожалуйста, прочтите мой вопрос и обратите внимание, что в зависимости от того, что вы хотите проанализировать (XML, математическое выражение, язык декларативных сценариев и т. Д.), Ваша стратегия синтаксического анализа различается. Вот почему у нас есть несколько сообщений по этой теме здесь.   -  person b.roth    schedule 09.03.2010


Ответы (7)


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

person Péter Török    schedule 08.03.2010

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

person Michael Borgwardt    schedule 08.03.2010
comment
@ Майкл, это действительно здорово! - person Bart Kiers; 08.03.2010

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

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

person Bozho    schedule 08.03.2010

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

person Roman    schedule 08.03.2010

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

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

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

person Thorbjørn Ravn Andersen    schedule 08.03.2010

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

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

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

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

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

person stacker    schedule 08.03.2010

Я понимаю, что этой теме уже 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 являются настраиваемыми ключевыми словами, каждое из которых требует двух простых классов размером меньше страницы кода для реализации своих функций компилятора и времени выполнения. По мере того, как каждая часть функциональности завершена, она помещается в структуру, где сразу становится доступной для выполнения своей работы.

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

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

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

person Graham    schedule 12.07.2013