我正在使用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没有扎实的理解。我对语法进行了攻击,直到它奏效。
答案 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中执行此类操作的正确方法,并且未针对多兆字节字符串进行测试。
希望这有帮助。