使用Perl Marpa丢弃并跳过非结构化文本?

时间:2014-09-12 04:33:21

标签: 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解析错误:解析用尽,但是lexemes仍然存在。

我无法弄清楚如何设计一个术语,表示可能会破坏潜在的兆字节垃圾,只要不管遇到的文本是什么,都要一直走到文件的末尾。我的尝试使用没有运气:丢弃或'暂停=&gt;在'之后,虽然我可能会滥用它们。

对于上下文,我对解析和lexing没有扎实的理解。我对语法进行了攻击,直到它奏效。

2 个答案:

答案 0 :(得分: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]匹配所有字符。

答案 1 :(得分:1)

在marpa-parser邮件列表上曾经有一个discussion of a similar topic,但是从那里开始有代码示例,所以我建议working example回答another SO question

不确定这是否是在Marpa中执行此类操作的正确方法,并且未针对多兆字节字符串进行测试。

希望这有帮助。