1

假设我有一个如下所示的简单语法:

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

并在 ANTLRv3 中对其进行建模。是否有可能在运行时增加 boy_name 和 girl_name 终端可以采用的一组值?

谢谢 :)

4

1 回答 1

1

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

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

然后通过创建规则来定义GIRL_NAME和标记。BOY_NAMEfragment

fragment GIRL_NAME : ;
fragment BOY_NAME : ;

然后,创建代码以将 a 分配NAMEGIRL_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);}
    ;
于 2013-04-26T15:19:04.913 回答