を使用して基本的な構文チェッカーを作成しようとしました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;