3

我正在使用 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 解析中的错误:解析已用尽,但词位仍然存在。

我不知道如何设计一个术语来表示可能会吞下数兆字节的废话,不管遇到什么文本,只要继续到文件的末尾即可。我尝试使用 :discard 或 'pause => after' 时运气不佳,尽管我可能会误用它们。

对于上下文,我对解析和词法分析没有深入的了解。我敲敲语法直到它奏效。

4

2 回答 2

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]匹配所有字符。

于 2014-09-12T09:18:06.770 回答
1

曾经在 marpa-parser 邮件列表上讨论过类似的主题,但是从那里以某种方式编写了代码示例,所以我建议从我对另一个 SO question的回答中提出一个工作示例

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

希望这可以帮助。

于 2014-09-12T06:43:35.640 回答