2014-09-12 3 views
3

Я использую Marpa :: R2 :: Scanless :: G для анализа устаревшего формата текстового файла. Формат файла имеет хорошо структурированный раздел вверху, за которым следует плохо структурированный беспорядок текста и uuencoded. Последний материал может быть полностью проигнорирован, но я не могу понять, как рассказать интерфейс Marpa SLIF: все готово; не беспокойтесь о оставшемся тексте.Сбрасывать и пропускать неструктурированный текст с помощью Perl Marpa?

В очень упрощенном виде файл может выглядеть следующим образом:

("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», хотя я, вероятно, неправильно их использую.

Для контекста у меня нет четкого понимания разбора и лексирования. Я ударил по грамматике, пока она не сработала.

ответ

3

Самое простое, что нужно сделать было бы ввести лексему, которая соответствует всем остальным вы не заинтересованы в:

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] соответствует всем символам.

+0

@rjt_jr замечательный. Параны проверяют, что правило все еще согласовано, но не вычисляется значение для этого правила. Например, грамматика 'Text :: = 'foo' ('bar') 'baz' action => :: array; : discard ~ [\ s] + 'соответствует строке' 'foo bar baz''. Когда мы посмотрим на значение синтаксического анализа, мы найдем значения для foo и baz, но не для bar, потому что они скрыты в parens: '[" foo "," baz "]'. Для небольших вопросов, подобных этому, рассмотрите также переход на канал #marpa на irc.freenode.net (вы можете использовать этот [веб-клиент] (https://webchat.freenode.net)). – amon

+0

Моя основная проблема заключалась в том, что у меня не было «latm => 1», и поэтому мои попытки сопоставить «все, что осталось» не срабатывали, и я не мог понять, как это сделать. –

1

Был один раз в discussion of a similar topic в списке рассылки Марпа-синтаксического анализа, но примеры кода как-то оттуда, так что я бы предложил working example от моего ответа на another SO question.

Не уверен, что это правильный способ сделать такие вещи в Марпе, хотя и не проверен на несколько мегабайтных строк.

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