Parsing 用于ANTLR的回溯lexer

Parsing 用于ANTLR的回溯lexer,parsing,antlr,jscript,antlr3,lexer,Parsing,Antlr,Jscript,Antlr3,Lexer,我正在扩展一个JavaScript ANTLR语法,它使用C目标来处理JScript的条件编译注释,即,/*@cc\u on@*/ 这些需要与普通块注释分开处理,因为/*@cc_on/*hello*/*/会产生一个条件编译注释,该注释会一直延伸到注释标记的第二个末端 我从熟悉的lexer规则开始: Comment : '/' '*' (options {greedy=false;} : .)* '*' '/' { $channel=HIDDEN; } ; 我添加了一个新的lexer规则

我正在扩展一个JavaScript ANTLR语法,它使用C目标来处理JScript的条件编译注释,即,
/*@cc\u on@*/

这些需要与普通块注释分开处理,因为
/*@cc_on/*hello*/*/
会产生一个条件编译注释,该注释会一直延伸到注释标记的第二个末端

我从熟悉的lexer规则开始:

Comment
  : '/' '*' (options {greedy=false;} : .)* '*' '/' { $channel=HIDDEN; }
  ;
我添加了一个新的lexer规则来使用条件编译块:

Comment
  : '/' '*@cc_on' (options {greedy=false;} : .)* '@*' '/' { $channel=HIDDEN; }
  | '/' '*' (options {greedy=false;} : .)* '*' '/' { $channel=HIDDEN; }
  ;
当生成的lexer在
上看到条件编译打开
/*@cc\u,但在文件的其余部分没有找到结束语句
@*/
时,它应该回溯并使用普通的块注释规则来使用其输入。然而,生成的lexer并没有这样做——当它看到
/*@cc_cond
时,它似乎会扫描文件的其余部分,寻找
@*/
,当它找不到它时,就会抛出一个错误,而不是回溯

因此,解析

var a = /*@cc_on /* ends here */ 1, b = 2
抛出而不是成功:(错误打印代码是我的,可能有问题,我相信在这种情况下它应该指向
2

Lexer错误:(1):错误1:意外字符,行:1,列:40,标记文本:
Lexer错误位置:
变量a=/*@cc_on/*在这里结束*/1,b=2
----------------------------------------^
分析器错误:-输入结束-(1):错误3:,在偏移量-1处,在
:无法与任何预测输入匹配。。。
如何编辑注释规则以获得所需的行为?语法已具有
backtrack=true

编辑: 将
选项{backtrack=true;k=1;}
添加到规则中就成功了。为什么呢<代码>回溯
已为整个语法启用

Lexer Error: <input>(1) : error 1 : Unexpected character, Line: 1, Col: 40, Token Text: <<</*@cc_on /* ends here */ 1, b = 2>>>
Lexer Error location:
var a = /*@cc_on /* ends here */ 1, b = 2
----------------------------------------^

Parser Error: -end of input-(1) : error 3 : , at offset -1 , at <EOF>
 : cannot match to any predicted input...