我有一个文件,我想忽略其中的一部分。在 Lexer 中,我使用门控语义谓词来避免为文件中不感兴趣的部分创建标记。我的规则类似于以下内容。
A
: {!ignore}?=> 'A'
;
START_IGNORE
: 'foo' {ignore = true; skip();}
;
END_IGNORE
: 'oof' {ignore = false; skip();}
;
IGNORE
: {ignore}?=> . {skip();}
;
但是,除非我将 START 和 END 更改为也使用语义谓词(如下所示),否则它不起作用..
A
: {!ignore}?=> 'A'
;
START_IGNORE
: {true}?=> 'foo' {ignore = true; skip();}
;
END_IGNORE
: {true}?=> 'oof' {ignore = false; skip();}
;
IGNORE
: {ignore}?=> . {skip();}
;
为什么我必须添加谓词?
编辑:我正在使用 antlr-3.4