我正在研究一种新的编程语言rip,而我无法深入了解一些无限循环。有没有办法在调用时打印出每个规则,以便我可以看到递归的规则?我试着在头脑中浏览代码,而我却看不到它。任何帮助将不胜感激。
答案 0 :(得分:3)
修补方法实际上是Parslet::Atoms::Context#lookup
。 View it on GitHub(permalink 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以获取示例。