树梢语法无限循环
|
我曾想过一种关于新编程语言的想法,所以我认为我会尝试实现它。一位朋友建议我尝试使用Treetop(Ruby宝石)来创建解析器。 Treetop的文档很少,我以前从未做过这种事情。
我的解析器的行为就像它具有无限循环,但是没有堆栈跟踪。事实证明很难追查。有人可以指出我入门级解析/ AST指南的方向吗?我真的需要一些列出规则,常用用法等信息的工具,以使用诸如Treetop之类的工具。我的解析器语法器在GitHub上,以防有人希望帮助我改进它。
class {
initialize = lambda (name) {
receiver.name = name
}
greet = lambda {
IO.puts(\"Hello, #{receiver.name}!\")
}
}.new(:World).greet()
没有找到相关结果
已邀请:
2 个回复
鲁釜头
然后,我使用了这个小存根来重新创建循环:
挂了现在,那不是很有趣!空字符串可以重现行为,就像问题中的十几行示例一样。 为了弄清楚它的挂起位置,我使用了一个Emacs键盘宏来编辑rip.rb,并在每个方法的入口添加了一条调试语句。例如:
现在我们可以看到循环的范围:
从那里进行的进一步调试表明,整数可以是空字符串:
这间接允许一个语句为空字符串,并且顶层规则“ 6”将永远消耗空语句。将
更改为es8ѭ可以修复循环,但会发现另一个问题:
范围通过special_literals,literal_object,object和compound_object间接向左递归。面对左递归的树梢吃了很多东西直到吐出来。我没有针对该问题的快速解决方案,但至少从现在开始您要进行堆栈跟踪。 另外,这不是您的直接问题,但是
的定义很奇怪:它可以是一个数字或多个数字。这导致ѭ11或ѭ12允许(可能是)非法整数
。
薄响