2014-02-21 118 views
0

我想創建的minilang友好的函數名
這是我的示例腳本和預期的聲明
保留關鍵字VS長Identider(多字)

       // actual     // expected  
set a = true;     // 'set a' -> IDs    // 'set' -> Set, 'a' -> IDS  
Set name ('hello');   // 'Set name' -> IDs   // 'Set name' -> IDs  
set b = my friendly variable; // 'set b' -> IDs    // 'set' -> Set, 'b' -> IDS  
set my variable = 10;   // 'set my variable' -> IDs // 'set' -> Set, 'my variable' -> IDs  
Calculate sum (1, 2, 4);  // 'Calculate sum' -> IDs  // 'Calculate sum' -> IDs 


我想有些保留關鍵字將在ID(具有多個詞的標識符)之前匹配。但ANTLR4只匹配ID。我嘗試在ID之前定義關鍵字但不起作用。

如何定義規則語句的關鍵詞ID之前匹配

謝謝!

這是我的語法

grammar MiniLang; 

    document  
     : (stmt NL*)+ EOF 
     ; 
    stmt   
     : Set Space+ IDs Space* '=' Space* expr Space* ';'       # SetStatement 
     | IDs Space* '(' Space* (expr (Space*(',' expr))*)? Space* ')' Space* ';' # FunctionCall 
     ; 
    expr 
     : atom 
     ; 
    atom  
     : IDs 
     | Number 
     | String 
     ; 
    Set   
     : 'set' 
     ; 
    Space  
     : ' ' 
     ; 
    Number   
     : [0-9]+ 
     ; 
    ID   
     : [a-zA-Z][a-zA-Z0-9]* 
     ; 
    IDs   
     : ID (Space ID)* 
     ; 
    String  
     : ['] (~['\r\n\\] | EscapeSequence)* ['] 
     ; 
    EscapeSequence  
     : '\\' ['] 
     ; 
    NL   
     : [\r\n] 
     ; 

回答

1

詞法分析器試圖儘可能地匹配。因此,您需要更改IDs規則爲解析器規則來代替:

ids 
: ID+ 
; 

Space 
: [ \t] -> skip 
; 

或者,如果你要保持空間:

ids 
: ID (Space ID)* 
; 
+0

太謝謝你了!我更清楚地理解詞法分析器和解析器。 – hoangitk