[当解析具有特定语法的文件时,解析失败时,我会收到一条相应的错误消息,其中包含在源文件中违反该语法的位置。
我想在这些情况下查看的是目前活跃的语法规则列表,例如语法规则“堆栈跟踪”或到目前为止已匹配的规则。这在Rascal中可能吗?
因此,对于一个非常简单的示例,使用文档中的EXP语言,如果我尝试解析“ 2 + foo”,我会得到类似的东西
Exp
=> left Exp "+" Exp
=> left IntegerLiteral "+" Exp
=> left IntegerLiteral "+" <?>
No derivation of "foo" from rule 'Exp'
另一种说法是查看不完整的分析树,因为这是发生分析错误的时刻。这有意义吗?
完全有道理,但恐怕此“不完整的分析树”功能在我们的TODO列表中。
注意,使用非确定性解析算法,它可能会返回一组当前的解析上下文,因此将返回“解析森林”,而不是单个堆栈跟踪。我仍然认为这将是一个非常有用的调试功能。
[我现在唯一能做的建议是“ delta-debugging”,因此删除一半的输入并检查是否仍然存在解析错误,然后再去除另一半,冲洗/起泡/重复。