Синтаксический анализ операторов переключения с Happy - PullRequest
0 голосов
/ 30 апреля 2011

Итак, я пытаюсь разобрать код, связывающий операторы переключателя, как это


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", но не на first . Почему в мире это будет?

1 Ответ

1 голос
/ 30 апреля 2011

Разве ваша нерекурсивная часть caseStatements не должна содержать точку с запятой?

т.е.

caseStatements
    : caseStatement ";" caseStatements {
        ($1 : $3)
    }
    | caseStatement ";" {
        [$1]
    }
    ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...