Могу ли я генерировать правила динамически в parboiled2 parser? Вариант использования заключается в том, что у меня есть куча уже определенных правил, но я хочу добавить больше и не компилировать каждый раз, когда добавляю правило.Динамически создавать правила parboiled2
ответ
Если вы хотите генерировать правила во время выполнения (как вы делали в Parboiled1), это невозможно. Parboiled 2 использует marco exressions, поэтому вы не можете генерировать правила во время выполнения. Все происходит на этапе компиляции.
Если у вас есть ряд определенных правил и вы хотите составить их в произвольном порядке, даже если некоторые из них отсутствуют. Возможно. Я сделал это.
Есть два известных варианта, как можно достичь этого:
Первый вариант (я не пробовал еще) называется DynamicRuleDispatch
вы можете найти его в documentation и смотреть на это испытание here.
Второй вариант заключается в отправке отправки вручную (как и я).
Вы должны создать кучу правил, которые могут комбинироваться динамически. Эти правила должны иметь тип Rule0. Они не должны влиять на стек значений. Добавьте побочный эффект к этим правилам после оценки правила. Операция побочного эффекта должна сохранять захваченные данные где-то внутри вашего синтаксического анализатора. Вы должны использовать
capture
+~
+run
сверток для достижения этой цели, смотрите на примере ниже:Защиту RuleWithSideEffect = норма { захвата (EmailAddress) ~ пробег {адрес: String => saveItSomewhere (адрес) } ~ ВЗ
Вам необходимо создать какое-то изменяемое состояние внутри вашего синтаксического анализатора. Сохраняйте место, где вы можете сохранить результаты синтаксического анализа. Это может быть hashmap. Этот Hashmap должен хранить все возможные правила и их значения. Вы не можете использовать стек значений, потому что вы не будете определять количество согласованных правил. Будьте внимательны при сохранении изменчивого состояния. Он должен быть очищен после каждого вызова.
Для выравнивания правил вам нужен формат выравнивания правил. Например:
класс Parser (вход: ParserInput, формат: String) расширяет Parser ....
Затем вам нужно разобрать строку формата и получить маркеры формата. Используйте шаблон соответствия для отправки списка соответствующих токенов формата в поля Rule0 dispatchRule
ниже. А затем сопоставьте список токенов строк с правилами.
Если у вас есть список правил, которые необходимо выполнить следующие операции:
// concatenates two rules. Must be inside rule block
def concatRules(f: Rule0, s: Rule0): Rule0 = rule {
f ~ s
}
val rootRule =
stringTokens map dispatchRule reduce concatRules
def RootRule: Rule0 = rule { mainRule ~ EOI }
def dispatchRule(token: String): Rule0 = match token {
case "DATE" => DateParser.DateRule
....
}
Вы можете разобрать generater журнал доступа при наличии LogFormat в парсер конструктора. Итак, вам нужна модель данных для выравнивания правил.
- 1. parboiled2 Нелегального правило композиция
- 2. Parboiled2 Parser Пример
- 3. Запуск парсер внутри parboiled2
- 4. Понимание Parboiled2 на '~' Combinator
- 5. Динамически создавать cronjobs в AWS
- 6. Как динамически создавать вкладки
- 7. HTML5 Динамически создавать Canvas
- 8. Динамически создавать ContextMenu
- 9. Динамически создавать якорный тег
- 10. динамически создавать текстовое поле
- 11. Динамически создавать список ListModel
- 12. xCode Динамически создавать ViewControllers
- 13. Delphi: динамически создавать TClientSocket
- 14. Динамически создавать общедоступные свойства
- 15. Динамически создавать атрибуты класса
- 16. Динамически создавать несколько ImageViews
- 17. Динамически создавать переменные
- 18. Динамически создавать магистральные маршруты
- 19. Динамически создавать линейную компоновку
- 20. динамически создавать элементы холста
- 21. Jquery динамически создавать контент
- 22. Как динамически создавать формы?
- 23. Динамически создавать несколько массивов
- 24. Динамически создавать редактируемые PDF
- 25. Динамически создавать отношения Neo4j
- 26. Динамически создавать разные функции
- 27. динамически создавать меню файла
- 28. Создавать настраиваемый класс динамически
- 29. Как создавать темы динамически?
- 30. Динамически создавать таблицы sqlite
Я считаю, что они сильно используют макросы, поэтому я бы предположил, что вы не можете создавать их динамически во время выполнения. –
'добавить и не компилировать каждый раз, когда я добавляю правило, почему рекомпиляция касается вас? –