Wie löse ich einen bison reduce/reduce Konflikt?

In einer anderen Frage dachte ich mir, dass es schöner wäre (alle anderen nicht...😋), wenn das Vorzeichen zur Zahl gehören würde, so dass das Potenzieren nicht das Vorzeichen abbindet... Da wollte ich mal sehen, ob man nicht einen Parser bauen kann, der es wie folgt versteht:Das läuft auch ganz gut, allerdings gibt es massenhaft sogenannte reduce/reduce Konflikte... Die bison Anleitung sagt zwar, dass diese Konflikte in meinem Sinne gelöst werden (die Regel, die zuerst kommt, die kriegt den Zuschlag), aber: Wie krieg ich die warning trotzdem weg?

Das da ist mein yy-file (auszugsweise):

exp:
   "-" "num"            { std::cout << "NUMinv" << $2 << std::endl; }
|  "num"                { $$ = new Float($1); std::cout << "num" << $1 << std::endl; }
|  "-" exp              { std::cout << "inv" << $2 << std::endl; }
|  exp "^" exp          { std::cout << '^' << std::endl; }
|  "name"               { std::cout << "var read:" << $1 << std::endl; };

bison sagt dann:

> bison -o viz-yy.c viz.yy -Wcounterexamples
viz.yy: warning: 10 reduce/reduce conflicts [-Wconflicts-rr]
viz.yy: warning: reduce/reduce conflict on tokens "+", "-", "*", "/", "^", ")", "]", "}", ",", ";" [-Wcounterexamples]
  Example: "-" "num" •
  First reduce derivation
    exp
    ↳ 5: "-" "num" •
  Second reduce derivation
    exp
    ↳ 8: "-" exp
             ↳ 6: "num" •
Cplusplus, FLEX, Programmiersprache, Syntax, Bison
C++: multiple definition...?

Hallo, ich habe in C++ einen Header erstellt, aber bei der Complierung kommt immer diese Fehlermeldung:

C:\Users\Admin\AppData\Local\Temp\ccdaLGOT.o:lexer.cpp:(.text+0x111): undefined reference to `Token::content[abi:cxx11]() const'
...(Zu lang zum abschicken)
collect2.exe: error: ld returned 1 exit status

Kann mir jemand sagen was der Fehler ist und wie ich ihn behebe?

token.hpp:

#ifndef TOKEN_HPP_
#define TOKEN_HPP_

#include <string>

class Token {
public:
    enum class Type {
        STRING,
        NUMBER,
        BOOLEAN,
        IDENTIFIER,
        EQUAL,
        PLUS,
        MINUS,
        TIMES,
        DIVIDE,
        LESS_THAN,
        GREATER_THAN,
        COMMENT,
        DOT,
        COMMA,
        SEMICOLON,
        CURLY_BRACKET_RIGHT,
        CURLY_BRACKET_LEFT,
        APOSTROPHE,
        COLON,
        UNEXPECTED
    };

    Token                (Type type)              noexcept;

    Type type            ()                       const noexcept;

    bool is                (Type type)               const noexcept;

    bool is_not            (Type type)               const noexcept;

    std::string content ()                       const noexcept;

    void change_content (std::string content)  const noexcept;

    void add_to_content (std::string content)  const noexcept;

    void clear_content  ()                       const noexcept;

    void change_type    (Type type)            const noexcept;

private:
    Type m_type;
    std::string m_content;
};

#endif

token.cpp:

#include "token.hpp"

#include <string>

Token::Token(Type type) noexcept : m_type{type} {};

Token::Type Token::type() const noexcept {
    return m_type;
}

bool Token::is(Type type) const noexcept {
    return m_type == type;
}

bool Token::is_not(Type type) const noexcept {
    return m_type != type;
}

std::string Token::content() const noexcept {
    return m_content;
}

void Token::change_content(std::string content) const noexcept {
    m_content = content;
}

void Token::add_to_content(std::string content) const noexcept {
    m_content = m_content + content;
}

void Token::clear_content() const noexcept {
    m_content.clear(); //Die clear Funktion geht auch nicht
}

void Token::change_type(Type type) const noexcept {
    m_type = type;
}

Ich hoffe jemand kann mir dabei helfen!

LG

PC, Computer, Software, programmieren, compiler, Cplusplus, CPP, development, Informatik, Informatiker, Programmiersprache, C (Programmiersprache), Cpp Programierung

Meistgelesene Beiträge zum Thema Cplusplus