2016-02-03 44 views
0

在我(simplyfied)语法ANTLR4:空白和空间词汇处理

grammar test; 


    prog: stat+; 

    stat: 
       sourceDef ';' 
    ; 

    sourceDef: 
     SRC COLON ID 
    ; 



    STRING : '"' ('""'|~'"')* '"' ; // quote-quote is an escaped quote 

    LINE_COMMENT 
     : '//' (~('\n'|'\r'))* -> skip; 

    WS : [ \t\n\r]+ -> skip; 
    //SP : ' ' -> skip; 


    COMMENT : '/*' .*? '*/' -> skip; 
    LE: '<'; 
    MINUS: '-'; 
    GR: '>'; 
    COLON: ':' ; 
    HASH: '#'; 
    EQ: '='; 
    SEMI: ';'; 
    COMMA: ','; 
    AND: [Aa][Nn][Dd]; 
    SRC: [Ss][Rr][Cc]; 
    NUMBER: [0-9]; 
    ID: [a-zA-Z][a-zA-z0-9]+; 
    DAY: ('0'[1-9]|[12][0-9]|'3'[01]); 
    MONTH: ('0' [1-9]|'1'[012]); 
    YEAR: [0-2] [890] NUMBER NUMBER; 
    DATE: DAY [- /.] MONTH [- /.] YEAR; 

代码

源:XXX;

示出了语法错误:

extraneous input ' ' expecting ':' 

代码

src:xxx; 

解析细。

修改后的版本与

WS : [\t\n\r]+ -> skip; 
    SP : ' ' -> skip; 

正常工作与两个语法版本(带和不带空格)。 因此,这些空格似乎只能被跳过,如果它们被定义在 单独的规则中。

有毛病这个

WS : [ \t\n\r]+ -> skip; 

定义是什么?

还有什么可能导致这种(对我)意想不到的行为?

回答

0

我假设你已经找到解决方案,但为了记录。 您的空白词法规则应该是:

WS : (' '|'\r'|'\n'|'\t') -> channel(HIDDEN); 

在你的语法空间字符只是没有指定,仅此而已。

+0

这很令人困惑:这个定义有很多例子,所以我不这么认为,这可能就是问题所在。 你的意思是撇号是问题吗? – Mike75

+0

我不得不承认,我还没有测试过你的语法,但是如果它确实与单独定义的SP令牌一起工作,我敢打赌这就是原因。大概是这样,试试吧。我更喜欢使用'撇号'语法来表示正则表达式,因为它更具可读性。如果您想使用[]语法,请尝试[\ s \ r \ t \ n]。 – Divisadero