mirror of
https://github.com/yhirose/cpp-peglib.git
synced 2024-12-22 11:55:30 +00:00
Simplified API.
This commit is contained in:
parent
0744fa75f6
commit
30971d28de
13
README.md
13
README.md
@ -93,7 +93,6 @@ struct SemanticValue {
|
||||
// Utility method
|
||||
template <typename T> T& get();
|
||||
template <typename T> const T& get() const;
|
||||
std::string str() const;
|
||||
};
|
||||
|
||||
struct SemanticValues : protected std::vector<SemanticValue>
|
||||
@ -102,16 +101,10 @@ struct SemanticValues : protected std::vector<SemanticValue>
|
||||
size_t n; // Token length
|
||||
size_t choice; // Choice number (0 based index)
|
||||
|
||||
using std::vector<T>::size;
|
||||
using std::vector<T>::operator[];
|
||||
using std::vector<T>::begin;
|
||||
using std::vector<T>::end;
|
||||
// NOTE: There are more std::vector methods available...
|
||||
|
||||
// Transform the semantice values vector to another vector
|
||||
template <typename F> auto map(size_t beg, size_t end, F f) const -> vector<typename std::remove_const<decltype(f(SemanticValue()))>::type>;
|
||||
template <typename F> auto map(F f) const -> vector<typename std::remove_const<decltype(f(SemanticValue()))>::type>;
|
||||
template <typename T> auto map(size_t beg = 0, size_t end = -1) const -> vector<T>;
|
||||
template <typename F> auto transform(size_t beg, size_t end, F f) const -> vector<typename std::remove_const<decltype(f(SemanticValue()))>::type>;
|
||||
template <typename F> auto transform(F f) const -> vector<typename std::remove_const<decltype(f(SemanticValue()))>::type>;
|
||||
template <typename T> auto transform(size_t beg = 0, size_t end = -1) const -> vector<T>;
|
||||
}
|
||||
```
|
||||
|
||||
|
27
peglib.h
27
peglib.h
@ -171,10 +171,6 @@ struct SemanticValue
|
||||
const T& get() const {
|
||||
return val.get<T>();
|
||||
}
|
||||
|
||||
std::string str() const {
|
||||
return std::string(s, n);
|
||||
}
|
||||
};
|
||||
|
||||
struct SemanticValues : protected std::vector<SemanticValue>
|
||||
@ -185,13 +181,6 @@ struct SemanticValues : protected std::vector<SemanticValue>
|
||||
|
||||
SemanticValues() : s(nullptr), n(0), choice(0) {}
|
||||
|
||||
std::string str(size_t i = 0) const {
|
||||
if (i > 0) {
|
||||
return (*this)[i].str();
|
||||
}
|
||||
return std::string(s, n);
|
||||
}
|
||||
|
||||
typedef SemanticValue T;
|
||||
using std::vector<T>::iterator;
|
||||
using std::vector<T>::const_iterator;
|
||||
@ -217,7 +206,7 @@ struct SemanticValues : protected std::vector<SemanticValue>
|
||||
using std::vector<T>::emplace_back;
|
||||
|
||||
template <typename F>
|
||||
auto map(F f) const -> vector<typename std::remove_const<decltype(f(SemanticValue()))>::type> {
|
||||
auto transform(F f) const -> vector<typename std::remove_const<decltype(f(SemanticValue()))>::type> {
|
||||
vector<typename std::remove_const<decltype(f(SemanticValue()))>::type> r;
|
||||
for (const auto& v: *this) {
|
||||
r.push_back(f(v));
|
||||
@ -226,7 +215,7 @@ struct SemanticValues : protected std::vector<SemanticValue>
|
||||
}
|
||||
|
||||
template <typename F>
|
||||
auto map(size_t beg, size_t end, F f) const -> vector<typename std::remove_const<decltype(f(SemanticValue()))>::type> {
|
||||
auto transform(size_t beg, size_t end, F f) const -> vector<typename std::remove_const<decltype(f(SemanticValue()))>::type> {
|
||||
vector<typename std::remove_const<decltype(f(SemanticValue()))>::type> r;
|
||||
end = std::min(end, size());
|
||||
for (size_t i = beg; i < end; i++) {
|
||||
@ -236,8 +225,8 @@ struct SemanticValues : protected std::vector<SemanticValue>
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
auto map(size_t beg = 0, size_t end = -1) const -> vector<T> {
|
||||
return this->map(beg, end, [](const SemanticValue& v) { return v.get<T>(); });
|
||||
auto transform(size_t beg = 0, size_t end = -1) const -> vector<T> {
|
||||
return this->transform(beg, end, [](const SemanticValue& v) { return v.get<T>(); });
|
||||
}
|
||||
};
|
||||
|
||||
@ -469,11 +458,11 @@ struct Context
|
||||
std::vector<bool> cache_register;
|
||||
std::vector<bool> cache_success;
|
||||
|
||||
std::map<std::pair<size_t, size_t>, std::tuple<size_t, any>> cache_result;
|
||||
|
||||
std::vector<std::shared_ptr<SemanticValues>> stack;
|
||||
size_t stack_size;
|
||||
|
||||
std::map<std::pair<size_t, size_t>, std::tuple<size_t, any>> cache_result;
|
||||
|
||||
Context(const char* _s, size_t _l, size_t _def_count, bool enablePackratParsing)
|
||||
: s(_s)
|
||||
, l(_l)
|
||||
@ -2252,7 +2241,7 @@ private:
|
||||
std::shared_ptr<Ast> ast = sv[0].get<std::shared_ptr<Ast>>();
|
||||
return ast;
|
||||
}
|
||||
return std::make_shared<Ast>(info.name, info.tag, sv.map<std::shared_ptr<Ast>>());
|
||||
return std::make_shared<Ast>(info.name, info.tag, sv.transform<std::shared_ptr<Ast>>());
|
||||
};
|
||||
}
|
||||
|
||||
@ -2271,7 +2260,7 @@ private:
|
||||
std::shared_ptr<Ast> ast = sv[0].get<std::shared_ptr<Ast>>();
|
||||
return ast;
|
||||
}
|
||||
return std::make_shared<Ast>(name.c_str(), AstDefaultTag, sv.map<std::shared_ptr<Ast>>());
|
||||
return std::make_shared<Ast>(name.c_str(), AstDefaultTag, sv.transform<std::shared_ptr<Ast>>());
|
||||
};
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user