Ответ 1
Вы можете попробовать JavaCC или Antlr для создания парсера для вашего конкретного домена. Если редакторы этого файла не являются программистами, я бы предпочел этот подход над 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, который, возможно, будет проще создать парсер? Какой подход вы бы порекомендовали?
Вы можете попробовать JavaCC или Antlr для создания парсера для вашего конкретного домена. Если редакторы этого файла не являются программистами, я бы предпочел этот подход над XML.
Взгляните на Xtext - он примет определение грамматики и сгенерирует синтаксический анализатор, а также полнофункциональный заголовок редактора затмения с подсветкой синтаксиса и -четкой.
ANTLR должно быть достаточно
ANTLR, еще один инструмент для распознавания языков, является инструментом языка, который обеспечивает основу для создания распознавателей, интерпретаторов, компиляторов и переводчиков из грамматических описаний, содержащих действия на разных целевых языках. ANTLR обеспечивает отличную поддержку для древовидного строительства, ходьбы деревьев, перевода, восстановления ошибок и отчетов об ошибках.
Посмотрите на библиотеку Antlr. Вам нужно будет использовать EBNF grammatic для описания вашего языка, а затем использовать Antlr для создания классов java из вашей грамматики.
Посмотрите, как Cucumber определяет свои тесты:
(источник: cukes.info)
http://cukes.info/ - можно запустить в JRuby.
Или я мог отказаться от идеи иметь декларативный язык и вместо этого выберите язык на основе XML, что, возможно, было бы легче создать парсер? Какой подход вы бы порекомендовали?
Это можно легко сделать с помощью XML для описания тестовых сценариев.
< GETFILE object = "newObject" file = "http://svn/repos/template1.xml" /" >
Поскольку ваш пример синтаксиса довольно прост, также должно быть возможно просто использовать StringTokenizer для токенизации и анализа таких сценариев.
Если вы хотите ввести более сложные выражения или структуры управления, вероятно, лучше выбрать ANTLR
Я понимаю, что этой теме 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.