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/SLR1Itemset.h"
|
||||
#include "Parsodus/lrtables/LR1Itemset.h"
|
||||
#include "Parsodus/lrtables/LALR1Itemset.h"
|
||||
#include "Parsodus/util/parserType.h"
|
||||
|
||||
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::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::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;
|
||||
std::set<std::size_t> getReduces(const Grammar& g, std::string lookahead) const;
|
||||
|
||||
private:
|
||||
std::set<LR1Item> m_items;
|
||||
protected:
|
||||
std::vector<LR1Item> m_items;
|
||||
};
|
||||
|
||||
template <typename Itemset>
|
||||
|
@ -34,7 +34,7 @@ LR1ItemsetBase<Itemset>::LR1ItemsetBase()
|
|||
|
||||
template <typename Itemset>
|
||||
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>
|
||||
|
@ -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) {
|
||||
bool found = false;
|
||||
for (auto& oldItem : newItems) {
|
||||
for (auto& oldItem : m_items) {
|
||||
if (newItem.dotIdx == oldItem.dotIdx && newItem.rule == oldItem.rule) {
|
||||
found = true;
|
||||
oldItem.lookaheads.insert(newItem.lookaheads.begin(), newItem.lookaheads.end());
|
||||
|
@ -92,13 +88,9 @@ void LR1ItemsetBase<Itemset>::close(const Grammar& g) {
|
|||
}
|
||||
}
|
||||
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) {
|
||||
if (item.dotIdx < item.rule->tail.size()) {
|
||||
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
|
||||
terminals:
|
||||
TERMINAL
|
||||
A B
|
||||
start: s
|
||||
grammar:
|
||||
s -> a s
|
||||
| b
|
||||
;
|
||||
|
||||
a → TERMINAL;
|
||||
b -> a;
|
||||
s -> x x;
|
||||
x -> A x | B;
|
||||
|
|
|
@ -25,6 +25,7 @@ add_library(Parsodus-tables
|
|||
lrtables/SLR1Itemset.cpp
|
||||
lrtables/LR1Item.cpp
|
||||
lrtables/LR1Itemset.cpp
|
||||
lrtables/LALR1Itemset.cpp
|
||||
)
|
||||
|
||||
# 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