2

我正在使用 ANTLRWorks 的调试模式来测试我的 c 语法。在 ANTLRWorks 中进行调试非常有助于更好地理解,但我在理解输出树的不同颜色时遇到了问题。我backtrack=true在我的语法中使用。我认为红色意味着调试器走错了路,而绿色告诉我它走对了。但是深红色和深绿色呢?

我添加了一张“小树”的图片,它只匹配以下输入:

int test;

在此处输入图像描述

如果有必要回答这个问题,这里是使用的 4 个最重要的规则。

start
: declaration*
;

declaration
: functionDefinition
| dataDeclaration //also used for Function Declaration
| assemblerDefinition
;


functionDefinition 
: declarationSpecifier* declarator Equals Default Semi
| declarationSpecifier* declarator Equals Delete Semi
| declarationSpecifier* declarator functionBody
;

dataDeclaration
:declarationSpecifier* declarator initializer? (Comma declarator initializer?)* Semi
;
4

1 回答 1

1

与其说是“正确”和“错误”,不如说是解析器试图找出与输入匹配的规则。当 ANTLR 必须回溯时,ANTLRWorks 将红色用于它认为可能匹配的分析树分支。绿色用于解析器实际探索的分支,黑色用于成功匹配输入的分支。较深和较浅的颜色是 ANTLRWorks 为嵌套级别的回溯提供视觉反馈 - 级别越深颜色越深。

此答案的主要来源来自ANTLRWorks:由 Bovet(创建 ANTLRWorks)和 Parr(创建 ANTLR)编写的 ANTLR Grammar Development Environment Unpublished Draft。

从第 8 页开始:

解析器采用的路径显示为绿色

从第 15 页开始:

当 ANTLR 必须回溯以区分替代产生式时,通常很难调试解析器,因为开发人员必须跟踪解析器何时推测以及何时不推测。ANTLRWorks 通过以红色显示解析树中的所有推测解析分支,清楚地区分了这两种模式。...第二个子树 [以黑色显示] 是规则s中成功匹配的第二个备选方案的解析树。在 ANTLR 必须嵌套回溯的情况下,ANTLRWorks 通过一系列渐变来更改颜色,每个回溯嵌套级别一个渐变。

于 2013-04-20T03:01:07.617 回答