Отменить и пропустить неструктурированный текст с 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, хотя и не проверен на мультимегабайтные строки.

Надеюсь это поможет.

Другие вопросы по тегам