在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终端可以接受的值集进行操作?
谢谢:)
在词法分析器语法中,您可以包含一个非常简单的NAME
定义。
NAME : ('A'..'Z' | 'a'..'z')+;
然后通过创建fragment
规则定义GIRL_NAME
和BOY_NAME
令牌。
fragment GIRL_NAME : ;
fragment BOY_NAME : ;
然后创建代码将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);}
;