2014-02-21 5 views
0

Я хотел бы создать MiniLang с дружественным именем функции
Это мой пример сценария и ожидается утверждение
Зарезервированные ключевые слова против длинного 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 


Я хотел бы некоторые защищены ключевые слова будут сопоставлены перед идентификаторами (идентификатор с несколькими словами). Но ANTLR4 соответствует только идентификаторам. Я пытаюсь определить ключевые слова перед идентификаторами, но не влияю.

Как определить правило для ключевого слова заявления быть согласованы до того идентификаторами

Спасибо!

Это моя грамматика

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

Спасибо так много! Я более отчетливо понимаю lexer vs parser. – hoangitk

Смежные вопросы