Rascal:语法堆栈跟踪
Rascal: Grammar Stack Trace
当解析具有特定语法的文件并且解析失败时,我收到一条相应的错误消息,其中包含违反语法的源文件中的位置。
在这些情况下,我想查看的是此时处于活动状态的语法规则列表,类似于语法规则 "stack trace",或者到目前为止已匹配的规则。
这在 Rascal 中可能吗?
所以,对于一个非常简单的例子,在文档中的 EXP 语言中,如果我尝试解析“2 + foo”,我可以得到类似
的东西
Exp
=> left Exp "+" Exp
=> left IntegerLiteral "+" Exp
=> left IntegerLiteral "+" <?>
No derivation of "foo" from rule 'Exp'
另一种说法是查看不完整的解析树,因为这是发生解析错误的时刻。这有意义吗?
这完全有道理,但恐怕这个 "incomplete parse tree" 功能在我们的 TODO 列表中。
请注意,使用非确定性解析算法可能会 return 一组当前解析上下文,因此 "parse forest" 而不是单个堆栈跟踪。我仍然认为这将是一个非常有用的调试功能。
我现在唯一能做的建议是"delta-debugging",所以删除一半输入并检查解析错误是否仍然存在,然后是另一半,rinse/lather/repeat。
当解析具有特定语法的文件并且解析失败时,我收到一条相应的错误消息,其中包含违反语法的源文件中的位置。
在这些情况下,我想查看的是此时处于活动状态的语法规则列表,类似于语法规则 "stack trace",或者到目前为止已匹配的规则。 这在 Rascal 中可能吗?
所以,对于一个非常简单的例子,在文档中的 EXP 语言中,如果我尝试解析“2 + foo”,我可以得到类似
的东西Exp
=> left Exp "+" Exp
=> left IntegerLiteral "+" Exp
=> left IntegerLiteral "+" <?>
No derivation of "foo" from rule 'Exp'
另一种说法是查看不完整的解析树,因为这是发生解析错误的时刻。这有意义吗?
这完全有道理,但恐怕这个 "incomplete parse tree" 功能在我们的 TODO 列表中。
请注意,使用非确定性解析算法可能会 return 一组当前解析上下文,因此 "parse forest" 而不是单个堆栈跟踪。我仍然认为这将是一个非常有用的调试功能。
我现在唯一能做的建议是"delta-debugging",所以删除一半输入并检查解析错误是否仍然存在,然后是另一半,rinse/lather/repeat。