Написание парсера для предметно-ориентированного языка на Java
Автор вопроса: b.rothОтветов: 7
Мы хотим разработать простой предметно-ориентированный язык для написания тестовых сценариев для автоматического тестирования 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, для которого, возможно, было бы проще создать синтаксический анализатор? Какой подход вы порекомендуете?
Этот поиск: stackoverflow.com/search?q=parser+generator+java оказался stackoverflow.com/questions/2144082/ и stackoverflow.com/questions/611820/ и stackoverflow.com/questions/674466/ и многих других возможных дубликатов. dmckee --- ex-moderator kitten 08.03.2010
@dmckee, эти сообщения относятся к синтаксическим анализаторам в Java, но определенно НЕ дублируют. Пожалуйста, прочтите мой вопрос и обратите внимание, что в зависимости от того, что вы хотите проанализировать (XML, математическое выражение, язык декларативных сценариев и т. Д.), Ваша стратегия синтаксического анализа различается. Вот почему у нас есть несколько сообщений по этой теме здесь. b.roth 09.03.2010
Вы можете попробовать JavaCC или Antlr для создания синтаксического анализатора для языка вашего домена. Если редакторы этого файла не являются программистами, я бы предпочел этот подход XML.
Ответ 2 · рейтинг 5 · Michael Borgwardt
Взгляните на Xtext - он возьмет определение грамматики и сгенерирует синтаксический анализатор, а также полностью показанный плагин редактора eclipse с подсветкой синтаксиса и проверкой.
ANTLR, еще один инструмент для распознавания языков, представляет собой языковой инструмент, который обеспечивает основу для создания распознавателей, интерпретаторов, компиляторов и переводчиков из грамматических описаний, содержащих действия на различных целевых языках. ANTLR обеспечивает отличную поддержку для построения дерева, обхода дерева, перевода, исправления ошибок и создания отчетов об ошибках.
Ответ 4 · рейтинг 2 · Roman
Посмотрите библиотеку Antlr. Вам нужно будет использовать грамматику EBNF для описания своего языка, а затем использовать Antlr для создания классов java. от вашей грамматики.
Ответ 5 · рейтинг 2 · Thorbjørn Ravn Andersen
Посмотрите, как Cucumber определяет свои тестовые примеры:
(источник: cukes.info а>)
http://cukes.info/ - может работать в JRuby.
Ответ 6 · рейтинг 1 · stacker
Это можно легко сделать с помощью XML для описания ваших тестовых сценариев.
Поскольку ваш пример синтаксиса довольно прост, также должна быть возможность просто использовать StringTokenizer для токенизации и анализа таких сценариев.
Если вы хотите ввести более сложные выражения или управляющие структуры, вам, вероятно, лучше выбрать ANTLR
Ответ 7 · Graham
Я понимаю, что этой теме уже 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.