Treetop解析器错误处理机制提供无用的输出

时间:2014-12-26 10:40:25

标签: ruby parsing peg treetop

我最近一直在尝试使用Treetop为我的一个客户创建简单的CFG DSL语言解析器。我成功地实现了他所需要的所有功能,但与Treetop一起工作却是一次非常痛苦的经历。

问题是我无法从Treetop获得任何可用的错误消息。我得到的唯一输出是

parser.rb:22:in `parse': Parser error at offset: 0 (Exception)
Error:
#<TranLanParser:0x007f960c852f60>
    from parser.rb:28:in `<class:Parser>'
    from parser.rb:10:in `<main>'

始终指向文件中的第一个字符。在解析的语言中发现任何错误真的很糟糕。如果我找不到什么错误,我应该如何逐步开发我的解析器呢?

我试图改变我的语法以包含递归规则,因为我认为这将有助于解析器尽快创建AST节点,但它没有帮助。

我的问题是: 难道我做错了什么?有没有很好的例子如何为Treetop创建PEG语法,它在部分派生的树上提供有意义的错误消息?或者它是Treetop库中的错误/错误?

感谢您的任何意见。

1 个答案:

答案 0 :(得分:2)

您是否尝试过打印parser.failure_reason?这将打印允许超出解析器到达的最右侧位置(在回溯之前)的终端列表。

您是否尝试过单个令牌或超简单语法,随时可以使用?

您是否尝试过设置parser.consume_all_input = false,以查看它是否正确解析而不是输入结束?

还有一些针对年轻球员的陷阱&#34;但是你还没有给我们足够的信息继续下去。一旦你得到它&#34;,在Treetop中开发是一件轻而易举的事,但要达到这一点可能需要一段时间。