1

我最近一直在尝试使用 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 库中的错误/错误?

感谢您的任何意见。

4

1 回答 1

2

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

您是否尝试过单一的标记或超简单的语法,边做边学?

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

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

于 2014-12-27T08:57:40.257 回答