Как я могу узнать подходящую альтернативу в родительском контексте? - PullRequest
1 голос
/ 09 мая 2020

Как я могу узнать совпадающую альтернативу в родительском контексте, например, в моей грамматике

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;

Я хотел бы знать в моей функции enterAssignVariableBlock совпадающую альтернативу.

@Override public void enterAssignVariableBlock(StudyParser.AssignVariableBlockContext ctx) {

   // switch matched alternative (simpleVariableAssign | listOfVariableAssign | referenceToVariable ) do
 }

1 Ответ

1 голос
/ 09 мая 2020

Метод 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
        }
    }
}
...