ANTLR如何区分终端和正则表达式

时间:2012-11-07 16:21:18

标签: antlr

考虑以下简化语法:

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

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

现在,如果我将 boolean 写为输入,则可以将其解析为 ID TYPE 。我希望它被解析为 TYPE - 如何?

1 个答案:

答案 0 :(得分:1)

TYPE 放在 ID之前:

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

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

ANTLR的词法分析器规则如下:

  1. 尽可能匹配
  2. 如果在规则#1之后,两个或多个规则匹配相同数量的字符,请选择语法中首先定义的规则
  3. 由于这些规则,"boolean"被标记为TYPE,而"booleans"将被标记为ID 1


    1 "booleans" 标记为两个令牌:TYPE"boolean")和ID"s"))