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!


Anmelden zum Antworten