2014-12-26 23 views
1

我一直在尝试最近使用Treetop为我的客户之一创建CFG DSL语言的简单解析器。我成功地实现了他所需的所有功能,但与Treetop一起工作竟然是相当痛苦的经历。提供无用输出的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库中的错误/错误?

感谢您的意见。

回答

2

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

您是否尝试过使用单个令牌或超简单语法?

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

还有一些“年轻球员的陷阱”,但你没有给我们足够的信息继续下去。一旦你“明白了”,在Treetop开发是一件轻而易举的事情,但它可能需要一点时间才能达到这一点。

+0

谢谢,这真的很有帮助。看来,failure_rason提供了一些更好的信息。 –