2016-02-03 49 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