2012-07-09 58 views
1

我有一个文件,我想忽略它的一部分。在Lexer中,我使用门控语义谓词来避免为文件的无趣部分创建令牌。我的规则类似于以下内容。Antlr多余的谓词需要?

A 
: {!ignore}?=> 'A' 
; 
START_IGNORE 
: 'foo' {ignore = true; skip();} 
; 
END_IGNORE 
: 'oof' {ignore = false; skip();} 
; 
IGNORE 
: {ignore}?=> . {skip();} 
;  

但是除非我改变的开始和结束也使用语义谓词(如下),这是行不通的..

A 
: {!ignore}?=> 'A' 
; 
START_IGNORE 
: {true}?=> 'foo' {ignore = true; skip();} 
; 
END_IGNORE 
: {true}?=> 'oof' {ignore = false; skip();} 
;  
IGNORE 
: {ignore}?=> . {skip();} 
; 

为什么我添加的谓词?

编辑:我使用ANTLR-3.4

回答

1

为什么我添加的谓词?

你不知道。至少,不使用ANTLR v3.3。我不知道你正在测试的是,但不要使用ANTLRWorks的解释器或Eclipse ANTLR IDE插件。总是从命令行做一些测试。

grammar T; 

@parser::members { 
    public static void main(String[] args) throws Exception { 
    TLexer lexer = new TLexer(new ANTLRStringStream("A foo A B C oof A")); 
    TParser parser = new TParser(new CommonTokenStream(lexer)); 
    parser.parse(); 
    } 
} 

@lexer::members { 
    private boolean ignore = false; 
} 

parse 
: (t=. 
    {System.out.printf("[\%02d] type=\%s text='\%s'\n", $t.getCharPositionInLine(), tokenNames[$t.type], $t.text);} 
    )* EOF 
; 

A 
: {!ignore}?=> 'A' 
; 

START_IGNORE 
: 'foo' {ignore = true; skip();} 
; 

END_IGNORE 
: 'oof' {ignore = false; skip();} 
; 

IGNORE 
: {ignore}?=> . {skip();} 
;  

SPACE 
: ' ' {skip();} 
; 

运行这样的:

java -cp antlr-3.3.jar org.antlr.Tool T.g 
javac -cp antlr-3.3.jar *.java 
java -cp .:antlr-3.3.jar TParser

,它将打印以下内容:

[00] type=A text='A' 
[16] type=A text='A'

即:从输入"A foo A B C oof A"如下:"foo A B C oof"skip PED。

+0

我使用Eclipse插件编译等,但不是插件提供的解释器。从命令行编译我得到了和以前相同的结果,所以在我的代码中有一些奇怪的东西。通常我会接受我得到的解决方案,但还有其他一些问题。我会尽力找出造成这种行为的原因。 – 2012-07-09 20:40:21

+0

@HeinrichOdy,如果您使用的是v3.4,请尝试恢复到v3.3:根据我的经验,v3.3的问题较少。 – 2012-07-09 20:43:55

+0

请看我是否可以轻松更改版本,如果是的话,会尝试3.3,谢谢。 – 2012-07-09 20:49:23