conflicts: 2 shift/reduce
-
Hallo,
ich versuche einen kleinen Interpreter mit GNU Bison zu schreiben. Ich wollte fragen, ob irgendjemand den Unterschied zwischen der Direktive %right und %left erklären könnte und wo mein Fehler im folgenden Code liegt.%token <flo> FLO /* flo ist ein double */ %token <name> NAME %right '=' %left '+' '-' %left '*' '/' '%' %left '&' '|' 'x' %left NEG NOT LOGIC_NOT %left '^' %left ARG %type <flo> exp %% language: /* nothing */ | language statment statment: '\n' | exp | error { yyerrok; } ; exp: FLO { $$ = $1; } | NAME '(' ')' { $$ = ycall($1); } | NAME '(' exp ')' { $$ = ycall($1, $3); } | NAME '(' exp ',' exp ')' { $$ = ycall($1, $3, $5); } | NAME '=' exp { $$ = 1; ysetvar($1, $3); } | NAME %prec VAR { $$ = ygetvar($1); } | '_' exp %prec ARG { $$ = ygetarg($2, args); } | '(' exp ')' { $$ = $2; } /* 1 Operand */ | '-' exp %prec NEG { $$ = - $2; } | '~' exp %prec NOT { $$ = ~ static_cast<int>($2); } | '!' exp %prec LOGIC_NOT { $$ = ! static_cast<int>($2); } /* 2 Operands */ | exp '+' exp { $$ = $1 + $3; } | exp '-' exp { $$ = $1 - $3; } | exp '*' exp { $$ = $1 * $3; } | exp '/' exp { $$ = $1 / $3; } | exp '%' exp { $$ = static_cast<int>($1) % static_cast<int>($3); } | exp '^' exp { $$ = pow($1, $3); } | exp '&' exp { $$ = static_cast<int>($1) & static_cast<int>($3); } | exp '|' exp { $$ = static_cast<int>($1) | static_cast<int>($3); } | exp 'x' exp { $$ = static_cast<int>($1) ^ static_cast<int>($3); } ;
-
3.7.3 Operator Precedence schreibt:
The associativity of an operator op determines how repeated uses of the operator nest: whether ‘x op y op z’ is parsed by grouping x with y first or by grouping y with z first. %left specifies left-associativity (grouping x with y first) and %right specifies right-associativity (grouping y with z first). %nonassoc specifies no associativity, which means that ‘x op y op z’ is considered a syntax error.
@Mark22k sagte in conflicts: 2 shift/reduce:
wo mein Fehler im folgenden Code liegt.
Welcher Fehler? Erwartetes Ergebnis? Tatsächliches Ergebnis? Fehlermeldung?
-
@Swordfish Mit Fehler meine ich die Ausgabe: "Konflikte: 2 Schiebe/Reduziere"; Wie kann ich diesen Konflikt beheben?
-
Hast du es mit
--verbose
versucht um herauszufinden, was bison stört?
-
@Swordfish Es kam ein über 500 Zeilen lange Datei names filename.output:
Zustand 5 Konflikte: 1 Schiebe/Reduziere Zustand 13 Konflikte: 1 Schiebe/Reduziere Grammatik 0 $accept: language $end 1 language: /* leer */ 2 | language statment 3 statment: '\n' 4 | exp 5 | error 6 exp: FLO 7 | NAME '(' ')' 8 | NAME '(' exp ')' 9 | NAME '(' exp ',' exp ')' 10 | NAME '=' exp 11 | NAME 12 | '_' exp 13 | '(' exp ')' 14 | '-' exp 15 | '~' exp 16 | '!' exp 17 | exp '+' exp 18 | exp '-' exp 19 | exp '*' exp 20 | exp '/' exp 21 | exp '%' exp 22 | exp '^' exp 23 | exp '&' exp 24 | exp '|' exp 25 | exp 'x' exp Terminale und die Regeln, in denen sie verwendet werden $end (0) 0 '\n' (10) 3 '!' (33) 16 '%' (37) 21 '&' (38) 23 '(' (40) 7 8 9 13 ')' (41) 7 8 9 13 '*' (42) 19 '+' (43) 17 ',' (44) 9 '-' (45) 14 18 '/' (47) 20 '=' (61) 10 '^' (94) 22 '_' (95) 12 'x' (120) 25 '|' (124) 24 '~' (126) 15 error (256) 5 FLO (258) 6 NAME (259) 7 8 9 10 11 LOGIC_NOT (260) NOT (261) NEG (262) ARG (263) Nicht-Terminal und die Regeln, in denen sie verwendet werden $accept (26) auf der linken Seite: 0 language (27) auf der linken Seite: 1 2, auf der rechten Seite: 0 2 statment (28) auf der linken Seite: 3 4 5, auf der rechten Seite: 2 exp (29) auf der linken Seite: 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25, auf der rechten Seite: 4 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 Zustand 0 0 $accept: . language $end $default reduziere mit Regel 1 (language) language gehe zu Zustand 1 über Zustand 1 0 $accept: language . $end 2 language: language . statment $end schiebe und gehe zu Zustand 2 über error schiebe und gehe zu Zustand 3 über FLO schiebe und gehe zu Zustand 4 über NAME schiebe und gehe zu Zustand 5 über '-' schiebe und gehe zu Zustand 6 über '\n' schiebe und gehe zu Zustand 7 über '(' schiebe und gehe zu Zustand 8 über '_' schiebe und gehe zu Zustand 9 über '~' schiebe und gehe zu Zustand 10 über '!' schiebe und gehe zu Zustand 11 über statment gehe zu Zustand 12 über exp gehe zu Zustand 13 über Zustand 2 0 $accept: language $end . $default annehmen Zustand 3 5 statment: error . $default reduziere mit Regel 5 (statment) Zustand 4 6 exp: FLO . $default reduziere mit Regel 6 (exp) Zustand 5 7 exp: NAME . '(' ')' 8 | NAME . '(' exp ')' 9 | NAME . '(' exp ',' exp ')' 10 | NAME . '=' exp 11 | NAME . '=' schiebe und gehe zu Zustand 14 über '(' schiebe und gehe zu Zustand 15 über '(' [reduziere mit Regel 11 (exp)] $default reduziere mit Regel 11 (exp) Zustand 6 14 exp: '-' . exp FLO schiebe und gehe zu Zustand 4 über NAME schiebe und gehe zu Zustand 5 über '-' schiebe und gehe zu Zustand 6 über '(' schiebe und gehe zu Zustand 8 über '_' schiebe und gehe zu Zustand 9 über '~' schiebe und gehe zu Zustand 10 über '!' schiebe und gehe zu Zustand 11 über exp gehe zu Zustand 16 über Zustand 7 3 statment: '\n' . $default reduziere mit Regel 3 (statment) Zustand 8 13 exp: '(' . exp ')' FLO schiebe und gehe zu Zustand 4 über NAME schiebe und gehe zu Zustand 5 über '-' schiebe und gehe zu Zustand 6 über '(' schiebe und gehe zu Zustand 8 über '_' schiebe und gehe zu Zustand 9 über '~' schiebe und gehe zu Zustand 10 über '!' schiebe und gehe zu Zustand 11 über exp gehe zu Zustand 17 über Zustand 9 12 exp: '_' . exp FLO schiebe und gehe zu Zustand 4 über NAME schiebe und gehe zu Zustand 5 über '-' schiebe und gehe zu Zustand 6 über '(' schiebe und gehe zu Zustand 8 über '_' schiebe und gehe zu Zustand 9 über '~' schiebe und gehe zu Zustand 10 über '!' schiebe und gehe zu Zustand 11 über exp gehe zu Zustand 18 über Zustand 10 15 exp: '~' . exp FLO schiebe und gehe zu Zustand 4 über NAME schiebe und gehe zu Zustand 5 über '-' schiebe und gehe zu Zustand 6 über '(' schiebe und gehe zu Zustand 8 über '_' schiebe und gehe zu Zustand 9 über '~' schiebe und gehe zu Zustand 10 über '!' schiebe und gehe zu Zustand 11 über exp gehe zu Zustand 19 über Zustand 11 16 exp: '!' . exp FLO schiebe und gehe zu Zustand 4 über NAME schiebe und gehe zu Zustand 5 über '-' schiebe und gehe zu Zustand 6 über '(' schiebe und gehe zu Zustand 8 über '_' schiebe und gehe zu Zustand 9 über '~' schiebe und gehe zu Zustand 10 über '!' schiebe und gehe zu Zustand 11 über exp gehe zu Zustand 20 über Zustand 12 2 language: language statment . $default reduziere mit Regel 2 (language) Zustand 13 4 statment: exp . 17 exp: exp . '+' exp 18 | exp . '-' exp 19 | exp . '*' exp 20 | exp . '/' exp 21 | exp . '%' exp 22 | exp . '^' exp 23 | exp . '&' exp 24 | exp . '|' exp 25 | exp . 'x' exp '+' schiebe und gehe zu Zustand 21 über '-' schiebe und gehe zu Zustand 22 über '*' schiebe und gehe zu Zustand 23 über '/' schiebe und gehe zu Zustand 24 über '%' schiebe und gehe zu Zustand 25 über '&' schiebe und gehe zu Zustand 26 über '|' schiebe und gehe zu Zustand 27 über 'x' schiebe und gehe zu Zustand 28 über '^' schiebe und gehe zu Zustand 29 über '-' [reduziere mit Regel 4 (statment)] $default reduziere mit Regel 4 (statment) Zustand 14 10 exp: NAME '=' . exp FLO schiebe und gehe zu Zustand 4 über NAME schiebe und gehe zu Zustand 5 über '-' schiebe und gehe zu Zustand 6 über '(' schiebe und gehe zu Zustand 8 über '_' schiebe und gehe zu Zustand 9 über '~' schiebe und gehe zu Zustand 10 über '!' schiebe und gehe zu Zustand 11 über exp gehe zu Zustand 30 über Zustand 15 7 exp: NAME '(' . ')' 8 | NAME '(' . exp ')' 9 | NAME '(' . exp ',' exp ')' FLO schiebe und gehe zu Zustand 4 über NAME schiebe und gehe zu Zustand 5 über '-' schiebe und gehe zu Zustand 6 über '(' schiebe und gehe zu Zustand 8 über ')' schiebe und gehe zu Zustand 31 über '_' schiebe und gehe zu Zustand 9 über '~' schiebe und gehe zu Zustand 10 über '!' schiebe und gehe zu Zustand 11 über exp gehe zu Zustand 32 über Zustand 16 14 exp: '-' exp . 17 | exp . '+' exp 18 | exp . '-' exp 19 | exp . '*' exp 20 | exp . '/' exp 21 | exp . '%' exp 22 | exp . '^' exp 23 | exp . '&' exp 24 | exp . '|' exp 25 | exp . 'x' exp '^' schiebe und gehe zu Zustand 29 über $default reduziere mit Regel 14 (exp) Zustand 17 13 exp: '(' exp . ')' 17 | exp . '+' exp 18 | exp . '-' exp 19 | exp . '*' exp 20 | exp . '/' exp 21 | exp . '%' exp 22 | exp . '^' exp 23 | exp . '&' exp 24 | exp . '|' exp 25 | exp . 'x' exp '+' schiebe und gehe zu Zustand 21 über '-' schiebe und gehe zu Zustand 22 über '*' schiebe und gehe zu Zustand 23 über '/' schiebe und gehe zu Zustand 24 über '%' schiebe und gehe zu Zustand 25 über '&' schiebe und gehe zu Zustand 26 über '|' schiebe und gehe zu Zustand 27 über 'x' schiebe und gehe zu Zustand 28 über '^' schiebe und gehe zu Zustand 29 über ')' schiebe und gehe zu Zustand 33 über Zustand 18 12 exp: '_' exp . 17 | exp . '+' exp 18 | exp . '-' exp 19 | exp . '*' exp 20 | exp . '/' exp 21 | exp . '%' exp 22 | exp . '^' exp 23 | exp . '&' exp 24 | exp . '|' exp 25 | exp . 'x' exp $default reduziere mit Regel 12 (exp) Zustand 19 15 exp: '~' exp . 17 | exp . '+' exp 18 | exp . '-' exp 19 | exp . '*' exp 20 | exp . '/' exp 21 | exp . '%' exp 22 | exp . '^' exp 23 | exp . '&' exp 24 | exp . '|' exp 25 | exp . 'x' exp '^' schiebe und gehe zu Zustand 29 über $default reduziere mit Regel 15 (exp) Zustand 20 16 exp: '!' exp . 17 | exp . '+' exp 18 | exp . '-' exp 19 | exp . '*' exp 20 | exp . '/' exp 21 | exp . '%' exp 22 | exp . '^' exp 23 | exp . '&' exp 24 | exp . '|' exp 25 | exp . 'x' exp '^' schiebe und gehe zu Zustand 29 über $default reduziere mit Regel 16 (exp) Zustand 21 17 exp: exp '+' . exp FLO schiebe und gehe zu Zustand 4 über NAME schiebe und gehe zu Zustand 5 über '-' schiebe und gehe zu Zustand 6 über '(' schiebe und gehe zu Zustand 8 über '_' schiebe und gehe zu Zustand 9 über '~' schiebe und gehe zu Zustand 10 über '!' schiebe und gehe zu Zustand 11 über exp gehe zu Zustand 34 über Zustand 22 18 exp: exp '-' . exp FLO schiebe und gehe zu Zustand 4 über NAME schiebe und gehe zu Zustand 5 über '-' schiebe und gehe zu Zustand 6 über '(' schiebe und gehe zu Zustand 8 über '_' schiebe und gehe zu Zustand 9 über '~' schiebe und gehe zu Zustand 10 über '!' schiebe und gehe zu Zustand 11 über exp gehe zu Zustand 35 über Zustand 23 19 exp: exp '*' . exp FLO schiebe und gehe zu Zustand 4 über NAME schiebe und gehe zu Zustand 5 über '-' schiebe und gehe zu Zustand 6 über '(' schiebe und gehe zu Zustand 8 über '_' schiebe und gehe zu Zustand 9 über '~' schiebe und gehe zu Zustand 10 über '!' schiebe und gehe zu Zustand 11 über exp gehe zu Zustand 36 über Zustand 24 20 exp: exp '/' . exp FLO schiebe und gehe zu Zustand 4 über NAME schiebe und gehe zu Zustand 5 über '-' schiebe und gehe zu Zustand 6 über '(' schiebe und gehe zu Zustand 8 über '_' schiebe und gehe zu Zustand 9 über '~' schiebe und gehe zu Zustand 10 über '!' schiebe und gehe zu Zustand 11 über exp gehe zu Zustand 37 über Zustand 25 21 exp: exp '%' . exp FLO schiebe und gehe zu Zustand 4 über NAME schiebe und gehe zu Zustand 5 über '-' schiebe und gehe zu Zustand 6 über '(' schiebe und gehe zu Zustand 8 über '_' schiebe und gehe zu Zustand 9 über '~' schiebe und gehe zu Zustand 10 über '!' schiebe und gehe zu Zustand 11 über exp gehe zu Zustand 38 über Zustand 26 23 exp: exp '&' . exp FLO schiebe und gehe zu Zustand 4 über NAME schiebe und gehe zu Zustand 5 über '-' schiebe und gehe zu Zustand 6 über '(' schiebe und gehe zu Zustand 8 über '_' schiebe und gehe zu Zustand 9 über '~' schiebe und gehe zu Zustand 10 über '!' schiebe und gehe zu Zustand 11 über exp gehe zu Zustand 39 über Zustand 27 24 exp: exp '|' . exp FLO schiebe und gehe zu Zustand 4 über NAME schiebe und gehe zu Zustand 5 über '-' schiebe und gehe zu Zustand 6 über '(' schiebe und gehe zu Zustand 8 über '_' schiebe und gehe zu Zustand 9 über '~' schiebe und gehe zu Zustand 10 über '!' schiebe und gehe zu Zustand 11 über exp gehe zu Zustand 40 über Zustand 28 25 exp: exp 'x' . exp FLO schiebe und gehe zu Zustand 4 über NAME schiebe und gehe zu Zustand 5 über '-' schiebe und gehe zu Zustand 6 über '(' schiebe und gehe zu Zustand 8 über '_' schiebe und gehe zu Zustand 9 über '~' schiebe und gehe zu Zustand 10 über '!' schiebe und gehe zu Zustand 11 über exp gehe zu Zustand 41 über Zustand 29 22 exp: exp '^' . exp FLO schiebe und gehe zu Zustand 4 über NAME schiebe und gehe zu Zustand 5 über '-' schiebe und gehe zu Zustand 6 über '(' schiebe und gehe zu Zustand 8 über '_' schiebe und gehe zu Zustand 9 über '~' schiebe und gehe zu Zustand 10 über '!' schiebe und gehe zu Zustand 11 über exp gehe zu Zustand 42 über Zustand 30 10 exp: NAME '=' exp . 17 | exp . '+' exp 18 | exp . '-' exp 19 | exp . '*' exp 20 | exp . '/' exp 21 | exp . '%' exp 22 | exp . '^' exp 23 | exp . '&' exp 24 | exp . '|' exp 25 | exp . 'x' exp '+' schiebe und gehe zu Zustand 21 über '-' schiebe und gehe zu Zustand 22 über '*' schiebe und gehe zu Zustand 23 über '/' schiebe und gehe zu Zustand 24 über '%' schiebe und gehe zu Zustand 25 über '&' schiebe und gehe zu Zustand 26 über '|' schiebe und gehe zu Zustand 27 über 'x' schiebe und gehe zu Zustand 28 über '^' schiebe und gehe zu Zustand 29 über $default reduziere mit Regel 10 (exp) Zustand 31 7 exp: NAME '(' ')' . $default reduziere mit Regel 7 (exp) Zustand 32 8 exp: NAME '(' exp . ')' 9 | NAME '(' exp . ',' exp ')' 17 | exp . '+' exp 18 | exp . '-' exp 19 | exp . '*' exp 20 | exp . '/' exp 21 | exp . '%' exp 22 | exp . '^' exp 23 | exp . '&' exp 24 | exp . '|' exp 25 | exp . 'x' exp '+' schiebe und gehe zu Zustand 21 über '-' schiebe und gehe zu Zustand 22 über '*' schiebe und gehe zu Zustand 23 über '/' schiebe und gehe zu Zustand 24 über '%' schiebe und gehe zu Zustand 25 über '&' schiebe und gehe zu Zustand 26 über '|' schiebe und gehe zu Zustand 27 über 'x' schiebe und gehe zu Zustand 28 über '^' schiebe und gehe zu Zustand 29 über ')' schiebe und gehe zu Zustand 43 über ',' schiebe und gehe zu Zustand 44 über Zustand 33 13 exp: '(' exp ')' . $default reduziere mit Regel 13 (exp) Zustand 34 17 exp: exp . '+' exp 17 | exp '+' exp . 18 | exp . '-' exp 19 | exp . '*' exp 20 | exp . '/' exp 21 | exp . '%' exp 22 | exp . '^' exp 23 | exp . '&' exp 24 | exp . '|' exp 25 | exp . 'x' exp '*' schiebe und gehe zu Zustand 23 über '/' schiebe und gehe zu Zustand 24 über '%' schiebe und gehe zu Zustand 25 über '&' schiebe und gehe zu Zustand 26 über '|' schiebe und gehe zu Zustand 27 über 'x' schiebe und gehe zu Zustand 28 über '^' schiebe und gehe zu Zustand 29 über $default reduziere mit Regel 17 (exp) Zustand 35 17 exp: exp . '+' exp 18 | exp . '-' exp 18 | exp '-' exp . 19 | exp . '*' exp 20 | exp . '/' exp 21 | exp . '%' exp 22 | exp . '^' exp 23 | exp . '&' exp 24 | exp . '|' exp 25 | exp . 'x' exp '*' schiebe und gehe zu Zustand 23 über '/' schiebe und gehe zu Zustand 24 über '%' schiebe und gehe zu Zustand 25 über '&' schiebe und gehe zu Zustand 26 über '|' schiebe und gehe zu Zustand 27 über 'x' schiebe und gehe zu Zustand 28 über '^' schiebe und gehe zu Zustand 29 über $default reduziere mit Regel 18 (exp) Zustand 36 17 exp: exp . '+' exp 18 | exp . '-' exp 19 | exp . '*' exp 19 | exp '*' exp . 20 | exp . '/' exp 21 | exp . '%' exp 22 | exp . '^' exp 23 | exp . '&' exp 24 | exp . '|' exp 25 | exp . 'x' exp '&' schiebe und gehe zu Zustand 26 über '|' schiebe und gehe zu Zustand 27 über 'x' schiebe und gehe zu Zustand 28 über '^' schiebe und gehe zu Zustand 29 über $default reduziere mit Regel 19 (exp) Zustand 37 17 exp: exp . '+' exp 18 | exp . '-' exp 19 | exp . '*' exp 20 | exp . '/' exp 20 | exp '/' exp . 21 | exp . '%' exp 22 | exp . '^' exp 23 | exp . '&' exp 24 | exp . '|' exp 25 | exp . 'x' exp '&' schiebe und gehe zu Zustand 26 über '|' schiebe und gehe zu Zustand 27 über 'x' schiebe und gehe zu Zustand 28 über '^' schiebe und gehe zu Zustand 29 über $default reduziere mit Regel 20 (exp) Zustand 38 17 exp: exp . '+' exp 18 | exp . '-' exp 19 | exp . '*' exp 20 | exp . '/' exp 21 | exp . '%' exp 21 | exp '%' exp . 22 | exp . '^' exp 23 | exp . '&' exp 24 | exp . '|' exp 25 | exp . 'x' exp '&' schiebe und gehe zu Zustand 26 über '|' schiebe und gehe zu Zustand 27 über 'x' schiebe und gehe zu Zustand 28 über '^' schiebe und gehe zu Zustand 29 über $default reduziere mit Regel 21 (exp) Zustand 39 17 exp: exp . '+' exp 18 | exp . '-' exp 19 | exp . '*' exp 20 | exp . '/' exp 21 | exp . '%' exp 22 | exp . '^' exp 23 | exp . '&' exp 23 | exp '&' exp . 24 | exp . '|' exp 25 | exp . 'x' exp '^' schiebe und gehe zu Zustand 29 über $default reduziere mit Regel 23 (exp) Zustand 40 17 exp: exp . '+' exp 18 | exp . '-' exp 19 | exp . '*' exp 20 | exp . '/' exp 21 | exp . '%' exp 22 | exp . '^' exp 23 | exp . '&' exp 24 | exp . '|' exp 24 | exp '|' exp . 25 | exp . 'x' exp '^' schiebe und gehe zu Zustand 29 über $default reduziere mit Regel 24 (exp) Zustand 41 17 exp: exp . '+' exp 18 | exp . '-' exp 19 | exp . '*' exp 20 | exp . '/' exp 21 | exp . '%' exp 22 | exp . '^' exp 23 | exp . '&' exp 24 | exp . '|' exp 25 | exp . 'x' exp 25 | exp 'x' exp . '^' schiebe und gehe zu Zustand 29 über $default reduziere mit Regel 25 (exp) Zustand 42 17 exp: exp . '+' exp 18 | exp . '-' exp 19 | exp . '*' exp 20 | exp . '/' exp 21 | exp . '%' exp 22 | exp . '^' exp 22 | exp '^' exp . 23 | exp . '&' exp 24 | exp . '|' exp 25 | exp . 'x' exp $default reduziere mit Regel 22 (exp) Zustand 43 8 exp: NAME '(' exp ')' . $default reduziere mit Regel 8 (exp) Zustand 44 9 exp: NAME '(' exp ',' . exp ')' FLO schiebe und gehe zu Zustand 4 über NAME schiebe und gehe zu Zustand 5 über '-' schiebe und gehe zu Zustand 6 über '(' schiebe und gehe zu Zustand 8 über '_' schiebe und gehe zu Zustand 9 über '~' schiebe und gehe zu Zustand 10 über '!' schiebe und gehe zu Zustand 11 über exp gehe zu Zustand 45 über Zustand 45 9 exp: NAME '(' exp ',' exp . ')' 17 | exp . '+' exp 18 | exp . '-' exp 19 | exp . '*' exp 20 | exp . '/' exp 21 | exp . '%' exp 22 | exp . '^' exp 23 | exp . '&' exp 24 | exp . '|' exp 25 | exp . 'x' exp '+' schiebe und gehe zu Zustand 21 über '-' schiebe und gehe zu Zustand 22 über '*' schiebe und gehe zu Zustand 23 über '/' schiebe und gehe zu Zustand 24 über '%' schiebe und gehe zu Zustand 25 über '&' schiebe und gehe zu Zustand 26 über '|' schiebe und gehe zu Zustand 27 über 'x' schiebe und gehe zu Zustand 28 über '^' schiebe und gehe zu Zustand 29 über ')' schiebe und gehe zu Zustand 46 über Zustand 46 9 exp: NAME '(' exp ',' exp ')' . $default reduziere mit Regel 9 (exp)
Und ich habe leider kein Wissen, wie man diese interpretiert.
-
@Mark22k sagte in conflicts: 2 shift/reduce:
'(' schiebe und gehe zu Zustand 15 über '(' [reduziere mit Regel 11 (exp)]
und
'-' schiebe und gehe zu Zustand 22 über // ... '-' [reduziere mit Regel 4 (statment)]
schaut wie ein Konflikt aus?
Aber ich fürchte erklären muss es dir jemand, der Ahnung von bison hat. Also nicht ich.
-
@Swordfish Und wie würde ich diesen Konflikt beheben?
-
@Mark22k Bei mir kommt eine Warnung (hat aber nichts mit dem Fehler zu tun):
test.y:28.11-61: Warnung: Token für %prec ist nicht definiert: VAR [-Wother] | NAME %prec VAR { $$ = ygetvar($1); } ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Ich würde empfehlen ganz klein anzufangen und dann Regel für Regel hinzufügen.
Ich gehe davon aus das es sich um eine Zeilenorientierte Sprache handeln soll. In dem Fall fehlt einfach ein `\n`:
statment: '\n' | exp /* Hier ! */ | error { yyerrok; }
Wenn du dich hobbymäßig einarbeiten willst empfehle ich dir ein Buch: Linux / Unix Profitools von Addison Wesley. Gibts bestimmt für ein paar € in der Bucht.
Wenn du es professionell lernen willst vergiss es und guck dich bei Boost um. Ansonsten ist die Umstellung wieder Arbeit. Weiß nicht ob lex/yacc (flex/bison) noch großartig weiterentwickelt wird. C++ war ein Krampf damit (es gab wrapper glaub). Guck lieber nach Boost Spirit, bzw Nachfolger (bin nicht uptodate).
Ich korriegiere mich: Nehme von vornherein Boost.
hth
-
Warum? Wir benutzen in der Arbeit beides, privat hab ich mich auch etwas mit boost spirit x3 beschäftigt. Kann das jetzt nicht uneingeschränkt empfehlen. Es hat schon was, aber es ist auch sehr kompliziert (typischer Fall von Templates missbraucht bis zum geht nicht mehr) und schränkt auch recht stark ein. Außerdem braucht es sehr lang zum Kompilieren und was die Performance angeht, bin ich auch nicht überzegt (hatte aber keine Lust, das genauer zu untersuchen).
Ich weiß jetzt auch nicht, inwiefern bison weiterentwickelt wird, aber es kann doch schon alles, was man braucht. Wir haben etliche Parser, die bei uns verschiedene Leute vor etlichen Jahren geschrieben haben, damit hatten wir noch nie Probleme und die sind auch wartbar. Selbst, wenn man sich nur oberflächlich damit auskennt, wie ich. Die boost Parser sind hingegen versteht kaum jemand, und wenn man versucht, da was dran zu ändern, wird man von Template Fehlern erschlagen.
-
@Mechanics Danke für die Info. hatte mich vor ein paar Jahren nochmal mit bison beschäftigt. Aber ich meine überall gelesen zu haben das man bison nicht mehr nutzt. Alleine weil die C++-Unterstützung so lala war (Kann mich noch an sowas wie bison++ erinnern, oder yacc++). Dann hatte ich mir Spirit angeguckt und war mir auch etwas hakelig. Aber ich dachte mir das es daran liegt das ich mich mit bison halbwegs auskenne und von templates keine Ahnung hatte.
Freut mich zu hören das man es weiterhin nutzt. Habe ich ein paar Erfahrungswerte die ich nicht abschreiben muss
Hatte mich in den 00ler-Jahren tatsächlich recht viel mit beschäftigt. Das obiger Buch kann ich absolut dafür empfehlen. Waren auch viele Beispiele drin bis hin zu demangling von komplexen c-funktionen.
cu
-
Was mir selber am besten gefallen hat, war ANTLR, allerdings mit C#. Ich kann jetzt nicht einschätzen, wie gut da die Unterstützung für C++ ist.
-
@dirkski Danke für deine Antwort. Ich habe das Programm jetzt auch vervollstängigen können. Ich habe wärend der Programmierung des Interpreters das "\n" vergemacht, weil es beim Parsen einen Syntax error ergab, wenn in der zu Parsenden Datei keine leere Zeile war. Ich habe es jetzt so gelöst, das das Programm bevor es an yyparse() übergeben wird, eine Zeile hinzufügt. Außerdem habe ich es so eingerichtet, dass man auch ein ";" nutzen kann. Habe mir sehr über die gute und schnelle Antwort gefreut!