我正在使用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
;
最佳答案
与其说“对”和“错”,不如说是解析器试图找出哪个规则将匹配输入的解析器。当ANTLR必须回溯时,ANTLRWorks将红色用于它认为可能匹配的分析树的分支。绿色用于解析器实际探查的分支,黑色用于成功匹配输入的分支。深色和浅色是ANTLRWorks,可为嵌套回溯级别提供视觉反馈-级别越深,颜色就越深。
该答案的主要来源是Bovet(创建ANTLRWorks)和Parr(创建ANTLR)编写的ANTLRWorks: An ANTLR Grammar Development Environment Unpublished Draft。
从第8页:
解析器采用的路径以绿色显示
从第15页开始:
当ANTLR必须回溯以区分替代产品时,通常很难
调试解析器,因为开发人员必须跟踪解析器何时进行推测以及何时进行推测
不。 ANTLRWorks通过以红色显示解析树中的所有推测性解析分支来清楚地区分这两种模式。 ...第二个子树[显示为黑色]是规则s中成功匹配的第二个备用树的解析树。在ANTLR必须嵌套回溯的情况下,ANTLRWorks会通过一系列渐变来更改颜色,每个渐变对应一个嵌套级别。
关于debugging - ANTLRWorks调试-不同颜色的含义?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23653894/