Parslet:SystemStackError:堆栈级别太深

时间:2013-03-22 03:42:53

标签: ruby parslet

我正在研究一种新的编程语言rip,而我无法深入了解一些无限循环。有没有办法在调用时打印出每个规则,以便我可以看到递归的规则?我试着在头脑中浏览代码,而我却看不到它。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:3)

充实Raving Genius’s answer

修补方法实际上是Parslet::Atoms::Context#lookupView it on GitHubpermalink to current version)。在您自己的代码中,您可以修补该方法以打印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}

答案 1 :(得分:1)

我明白了:编辑Parslet::Atom::Context#lookup输出obj参数会显示每个规则的调用。

答案 2 :(得分:0)

My branch of Parslet会自动检测无限循环,并退出报告重复的表达式而不消耗任何内容。

https://github.com/nigelthorne/parslet

请参阅Parse markdown indented code block以获取示例。