compiler / LR1.h
LR1.h
Raw
#ifndef LR1_H
#define LR1_H
#include <vector>
#include <string>
#include <utility>
#include <fstream>

class LR1Node {
    private:
        std::string s;
        std::vector<LR1Node *> children;
    public:
        LR1Node(std::string s);
        ~LR1Node();
        void addchild(LR1Node * child);
        void addToVector(std::vector<std::string> &v);
};

class LR1 {
    private:
        std::vector<std::string> symbols;
        std::vector<std::string> nonTerminals;
        std::vector<std::string> terminals;
        std::string start;
        std::vector<std::string> rules;
        std::vector<std::vector<std::pair<std::pair<int, std::string>, int>>> reduceRules;
        std::vector<std::vector<std::pair<std::pair<int, std::string>, int>>> shiftRules;
        std::vector<int> stateStack;
        std::vector<std::string> symStack;
        int states;
        std::ifstream parseFile;
        std::vector<LR1Node *> TreeStack;

        bool parseUtil(std::string in);

    public:
        LR1();
        ~LR1();

        void term(int in);
        void nonTerm(int in);
        void startSym();
        void addRules(int in);
        void statesNum();
        void shiftReduceRules(int in);
        void initialize();
        void parse(std::vector<std::string> &tokens);
        int shift(std::string in);
        std::vector<std::string> generate();
};

class ParsingFailure {
    int prefix;

  public:
    ParsingFailure(int prefix);

    // Returns the message associated with the exception.
    const std::string what() const;
};

#endif