1

我正在研究一种新的编程语言rip,但我无法深入到一些无限循环的底部。有没有办法在每个规则被调用时打印出来,这样我就可以看到正在递归的规则?我试过在脑海中浏览代码,但我没有看到它。任何帮助将非常感激。

4

3 回答 3

3

充实Raving Genius 的答案

打补丁的方法其实是Parslet::Atoms::Context#lookup在 GitHub 上查看永久链接到当前版本)。在您自己的代码中,您可以修补该方法以打印obj如下:

class Parslet::Atoms::Context
  def lookup(obj, pos)
    p obj
    @cache[pos][obj.object_id]
  end
end

在调用解析器之前随时运行该代码parse,它将生效。样本输出:

>> parser = ConsistentNewlineTextParser.new
=> LINES
>> parser.parse("abc")
LINES
(line_content:LINE_CONTENT NEWLINE){0, } line_content:LINE_CONTENT
(line_content:LINE_CONTENT NEWLINE){0, }
line_content:LINE_CONTENT NEWLINE
LINE_CONTENT
WORD
\\w{0, }
\\w
\\w
\\w
\\w
NEWLINE
dynamic { ... }
FIRST_NEWLINE
'? '
'
'?
'
'
'
LINE_CONTENT
=> {:line_content=>"abc"@0}
于 2013-03-31T08:00:29.247 回答
1

我想通了:编辑Parslet::Atom::Context#lookup以输出obj参数将在调用每个规则时显示它。

于 2013-03-27T03:31:39.570 回答
0

我的 Parslet 分支自动检测无限循环,并退出重复的报告表达式而不消耗任何东西。

https://github.com/nigelthorne/parslet

有关示例,请参阅Parse markdown 缩进代码块。

于 2015-10-14T12:07:43.960 回答