0

所以,我正在尝试解析包含这样的 switch 语句的代码


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”关键字的第二个实例上失败,但不是第一个。为什么会这样?

4

1 回答 1

1

您的 caseStatements 的非递归分支不应该包含分号吗?

IE

caseStatements
    : caseStatement ";" caseStatements {
        ($1 : $3)
    }
    | caseStatement ";" {
        [$1]
    }
    ;
于 2011-04-30T04:00:41.607 回答