Parsing 保留关键字与长标识符(多字)

Parsing 保留关键字与长标识符(多字),parsing,antlr4,lexer,Parsing,Antlr4,Lexer,我想创建一个具有友好函数名的MiniLang 这是我的示例脚本和预期语句 我想一些保留的关键字将在ID(多字标识符)之前匹配。但是ANTLR4只匹配ID。我尝试在ID之前定义关键字,但不影响效果 如何为ID之前要匹配的语句的关键字定义规则 谢谢 这是我的语法 grammar MiniLang; document : (stmt NL*)+ EOF ; stmt : Set Space+ IDs Space* '=' S

我想创建一个具有友好函数名的MiniLang
这是我的示例脚本和预期语句


我想一些保留的关键字将在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]
      ;

lexer尽可能多地匹配。因此,您需要将
IDs
规则改为解析器规则:

ids
 : ID+
 ;

Space
 : [ \t] -> skip
 ;
或者,如果要保留空格:

ids
 : ID (Space ID)*
 ;

非常感谢你!我更清楚地理解lexer和parser。
ids
 : ID (Space ID)*
 ;