保留关键字vs长识别码(多字)

时间:2014-02-21 07:39:20

标签: parsing antlr4 lexer

我想创建一个具有友好功能名称的MiniLang 这是我的示例脚本和预期声明

                              // 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 个答案:

答案 0 :(得分:1)

词法分析器尝试尽可能匹配。因此,您需要将IDs规则更改为解析器规则:

ids
 : ID+
 ;

Space
 : [ \t] -> skip
 ;

或者如果你要保留空格:

ids
 : ID (Space ID)*
 ;