Как определить структурированные типы данных в Grammar-Kit?

Я хочу определить домен-специфический язык (DSL), который является структурой / каскадно, как это

ROOT
  NAME "my dsl"
  TODO
    DESC "foo"
  END
  TODO
    DESC "bar"
  END
END

Для моего понимания нужны следующие правила:

  • Объекты ROOT и TODO должны начинаться с их ключевого слова и заканчиваться END.
  • ROOT должен иметь атрибут NAME.
  • TODO должен иметь атрибут DESC
  • TODO 0..n раз в корне

Как я могу выразить такой набор правил в BNF?

1 ответ

Основываясь на руководстве по поддержке нестандартного языка (Simple Language), у меня работает следующий фрагмент BNF.

{
  tokens=[
    space='regexp:[\s\n]+'
    string="regexp:'.*'"
  ]
}

simpleFile ::= 'ROOT' space nameAttr space (todoObj space)+ 'END'
nameAttr ::= 'NAME' space string

todoObj ::= 'TODO' space descAttr space 'END'
descAttr ::= 'DESC' space string
Другие вопросы по тегам