树梢语法无限循环

| 我曾想过一种关于新编程语言的想法,所以我认为我会尝试实现它。一位朋友建议我尝试使用Treetop(Ruby宝石)来创建解析器。 Treetop的文档很少,我以前从未做过这种事情。 我的解析器的行为就像它具有无限循环,但是没有堆栈跟踪。事实证明很难追查。有人可以指出我入门级解析/ AST指南的方向吗?我真的需要一些列出规则,常用用法等信息的工具,以使用诸如Treetop之类的工具。我的解析器语法器在GitHub上,以防有人希望帮助我改进它。
class {
  initialize = lambda (name) {
    receiver.name = name
  }

  greet = lambda {
    IO.puts(\"Hello, #{receiver.name}!\")
  }
}.new(:World).greet()
    
已邀请:
我要求树梢将您的语言编译成.rb文件。这给了我一些启发:
$ tt -o /tmp/rip.rb /tmp/rip.treetop
然后,我使用了这个小存根来重新创建循环:
require \'treetop\'
load \'/tmp/rip.rb\'
RipParser.new.parse(\'\')
挂了现在,那不是很有趣!空字符串可以重现行为,就像问题中的十几行示例一样。 为了弄清楚它的挂起位置,我使用了一个Emacs键盘宏来编辑rip.rb,并在每个方法的入口添加了一条调试语句。例如:
def _nt_root
  p [__LINE__, \'_nt_root\'] #DEBUG
  start_index = index
现在我们可以看到循环的范围:
[16, \"root\"]
[21, \"_nt_root\"]
[57, \"_nt_statement\"]
...
[3293, \"_nt_eol\"]
[3335, \"_nt_semicolon\"]
[3204, \"_nt_comment\"]
[57, \"_nt_statement\"]
[57, \"_nt_statement\"]
[57, \"_nt_statement\"]
...
从那里进行的进一步调试表明,整数可以是空字符串:
rule integer
   digit*
end
这间接允许一个语句为空字符串,并且顶层规则“ 6”将永远消耗空语句。将
*
更改为es8ѭ可以修复循环,但会发现另一个问题:
/tmp/rip.rb:777:in `_nt_object\': stack level too deep (SystemStackError)
        from /tmp/rip.rb:757:in `_nt_compound_object\'
        from /tmp/rip.rb:1726:in `_nt_range\'
        from /tmp/rip.rb:1671:in `_nt_special_literals\'
        from /tmp/rip.rb:825:in `_nt_literal_object\'
        from /tmp/rip.rb:787:in `_nt_object\'
        from /tmp/rip.rb:757:in `_nt_compound_object\'
        from /tmp/rip.rb:1726:in `_nt_range\'
        from /tmp/rip.rb:1671:in `_nt_special_literals\'
         ... 3283 levels...
范围通过special_literals,literal_object,object和compound_object间接向左递归。面对左递归的树梢吃了很多东西直到吐出来。我没有针对该问题的快速解决方案,但至少从现在开始您要进行堆栈跟踪。 另外,这不是您的直接问题,但是
digit
的定义很奇怪:它可以是一个数字或多个数字。这导致ѭ11或ѭ12允许(可能是)非法整数
1________2
。     
我真的很喜欢Parr的Language Implementation Patterns。自从Parr创建了ANTLR解析器生成器以来,这就是他在整本书中使用的工具,但是从中学习它应该足够简单。 我真正喜欢它的是每个示例在前一个示例的基础上发展起来的方式。他并不是从具有庞大的AST功能的解析器开始的,而是慢慢地引入了需要越来越多的“后端智能”来完成工作的问题,因此本书与需要解析的语言一起很好地扩展了。 我希望它能更深入地介绍一种在设计语言时可以编写的语言类型,并就“可以”和“不可以”提供建议。我已经看到了一些很难解析的语言,并且我想了解更多有关可能以不同方式制定的设计决策的信息。     

要回复问题请先登录注册