0

を使用して基本的な構文チェッカーを作成しようとしましたbisonc++

ルールは次のとおりです。

expression -> OPEN_BRACKET expression CLOSE_BRACKET
expression -> expression operator expression

operator -> PLUS
operator -> MINUS

コンパイルされたコードを実行しようとすると、次の行でエラーが発生します。

(a+b)-(c+d)

最初のルールが適用され、左端と右端の括弧が theOPEN_BRACKETと the になりCLOSE_BRACKETます。残りexpressionは次のとおりです。a+b)-(c+d

この動作を防ぐにはどうすればよいですか? 開き括弧と閉じ括弧を数えることは可能ですか?


編集

式の文法:

expression:
    OPEN_BRACKET expression CLOSE_BRACKET
    {
        //
    }        
| operator
    {
        //
    }        
| VARIABLE
    {
        //
    }

;


operator:
    expression PLUS expression
    {
        //
    }

| expression MINUS expression
    {
        //
    }

;

編集2

レクサー

CHAR  [a-z]
WS    [ \t\n]

%%

{CHAR}+     return Parser::VARIABLE;

"+"         return Parser::PLUS;
"-"         return Parser::MINUS;

"("         return Parser::OPEN_BRACKET;
")"         return Parser::CLOSE_BRACKET;
4

2 に答える 2

1

演算子のルールが適切ではありません。

試してみてください:

expression:
    OPEN_BRACKET expression CLOSE_BRACKET
    {
        //
    }

|

    expression operator expression
    {
        //
    }

|

    VARIABLE
    {
        //
    }

;


operator:
    PLUS
    {
        //
    }

|

    MINUS
    {
        //
    }
;

あなたの疑似コードが実際に示唆しているように...

于 2016-02-28T21:30:31.223 に答える