summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--cpp.cpp45
-rw-r--r--cpp.h8
-rw-r--r--flowgraph/node.h4
3 files changed, 29 insertions, 28 deletions
diff --git a/cpp.cpp b/cpp.cpp
index b884af4..52cd5f2 100644
--- a/cpp.cpp
+++ b/cpp.cpp
@@ -313,7 +313,7 @@ bool CPP::childTypesOfChildMatch(index_t index, index_t child_index, const std::
return childTypesOfNodeMatch(m_nodes[index].child_ids[child_index], pattern);
}
-std::shared_ptr<std::any> CPP::getValue(index_t node_id, index_t child_index)
+std::any CPP::getValue(index_t node_id, index_t child_index)
{
size_t num_values_on_top {m_nodes[node_id].child_ids.size()};
@@ -352,71 +352,70 @@ std::string CPP::ruleString(index_t node_id)
return result;
}
-std::unordered_map<std::string, std::function<std::shared_ptr<std::any>(index_t)>> CPP::getNodeEvalMap()
+std::unordered_map<std::string, std::function<std::any(index_t)>> CPP::getNodeEvalMap()
{
return {
- { "primary-expression", [&](index_t index) -> std::shared_ptr<std::any>
+ { "primary-expression", [&](index_t index) -> std::any
{
if (childTypesOfNodeMatch(index, {"literal"}))
return getValue(index, 0);
throw std::runtime_error("ICE: Unsupported childs: "s + ruleString(index)); // TODO
}
},
- { "postfix-expression", [&](index_t index) -> std::shared_ptr<std::any>
+ { "postfix-expression", [&](index_t index) -> std::any
{
- if (childTypesOfNodeMatch(index, {"primary-expression", ""}) && !getValue(index, 1))
+ if (childTypesOfNodeMatch(index, {"primary-expression", ""}) && !getValue(index, 1).has_value())
return getValue(index, 0);
throw std::runtime_error("ICE: Unsupported childs: "s + ruleString(index)); // TODO
}
},
- { "unary-expression", [&](index_t index) -> std::shared_ptr<std::any>
+ { "unary-expression", [&](index_t index) -> std::any
{
if (childTypesOfNodeMatch(index, {"postfix-expression"}))
return getValue(index, 0);
throw std::runtime_error("ICE: Unsupported childs: "s + ruleString(index)); // TODO
}
},
- { "cast-expression", [&](index_t index) -> std::shared_ptr<std::any>
+ { "cast-expression", [&](index_t index) -> std::any
{
if (childTypesOfNodeMatch(index, {"unary-expression"}))
return getValue(index, 0);
throw std::runtime_error("ICE: Unsupported childs: "s + ruleString(index)); // TODO
}
},
- { "pm-expression", [&](index_t index) -> std::shared_ptr<std::any>
+ { "pm-expression", [&](index_t index) -> std::any
{
- if (childTypesOfNodeMatch(index, {"cast-expression", ""}) && !getValue(index, 1))
+ if (childTypesOfNodeMatch(index, {"cast-expression", ""}) && !getValue(index, 1).has_value())
return getValue(index, 0);
throw std::runtime_error("ICE: Unsupported childs: "s + ruleString(index)); // TODO
}
},
- { "multiplicative-expression", [&](index_t index) -> std::shared_ptr<std::any>
+ { "multiplicative-expression", [&](index_t index) -> std::any
{
- if (childTypesOfNodeMatch(index, {"pm-expression", ""}) && !getValue(index, 1))
+ if (childTypesOfNodeMatch(index, {"pm-expression", ""}) && !getValue(index, 1).has_value())
return getValue(index, 0);
throw std::runtime_error("ICE: Unsupported childs: "s + ruleString(index)); // TODO
}
},
- { "additive-expression", [&](index_t index) -> std::shared_ptr<std::any>
+ { "additive-expression", [&](index_t index) -> std::any
{
if (childTypesOfNodeMatch(index, {"multiplicative-expression", "additive-expression-EXT"}) && childTypesOfChildMatch(index, 1, {"+", "", ""})) {
- FlowGraph::LocalScope scope;
+ FlowGraph::LocalScope scope; // TODO: move to context!
FlowGraph::Data destination{FlowGraph::MakeTemporaryInt(scope)};
- auto value0 {getValue(index, 0)};
- auto value1 {getValue(index, 1)};
+ FlowGraph::Data value0 {std::any_cast<FlowGraph::Data>(getValue(index, 0))};
+ FlowGraph::Data value1 {std::any_cast<FlowGraph::Data>(getValue(index, 1))};
- //return std::make_shared<FlowGraph::BinaryOperation>(FlowGraph::BinaryOperationType::Add, destination, value0, value1);
- return getValue(index, 0); // TODO
+ return std::make_shared<FlowGraph::BinaryOperation>(FlowGraph::BinaryOperationType::Add, destination, value0, value1);
}
throw std::runtime_error("ICE: Unsupported childs: "s + ruleString(index)); // TODO
}
},
- { "additive-expression-EXT", [&](index_t index) -> std::shared_ptr<std::any>
+ { "additive-expression-EXT", [&](index_t index) -> std::any
{
- if (childTypesOfNodeMatch(index, {"+", "multiplicative-expression", ""}) && !getValue(index, 2)) {
+ if (childTypesOfNodeMatch(index, {"+", "multiplicative-expression", ""}) && !getValue(index, 2).has_value()) {
return getValue(index, 1);
} else if (childTypesOfNodeMatch(index, {})) {
- return nullptr;
+ return {};
}
throw std::runtime_error("ICE: Unsupported childs: "s + ruleString(index)); // TODO
}
@@ -434,7 +433,7 @@ void CPP::getValueOfNode(index_t index)
throw std::runtime_error("ICE: Expected num_childs elements on Values stack at "s + locationOfNode(index));
auto function_it{node_eval_map.find(m_nodes[index].type)};
- std::shared_ptr<std::any> result {nullptr};
+ std::any result;
if (function_it != node_eval_map.end()) {
result = function_it->second(index);
} else {
@@ -453,9 +452,9 @@ void CPP::getValueOfToken(index_t index)
if (m_tokens[index].type == "literal") {
// TODO: also support other types, different from Int
FlowGraph::Data data{FlowGraph::MakeConstantInt(stoi(m_tokens[index].value))};
- mValues.push_back(std::make_shared<std::any>(data));
+ mValues.push_back(data);
} else {
- mValues.push_back(std::make_shared<std::any>(nullptr));
+ mValues.push_back(std::any{});
}
}
diff --git a/cpp.h b/cpp.h
index abd7e16..4c9f490 100644
--- a/cpp.h
+++ b/cpp.h
@@ -54,13 +54,13 @@ private:
bool childTypesOfNodeMatch(index_t index, const std::vector<std::string>& pattern) const; ///< returns true iff specified type list matches; "" -> don't care
bool childTypesOfChildMatch(index_t index, index_t child_index, const std::vector<std::string>& pattern) const; ///< returns true iff specified type list matches in specified child; "" -> don't care
- std::deque<std::shared_ptr<std::any>> mValues; // values stack during phase 7.c
- std::shared_ptr<std::any> getValue(index_t node_id, index_t child_id);
+ std::deque<std::any> mValues; // values stack during phase 7.c
+ std::any getValue(index_t node_id, index_t child_id);
std::string getType(index_t node_id, index_t child_index);
std::string ruleString(index_t node_id);
- std::unordered_map<std::string, std::function<std::shared_ptr<std::any>(index_t)>> getNodeEvalMap();
- std::unordered_map<std::string, std::function<std::shared_ptr<std::any>(index_t)>> node_eval_map;
+ std::unordered_map<std::string, std::function<std::any(index_t)>> getNodeEvalMap();
+ std::unordered_map<std::string, std::function<std::any(index_t)>> node_eval_map;
CPPContext mContext;
void getValueOfToken(index_t index);
diff --git a/flowgraph/node.h b/flowgraph/node.h
index c1b7380..89f6088 100644
--- a/flowgraph/node.h
+++ b/flowgraph/node.h
@@ -145,7 +145,9 @@ namespace FlowGraph {
class BinaryOperation: public Node
{
public:
- BinaryOperation(BinaryOperationType type, Data& destination, Data& source0, Data& source1): m_type(type), m_destination(destination), m_source0(source0), m_source1(source1) {}
+ BinaryOperation(BinaryOperationType type, Data& destination, Data& source0, Data& source1):
+ m_type(type), m_destination(destination), m_source0(source0), m_source1(source1)
+ {}
private:
BinaryOperationType m_type;
Data m_destination;