Ich versuche, die r/r und s/r Konflikte in der folgenden Bison GrammatikLösen verringern/verringern und verschieben/reduzieren Konflikte in Bison Grammatik
%right TOK_IF TOK_ELSE
%right '='
%left TOK_EQ TOK_NE '<' TOK_LE '>' TOK_GE
%left '+' '-'
%left '*' '/' '%'
%right TOK_POS TOK_NEG '!' TOK_NEW
%left TOK_BLK '.' TOK_CALL
%precedence TOK_PARENT
%start start
expr : expr BINOP expr {$$=$2->adopt($1,$2);}
| UNOP {$$ = $1;}
| allocator {$$ = $1;}
| call {$$ = $1;}
| expr '[' expr ']' %prec TOK_BLK {
destroy($4);
$$ = $2->adopt($1,$3);}
| '(' expr ')' %prec TOK_PARENT {$$ = $2;}
| expr '.' expr {$$ = $2->adopt($1,$3);}
| variable {$$= $1;}
| constant {$$ = $1;}
;
BINOP : TOK_IF {$$ = $1;}
| TOK_ELSE {$$ = $1;}
| '=' {$$ = $1;}
| TOK_EQ {$$ = $1;}
| TOK_NE {$$ = $1;}
| '<' {$$ = $1;}
| TOK_LE {$$ = $1;}
| '>' {$$ = $1;}
| TOK_GE {$$ = $1;}
| '+' {$$ = $1;}
| '-' {$$ = $1;}
| '*' {$$ = $1;}
| '/' {$$ = $1;}
| '%' {$$ = $1;}
;
UNOP : '+' expr %prec TOK_POS {
$1->swap_token_code(TOK_POS);
$$ = $1->adopt($2);
}
| '-' expr %prec TOK_NEG{
$1->swap_token_code(TOK_NEG);
$$ = $1->adopt($2);
}
| '!' expr {$$ = $1->adopt($2);}
;
allocator : TOK_NEW TOK_IDENT '('')' {
destroy($3);
$2->swap_token_code(TOK_TYPEID);
$$ = $1->adopt($2);
}
| TOK_NEW TOK_STRING '(' expr ')'{
}
| TOK_NEW basetype '[' expr ']'{
destroy($3);destroy($5);
$1->swap_token_code(TOK_NEWARRAY);
$$ = $1->adopt($2,$4);
}
;
call : TOK_IDENT '(' exprs ')' %prec TOK_CALL{
destroy($4);
$2->swap_token_code(TOK_CALL);
$$ = ($2->adopt($1))->cannibalize($3);
}
;
exprs : exprs expr {$$ = $1->adopt($2);}
| {$$ = new astree ('{',{0,0,0}, "}");}
;
variable : TOK_IDENT {$$ = $1;}
| expr '[' expr ']'{
destroy($4);
$$ = $2->adopt($1,$3);
}
| expr '.' TOK_IDENT {$$ = $2->adopt($1,$3);}
;
constant :TOK_INTCON {$$ = $1;}
|TOK_CHARCON {$$ = $1;}
|TOK_STRINGCON {$$ = $1;}
|TOK_NULL {$$ = $1;}
;
%%
Ich denke, das Problem ist die Regel ausdr zu lösen: expr BINOP expr, denn wenn ich es loslasse, hört es auf, diese Konflikte zu zeigen. Ich habe die Vorrangregeln oben erklärt, um Konflikte zu vermeiden/zu reduzieren, aber es sieht so aus, als würde es nicht funktionieren. Kann mir jemand beim Debuggen einer mehrdeutigen Grammatik Abkürzungen geben? Ignoriere die semantischen Regeln.
parser.y: warning: 24 shift/reduce conflicts [-Wconflicts-sr]
parser.y: warning: 56 reduce/reduce conflicts [-Wconflicts-rr]
parser.y:140.14-143.12: warning: rule useless in parser due to conflicts [-Wother]
| expr '[' expr ']'{
^^^^^^^^^^^
parser.y:144.14-56: warning: rule useless in parser due to conflicts [-Wother]
| expr '.' TOK_IDENT {$$ = $2->adopt($1,$3);}
UPDATE: entdeckte ich ein Problem in meinem Verständnis
Obwohl ich die richtigen Ergebnisse bin immer, mein Compiler immer wieder sagt, dass es eine Verschiebung/Konflikt in der folgenden Grammatik reduzieren. Ich denke, es sollte keine Konflikte geben, weil ich Präzedenz und Assoziativität richtig angegeben habe.
%left '+'
%left '*'
%%
expr : expr BINOP expr
| TOK_INTCON
BINOP : '+'
| '*'
%%
Keine Antwort, aber einige Ihrer Code-Aktionen sind falsch. Es gibt keinen Grund, ein ']' zu DESTROY zu machen oder den binären Operator als Argument für 'adopt()' zu verwenden. – EJP
Danke für die Rückmeldung. Eine Antwort auf mein letztgenanntes Problem wäre ausreichend. – patzi