Infinite loop, to debug
This commit is contained in:
		
							parent
							
								
									aa2dbbefae
								
							
						
					
					
						commit
						cf237b04eb
					
				| 
						 | 
					@ -11,6 +11,7 @@
 | 
				
			||||||
#include "Parsodus/lrtables/LR0Itemset.h"
 | 
					#include "Parsodus/lrtables/LR0Itemset.h"
 | 
				
			||||||
#include "Parsodus/lrtables/SLR1Itemset.h"
 | 
					#include "Parsodus/lrtables/SLR1Itemset.h"
 | 
				
			||||||
#include "Parsodus/lrtables/LR1Itemset.h"
 | 
					#include "Parsodus/lrtables/LR1Itemset.h"
 | 
				
			||||||
 | 
					#include "Parsodus/lrtables/LALR1Itemset.h"
 | 
				
			||||||
#include "Parsodus/util/parserType.h"
 | 
					#include "Parsodus/util/parserType.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace pds {
 | 
					namespace pds {
 | 
				
			||||||
| 
						 | 
					@ -32,6 +33,7 @@ namespace pds {
 | 
				
			||||||
                registerBackend(std::make_unique<T<lr::Generator<lr::LR0Itemset>>>(util::ParserType::LR_0)); 
 | 
					                registerBackend(std::make_unique<T<lr::Generator<lr::LR0Itemset>>>(util::ParserType::LR_0)); 
 | 
				
			||||||
                registerBackend(std::make_unique<T<lr::Generator<lr::SLR1Itemset>>>(util::ParserType::SLR_1)); 
 | 
					                registerBackend(std::make_unique<T<lr::Generator<lr::SLR1Itemset>>>(util::ParserType::SLR_1)); 
 | 
				
			||||||
                registerBackend(std::make_unique<T<lr::Generator<lr::LR1Itemset>>>(util::ParserType::LR_1));
 | 
					                registerBackend(std::make_unique<T<lr::Generator<lr::LR1Itemset>>>(util::ParserType::LR_1));
 | 
				
			||||||
 | 
					                registerBackend(std::make_unique<T<lr::Generator<lr::LALR1Itemset>>>(util::ParserType::LALR_1));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            
 | 
					            
 | 
				
			||||||
            /**
 | 
					            /**
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,24 @@
 | 
				
			||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					#ifndef PARSODUS_LRTABLES_LALR1ITEMSET_H_TJ1FUOEG
 | 
				
			||||||
 | 
					#define PARSODUS_LRTABLES_LALR1ITEMSET_H_TJ1FUOEG
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "Parsodus/lrtables/LR1ItemsetBase.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace pds {
 | 
				
			||||||
 | 
					namespace lr {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class LALR1Itemset : public LR1ItemsetBase<LALR1Itemset> {
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					    LALR1Itemset();
 | 
				
			||||||
 | 
					    LALR1Itemset(std::shared_ptr<Rule> start);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool canMerge(const LALR1Itemset& rhs) const;
 | 
				
			||||||
 | 
					    void merge(const LALR1Itemset& rhs);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} /* lr  */ 
 | 
				
			||||||
 | 
					} /* pds */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* PARSODUS_LRTABLES_LALR1ITEMSET_H_TJ1FUOEG */
 | 
				
			||||||
| 
						 | 
					@ -24,8 +24,8 @@ public:
 | 
				
			||||||
    bool empty() const;
 | 
					    bool empty() const;
 | 
				
			||||||
    std::set<std::size_t> getReduces(const Grammar& g, std::string lookahead) const;
 | 
					    std::set<std::size_t> getReduces(const Grammar& g, std::string lookahead) const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
private:
 | 
					protected:
 | 
				
			||||||
    std::set<LR1Item> m_items;
 | 
					    std::vector<LR1Item> m_items;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template <typename Itemset>
 | 
					template <typename Itemset>
 | 
				
			||||||
| 
						 | 
					@ -34,7 +34,7 @@ LR1ItemsetBase<Itemset>::LR1ItemsetBase()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template <typename Itemset>
 | 
					template <typename Itemset>
 | 
				
			||||||
LR1ItemsetBase<Itemset>::LR1ItemsetBase(std::shared_ptr<Rule> start) {
 | 
					LR1ItemsetBase<Itemset>::LR1ItemsetBase(std::shared_ptr<Rule> start) {
 | 
				
			||||||
    m_items.emplace(LR1Item{start, 0, {util::EOF_PLACEHOLDER}});
 | 
					    m_items.emplace_back(LR1Item{start, 0, {util::EOF_PLACEHOLDER}});
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template <typename Itemset>
 | 
					template <typename Itemset>
 | 
				
			||||||
| 
						 | 
					@ -78,13 +78,9 @@ void LR1ItemsetBase<Itemset>::close(const Grammar& g) {
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        std::vector<LR1Item> newItems;
 | 
					 | 
				
			||||||
        for (auto& it : m_items) {
 | 
					 | 
				
			||||||
            newItems.emplace_back(std::move(it));
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        for (const auto& newItem : toAdd) {
 | 
					        for (const auto& newItem : toAdd) {
 | 
				
			||||||
            bool found = false;
 | 
					            bool found = false;
 | 
				
			||||||
            for (auto& oldItem : newItems) {
 | 
					            for (auto& oldItem : m_items) {
 | 
				
			||||||
                if (newItem.dotIdx == oldItem.dotIdx && newItem.rule == oldItem.rule) {
 | 
					                if (newItem.dotIdx == oldItem.dotIdx && newItem.rule == oldItem.rule) {
 | 
				
			||||||
                    found = true;
 | 
					                    found = true;
 | 
				
			||||||
                    oldItem.lookaheads.insert(newItem.lookaheads.begin(), newItem.lookaheads.end());
 | 
					                    oldItem.lookaheads.insert(newItem.lookaheads.begin(), newItem.lookaheads.end());
 | 
				
			||||||
| 
						 | 
					@ -92,13 +88,9 @@ void LR1ItemsetBase<Itemset>::close(const Grammar& g) {
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (!found) {
 | 
					            if (!found) {
 | 
				
			||||||
                newItems.push_back(newItem);
 | 
					                m_items.push_back(newItem);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        m_items.clear();
 | 
					 | 
				
			||||||
        for (auto& it : newItems) {
 | 
					 | 
				
			||||||
            m_items.emplace(std::move(it));
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -108,7 +100,7 @@ Itemset LR1ItemsetBase<Itemset>::succ(std::string sym) const {
 | 
				
			||||||
    for (auto& item : m_items) {
 | 
					    for (auto& item : m_items) {
 | 
				
			||||||
        if (item.dotIdx < item.rule->tail.size()) {
 | 
					        if (item.dotIdx < item.rule->tail.size()) {
 | 
				
			||||||
            if (item.rule->tail[item.dotIdx] == sym) {
 | 
					            if (item.rule->tail[item.dotIdx] == sym) {
 | 
				
			||||||
                sc.m_items.insert(LR1Item{item.rule, item.dotIdx + 1, item.lookaheads});
 | 
					                sc.m_items.push_back(LR1Item{item.rule, item.dotIdx + 1, item.lookaheads});
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,12 +1,8 @@
 | 
				
			||||||
parser: SLR(1) 
 | 
					parser: lalr(1) 
 | 
				
			||||||
lexesis: lexer.lxs
 | 
					lexesis: lexer.lxs
 | 
				
			||||||
terminals:
 | 
					terminals:
 | 
				
			||||||
    TERMINAL
 | 
					    A B
 | 
				
			||||||
start: s
 | 
					start: s
 | 
				
			||||||
grammar:
 | 
					grammar:
 | 
				
			||||||
    s -> a s
 | 
					    s -> x x;
 | 
				
			||||||
           | b
 | 
					    x -> A x | B;
 | 
				
			||||||
           ;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    a → TERMINAL;
 | 
					 | 
				
			||||||
    b -> a;
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -25,6 +25,7 @@ add_library(Parsodus-tables
 | 
				
			||||||
    lrtables/SLR1Itemset.cpp
 | 
					    lrtables/SLR1Itemset.cpp
 | 
				
			||||||
    lrtables/LR1Item.cpp
 | 
					    lrtables/LR1Item.cpp
 | 
				
			||||||
    lrtables/LR1Itemset.cpp
 | 
					    lrtables/LR1Itemset.cpp
 | 
				
			||||||
 | 
					    lrtables/LALR1Itemset.cpp
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# add_library(Parsodus-backends
 | 
					# add_library(Parsodus-backends
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,49 @@
 | 
				
			||||||
 | 
					#include "Parsodus/lrtables/LALR1Itemset.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <cassert>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace pds {
 | 
				
			||||||
 | 
					namespace lr {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					LALR1Itemset::LALR1Itemset() : LR1ItemsetBase<LALR1Itemset>()
 | 
				
			||||||
 | 
					{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					LALR1Itemset::LALR1Itemset(std::shared_ptr<Rule> start) : LR1ItemsetBase<LALR1Itemset>(start)
 | 
				
			||||||
 | 
					{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool LALR1Itemset::canMerge(const LALR1Itemset& rhs) const {
 | 
				
			||||||
 | 
					    if (rhs.m_items.size() != m_items.size()) {
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (auto& rhsIt : rhs.m_items) {
 | 
				
			||||||
 | 
					        bool ok = false;
 | 
				
			||||||
 | 
					        for (auto& it : m_items) {
 | 
				
			||||||
 | 
					            if (it.rule == rhsIt.rule && it.dotIdx == rhsIt.dotIdx) {
 | 
				
			||||||
 | 
					                ok = true;
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (!ok)
 | 
				
			||||||
 | 
					            return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void LALR1Itemset::merge(const LALR1Itemset& rhs) {
 | 
				
			||||||
 | 
					    for (auto& toMerge : rhs.m_items) {
 | 
				
			||||||
 | 
					        bool found = false;
 | 
				
			||||||
 | 
					        for (auto& it : m_items) {
 | 
				
			||||||
 | 
					            if (it.rule == toMerge.rule && it.dotIdx == toMerge.dotIdx) {
 | 
				
			||||||
 | 
					                found = true;
 | 
				
			||||||
 | 
					                it.lookaheads.insert(toMerge.lookaheads.begin(), toMerge.lookaheads.end());
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        assert(found);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} /* lr  */ 
 | 
				
			||||||
 | 
					} /* pds  */ 
 | 
				
			||||||
		Loading…
	
		Reference in New Issue