如何在antlr4中最好地将令牌转换为枚举?

时间:2014-06-19 14:39:07

标签: java antlr antlr4

我的语法规则如下:

expr : ENUMFILED IN '(' ENUMVALUE (',' ENUMVALUE)* ')' ;
ENUMFILED   :   'color' | 'food' | 'car';
ENUMVALUE   :   (ALPHANUMERIC)+;
DIGIT       :   '0'..'9' ;
LETTER      :   ('a'..'z' | 'A'..'Z');
ALPHANUMERIC:   (DIGIT | LETTER | '_');

所以我可以解析像:

这样的东西
car in (ford,toyota)
color in (red,blue,green)

在代码中,我想将这些值从in子句转换为枚举。对于每个组,我都有一个Enum类型,例如:

enum Car { FORD, TOYOTA, HONDA };
enum Color { RED, YELLOW, BLUE }; 

我稍后会用ParseTreeWalker多次遍历表达式,所以我想在解析它们时将值转换为枚举。这样做的好方法是什么?

请注意,我的语法还有很多,所以我可以在输入中多次出现相同的字段:例如car in (ford,toyota) .... car in (honda)

1 个答案:

答案 0 :(得分:0)

最好在枚举类中使用Map:

public enum Car {
   TOYOTA( "Toyota" ), PORSCHE( "Porsche" ),...
   ...
   private static Map<String,Car> s2car;
   public static String transCar( String s ){
       return s2car.get( s );
   }
   Car( String s ){
        s2car.put(s,this);
   } 
}