summaryrefslogtreecommitdiffstats
path: root/src/generator_slr.hpp
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2015-04-10 03:04:22 +0200
committerMatthias Schiffer <mschiffer@universe-factory.net>2015-04-10 03:04:22 +0200
commit8feccee75dadbf970b2fb402a8c624ed9b25f041 (patch)
tree897ed0229550ee72bdc69899432161a3dd696371 /src/generator_slr.hpp
parent70fc6ba8d2753492b2d4726f2718a2724bbf399a (diff)
downloadsolar-8feccee75dadbf970b2fb402a8c624ed9b25f041.tar
solar-8feccee75dadbf970b2fb402a8c624ed9b25f041.zip
generator_slr: implement first and follow set generation
Diffstat (limited to 'src/generator_slr.hpp')
-rw-r--r--src/generator_slr.hpp22
1 files changed, 21 insertions, 1 deletions
diff --git a/src/generator_slr.hpp b/src/generator_slr.hpp
index 9a2cd42..53ea89d 100644
--- a/src/generator_slr.hpp
+++ b/src/generator_slr.hpp
@@ -32,8 +32,28 @@
namespace solar {
class generator_slr_t : public generator_t {
+private:
+ std::map<std::pair<size_t, symbol_t>, size_t> reductions;
+
+ std::map<std::string, std::set<symbol_t>> first_sets;
+ std::map<std::string, std::set<symbol_t>> follow_sets;
+
+ void generate_first_sets();
+ void generate_follow_sets();
+
+protected:
+ virtual bool has_reduce_conflict(size_t from, const symbol_t &sym);
+ virtual void add_reduction(size_t from, size_t rule);
+
public:
- generator_slr_t(const grammar_t &grammar) : generator_t(grammar) {}
+ const std::map<std::pair<size_t, symbol_t>, size_t> & get_reductions() const {
+ return reductions;
+ }
+
+ generator_slr_t(const grammar_t &grammar) : generator_t(grammar) {
+ generate_follow_sets();
+ generate();
+ }
};
}