2014-09-25 55 views
0

在我的ANTLR语法中,我想检测错误的关键字或错误的类型常量,例如, 'null'而不是'NULL'。我加入了语法错误的选择,例如:检测错误的语法(错误替代)以便快速修复

| extra='null' #error1 

如果我的自定义编辑器检测到错误不断,我可以用正确的常量替换它解决它。

但我不知道这是否是正确的方法来解决和检测语法中的错误关键字或常量。

除了我试图检测语法缺少一个右(见ANTLR书章节9.4):

....... 
| 'if' '(' expr expr #error2 
| '{' exprlist #error3 
| 'while' '(' expr expr #error4 
........ 

但这种大规模减慢解析过程,所以我认为这是错误的,这样做的。

我的问题是:

它是正确的,因为上述检测这样错误的关键词,常数等?

是否有可能在没有大规模速度下降的情况下捕捉文法中遗漏的关闭?

任何帮助表示赞赏。

回答

0

我发现我可以从规则提取第二令牌(以添加该位置处的大括号):

| 'if' '(' expr expr #error2 

与:

Token myToken = tokens.get(ctx.getChild(2).getSourceInterval().b); 
parser.notifyErrorListeners(........ 

然而,大量降低的速度解析器。