我如何在父上下文中知道匹配的替代项,例如在我的语法中
simpleAssign: name = ID '=' value = (STRING | BOOLEAN | INTEGER | DOUBLE );
simpleReference: name = ID '=' value = ID;
listAssign: name = ID '=' value = listString #listStringAssign;
assign: simpleAssign #simpleVariableAssign
| listAssign #listOfVariableAssign
| simpleReference #referenceToVariable
;
assignVariableBlock: assign + #assignVariabels;
我想知道在我的函数中输入分配变量块匹配的替代方案。
@Override public void enterAssignVariableBlock(StudyParser.AssignVariableBlockContext ctx) {
// switch matched alternative (simpleVariableAssign | listOfVariableAssign | referenceToVariable ) do
}
enter...
方法不会被称为enterAssignVariableBlock (...)
,而是enterAssignVariabels(...)
,因为您通过#assignVariabels
将其标记为这样。
尽管理想情况下,父级不应关心其子级的具体实现,但以下是从父规则中找出类型的方法:
@Override
public void enterAssignVariabels(StudyParser.AssignVariabelsContext ctx) {
for (StudyParser.AssignContext childCtx : ctx.assign()) {
if (childCtx instanceof StudyParser.SimpleVariableAssignContext) {
// #simpleVariableAssign
}
else if (childCtx instanceof StudyParser.ListOfVariableAssignContext) {
// #listOfVariableAssign
}
else {
// #referenceToVariable
}
}
}