使用Happy解析switch语句

时间:2011-04-29 22:14:39

标签: haskell 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 个答案:

答案 0 :(得分:1)

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

caseStatements
    : caseStatement ";" caseStatements {
        ($1 : $3)
    }
    | caseStatement ";" {
        [$1]
    }
    ;