Парсер PEG в pest для соответствия регулярному выражению в тройных кавычках, пробовал на https://pest.rs/ - PullRequest
1 голос
/ 09 октября 2019

Я пишу PEG-файл для использования в pest для нашего dsl. Существует необходимость, где мне нужно проанализировать значение ключа, где значение является регулярным выражением в тройной кавычке. Я не могу написать для этого правила борьбы с вредителями.

Значение: """Some regex here"""

Правило, которое я определил:

TQ = {"\"\"\""}

, и мне нужно

regex = {TQ ~ Anything but not TQ ~ TQ}

Я пытался с

regex = {TQ ~(!TQ)* ~ TQ}

, который не работает и не правильно PEG

regex = {TQ ~ ANY* ~ TQ}

, который жадно потребляет все токены, даже тройные кавычки в конце

Правило должно анализировать регулярные выражения в тройных кавычках, таких как

 """^\w+\s+\d\d\d\d\-\d\d\-\d\d\s+\d\d\:\d\d\:\d\d\s+AB_02V\s+\d+\s+.*"""

1 Ответ

3 голосов
/ 09 октября 2019

Ваше определение очень близко, чтобы быть верным с одним предупреждением: отрицательный предикат Pest не потребляет никакой информации при успешном выполнении. Поэтому синтаксический анализатор может застрять и не сможет добиться прогресса, если вы скажете ему, что он не совпадает с чем-либо.

Также необходимо знать, что сопоставлять. В этом случае это было бы что угодно. Для этой конкретной цели Pest имеет встроенное правило ANY:

tq = { "\"\"\"" }

re = { (!tq ~ ANY)* }

regex = { tq ~ re ~ tq }

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

...