0

だから、私はこのようなスイッチステートメントを含むコードを解析しようとしています


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」キーワードの2 番目のインスタンスでは失敗するが、最初の では失敗しないことです。なぜそれが世界であるでしょうか?

4

1 に答える 1

1

caseStatements の非再帰レッグにセミコロンを含めるべきではありませんか?

すなわち

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