Отменить и пропустить неструктурированный текст с Perl Marpa?
Я использую Marpa::R2::Scanless::G для анализа устаревшего формата текстового файла. Формат файла имеет хорошо структурированный раздел вверху, за которым следует плохо структурированный беспорядок текста и uuencoded вещи. Последние вещи можно полностью игнорировать, но я не могу понять, как сказать интерфейс Marpa SLIF: все готово; не заморачивайся с оставшимся текстом.
В очень упрощенном виде файл может выглядеть так:
("field_a_val" 1,
"field_b_vals" (1,2,3),
"field_c_pairs" ((a 1)(b 2)(c 3))
)now_stuff_i_dont_care_about a;oiwermnv;alwfja;sldfa
asdf343avadfg;okm;om;oia3
e{<|1ydblV, HYED c"L. 78b."8
U=nK Wpw: Qh(e x!,~dU...
У меня есть все данные, которые мне нужно проанализировать, из верхней секции, но когда они попадают в нижнюю корзину, если я не пытаюсь их сопоставить, я получаю: Ошибка в синтаксическом анализе SLIF: Анализ исчерпан, но лексемы остаются.
Я не могу понять, как создать термин, который говорит, что он может отбросить потенциально мегабайты дерьма, просто продолжаю идти до конца файла независимо от найденного текста. Не повезло с моими попытками использовать: сбросить или 'pause => after', хотя я, вероятно, неправильно их использую.
Для контекста у меня нет четкого понимания синтаксического анализа и лексирования. Я стучал по грамматике, пока она не сработала.
2 ответа
Самое простое, что можно сделать, это ввести лексему, которая соответствует всем остальным, которые вас не интересуют:
lexeme default = latm => 1 # this prevents the rest from matching the whole document
Header
::= ActualHeader (AllTheRest) action => ::first
ActualHeader
::= ... # your code here
...
AllTheRest
::= action => ::undef # rest is optional
AllTheRest
::= THE_REST action => ::undef # matches anything
THE_REST ~ [\s\S]+
Мы не можем использовать :discard
правило для THE_REST
потому что это позволило бы всему происходить, но мы хотим, чтобы это было сделано только в конце. Класс персонажа [\s\S]
соответствует всем персонажам.
Когда-то обсуждалась похожая тема в списке рассылки marpa-parser, но примеры кода как-то оттуда, поэтому я бы предложил рабочий пример из моего ответа на другой вопрос SO.
Не уверен, что это правильный способ делать такие вещи в Marpa, хотя и не проверен на мультимегабайтные строки.
Надеюсь это поможет.