ANTLR如何区分terminal和regex

ANTLR如何区分terminal和regex,antlr,Antlr,考虑以下简化语法: ID : ('a'..'z') ('a'..'z')*; TYPE : 'int' '[' ']' | 'boolean' | 'int'; 现在,如果我写布尔值作为输入,它可以被解析为ID或TYPE。我希望它被解析为TYPE-how?将TYPE放在ID之前: TYPE : 'int' '[' ']' | 'boolean' | 'int' ; ID : ('a'..'z') ('a'

考虑以下简化语法:

ID  :   ('a'..'z') ('a'..'z')*;

TYPE    :   'int' '[' ']' |
        'boolean' |
        'int';
现在,如果我写布尔值作为输入,它可以被解析为ID或TYPE。我希望它被解析为TYPE-how?

TYPE
放在
ID
之前:

TYPE : 'int' '[' ']' 
     | 'boolean' 
     | 'int'
     ;

ID   : ('a'..'z') ('a'..'z')*
     ;
ANTLR的lexer规则的工作原理如下:

  • 尽可能匹配
  • 如果在规则#1之后,两个或多个规则匹配相同数量的字符,请选择语法中首先定义的规则
  • 由于这些规则,
    “boolean”
    标记为
    类型
    ,而
    “boolean”
    标记为
    ID
    1


    1
    “booleans”
    没有标记为两个标记:
    类型
    “boolean”
    )和
    标识
    “s”

    类型
    放在
    标识
    之前:

    TYPE : 'int' '[' ']' 
         | 'boolean' 
         | 'int'
         ;
    
    ID   : ('a'..'z') ('a'..'z')*
         ;
    
    ANTLR的lexer规则的工作原理如下:

  • 尽可能匹配
  • 如果在规则#1之后,两个或多个规则匹配相同数量的字符,请选择语法中首先定义的规则
  • 由于这些规则,
    “boolean”
    标记为
    类型
    ,而
    “boolean”
    标记为
    ID
    1


    1
    “booleans”
    未标记为两个标记:
    类型(
    “boolean”
    )和
    ID(
    “s”