Парсинг операторов switch с Happy
Итак, я пытаюсь разобрать код, связывающий операторы переключателя, как это
function (a : Boolean) equals (b : Boolean) : Boolean {
switch (a) {
case true:
switch (b) {
case true:
return (true);
case false:
return (false);
}
case false:
switch (b) {
case true:
return (false);
case false:
return (true);
}
}
};
с
switch
: "switch" expression "{" cases "}" {
Switch $2 $4
}
;
cases
: case cases {
($1 : $2)
}
| case {
[$1]
}
;
case
: "case" pattern ":" caseStatements {
Case $2 $4
}
;
caseStatements
: caseStatement ";" caseStatements {
($1 : $3)
}
| caseStatement {
[$1]
}
;
caseStatement
: assignment {
AssignmentCaseStatement $1
}
| return {
ReturnCaseStatement $1
}
| switch {
SwitchCaseStatement $1
}
;
но я продолжаю получать:
certa: user error (../examples/Certa/BooleanLogic.certa:16: Parse error at token 'case')
когда я запускаю сгенерированный парсер. Странно то, что происходит сбой во втором экземпляре ключевого слова case, но не в первом. Почему в мире это будет?
1 ответ
Разве ваша нерекурсивная часть caseStatements не должна содержать точку с запятой?
т.е.
caseStatements
: caseStatement ";" caseStatements {
($1 : $3)
}
| caseStatement ";" {
[$1]
}
;