在ANTLR运行时修改终端的值

本文关键字:终端 修改 ANTLR 运行时 | 更新日期: 2023-09-27 18:11:13

假设我有一个像这样的简单语法:

name -> girl_name | boy_name;
girl_name -> 'Matilda' | 'Vicky' | 'Alice';
boy_name -> 'Spike' | 'Athos' | 'Mike';

,并在ANTLRv3中建模。在运行时,我是否可能对boy_name和girl_name终端可以接受的值集进行操作?

谢谢:)

在ANTLR运行时修改终端的值

在词法分析器语法中,您可以包含一个非常简单的NAME定义。

NAME : ('A'..'Z' | 'a'..'z')+;

然后通过创建fragment规则定义GIRL_NAMEBOY_NAME令牌。

fragment GIRL_NAME : ;
fragment BOY_NAME : ;

然后创建代码将NAME分配给GIRL_NAMEBOY_NAME

@members {
    public static final Set<String> GIRL_NAMES = new HashSet<String>();
    static {
        GIRL_NAMES.add("Matilda");
        GIRL_NAMES.add("Vicky");
        GIRL_NAMES.add("Alice");
    }
    public static final Set<String> BOY_NAMES = new HashSet<String>();
    static {
        BOY_NAMES.add("Spike");
        BOY_NAMES.add("Athos");
        BOY_NAMES.add("Mike");
    }
    public static final int ClassifyName(String name) {
        if (GIRL_NAMES.contains(name)) {
            return GIRL_NAME;
        } else if (BOY_NAMES.contains(name)) {
            return BOY_NAME;
        } else {
            return NAME;
        }
    }
}

然后,您可以使用嵌入的操作修改NAME规则,以分配适当的类型。

NAME
    :   ('A'..'Z' | 'a'..'z')+
        {$type = ClassifyName($text);}
    ;