私の Bison 文法規則の関連部分は次のとおりです。
statement:
expression ';' |
IF expression THEN statement ELSE statement END_IF ';'
;
expression:
IDENTIFIER |
IDENTIFIER '('expressions')' |
LIT_INT |
LIT_REAL |
BOOL_OP |
LOG_NOT expression |
expression operator expression |
'('expression')'
;
expressions:
expression |
expressions ',' expression
;
operator:
REL_OP |
ADD_OP |
MULT_OP |
LOG_OR |
LOG_AND
;
コンパイルすると、10 個のシフト/リデュースの競合が発生します。
5 つの競合は、 LOG_NOT 式ルールによって引き起こされます。
State 45
25 expression: LOG_NOT expression .
26 | expression . operator expression
REL_OP shift, and go to state 48
ADD_OP shift, and go to state 49
MULT_OP shift, and go to state 50
LOG_OR shift, and go to state 51
LOG_AND shift, and go to state 52
REL_OP [reduce using rule 25 (expression)]
ADD_OP [reduce using rule 25 (expression)]
MULT_OP [reduce using rule 25 (expression)]
LOG_OR [reduce using rule 25 (expression)]
LOG_AND [reduce using rule 25 (expression)]
$default reduce using rule 25 (expression)
operator go to state 54
5 つの競合は、式演算子の式規則によって発生します。
State 62
26 expression: expression . operator expression
26 | expression operator expression .
REL_OP shift, and go to state 48
ADD_OP shift, and go to state 49
MULT_OP shift, and go to state 50
LOG_OR shift, and go to state 51
LOG_AND shift, and go to state 52
REL_OP [reduce using rule 26 (expression)]
ADD_OP [reduce using rule 26 (expression)]
MULT_OP [reduce using rule 26 (expression)]
LOG_OR [reduce using rule 26 (expression)]
LOG_AND [reduce using rule 26 (expression)]
$default reduce using rule 26 (expression)
operator go to state 54
問題が優先順位に関係していることはわかっています。たとえば、式が次の場合:
a + b * c
Bison は a + の後に移動して式を見つけようとしますか、それとも a を式に還元しますか? これは Bison の 1 トークンの先読み制限によるものだと思いますが、競合を解決するためにルールを書き直す方法がわかりません。
私の教授は、シフト/リデュースの競合で減点するので、%expect を使用できません。私の教授は、%left または %right の優先順位の値を使用できないとも述べています。
これはスタックに関する私の最初の投稿です。投稿内容が間違っている場合はお知らせください。既存の投稿を検索しましたが、これは本当にケースバイケースのようです。Stack のコードを使用する場合は、提出したプロジェクトにソースを記載します。
ありがとう!