假设我有一个如下所示的简单语法:
name -> girl_name | boy_name;
girl_name -> 'Matilda' | 'Vicky' | 'Alice';
boy_name -> 'Spike' | 'Athos' | 'Mike';
并在 ANTLRv3 中对其进行建模。是否有可能在运行时增加 boy_name 和 girl_name 终端可以采用的一组值?
谢谢 :)
在您的词法分析器语法中,您可以包含一个非常简单的NAME
.
NAME : ('A'..'Z' | 'a'..'z')+;
然后通过创建规则来定义GIRL_NAME
和标记。BOY_NAME
fragment
fragment GIRL_NAME : ;
fragment BOY_NAME : ;
然后,创建代码以将 a 分配NAME
给GIRL_NAME
或BOY_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);}
;