summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorRoland Reichwein <mail@reichwein.it>2020-02-06 21:56:33 +0100
committerRoland Reichwein <mail@reichwein.it>2020-02-06 21:56:33 +0100
commit8828bd96989d839a1d34c5cfc625fefdfa80a136 (patch)
tree7c6478279a9303abaa821814680c8bc527ceca5d
parentf1b23e34bee172e0c0ed8e65bcd7904baef9e857 (diff)
Fixed class
-rw-r--r--grammer.cpp23
-rw-r--r--grammer.h27
2 files changed, 35 insertions, 15 deletions
diff --git a/grammer.cpp b/grammer.cpp
index 4bdf8f4..8f2b42b 100644
--- a/grammer.cpp
+++ b/grammer.cpp
@@ -22,7 +22,8 @@ bool Compiler::IsRootNode(index_t node_id) const
return node.parent_node_id == node.node_id;
}
-void Compiler::Validate() const {
+void Compiler::Validate() const
+{
// A program is non empty
if (nodes.size() == 0)
throw std::runtime_error("");
@@ -50,11 +51,13 @@ void Compiler::DumpTree()
}
}
-bool RootIsStartSymbol()
+bool Compiler::RootIsStartSymbol() const
{
return GetTypeOfNode(root_node_id) == Top;
}
+namespace {
+
bool ChildIdIsToken(int32_t child_id)
{
return child_i < 0;
@@ -70,12 +73,14 @@ int32_t ChildIdFromTokenId(index_t token_id)
return -1 - int32_t(token_id);
}
-bool AllTokensUsed()
+} // namespace
+
+bool Compiler::AllTokensUsed() const
{
return tokens_used == tokens.size();
}
-bool Compiler::treeIsComplete()
+bool Compiler::treeIsComplete() const
{
return RootIsStartSymbol() && AllTokensUsed();
}
@@ -199,7 +204,7 @@ bool Compiler::AddRootNode()
return true;
}
-void RemoveLastNode()
+void Compiler::RemoveLastNode()
{
TreeNode& node {nodes.back()};
index_t node_id = node.node_id;
@@ -225,7 +230,7 @@ void RemoveLastNode()
}
// Change type of last node according to alternatives
-void ChangeNodeType()
+void Compiler::ChangeNodeType()
{
TreeNode& node {nodes.back()};
index_t node_id = node.node_id;
@@ -289,7 +294,8 @@ std::map<std::string, std::string> Compiler::traverse(lower, upper)
// returns list from lower (excluding) to upper (including)
// returns empty list on fail
-std::vector<std::string> Compiler::GetPath(std::string upper, std::string lower) {
+std::vector<std::string> Compiler::GetPath(std::string upper, std::string lower)
+{
std::vector<std::string> result;
// traverse bnf from lower to upper
@@ -327,7 +333,8 @@ index_t Compiler::AddNode(const std::string& name, const std::string& child_type
return index;
}
-void Compiler::AddPath(const std::vector<std::string>& path, index_t current_index) {
+void Compiler::AddPath(const std::vector<std::string>& path, index_t current_index)
+{
for (int i = path.size() - 1; i > 0; i--) {
std::string child_name = path[i - 1];
current_index = AddNode(path[i], child_name, current_index);
diff --git a/grammer.h b/grammer.h
index 996d023..0e9ed32 100644
--- a/grammer.h
+++ b/grammer.h
@@ -40,22 +40,35 @@ private:
std::map<std::string, std::set<std::string>> ReverseBNF; // possible parent types of a given type
-public:
+
// Tree specific
void clear();
// Node specific
std::string GetTypeOfNode(index_t node_id) const;
-
+ bool IsRootNode(index_t node_id) const;
+ bool RootIsStartSymbol() const;
+ bool AllTokensUsed() const;
+ bool treeIsComplete() const;
+ std::vector<std::string>& getNodeExpectedChilds(node_id);
+ bool subTreeIsComplete(index_t node_id, index_t& to_fill);
+ size_t CommonPrefix(const std::vector<Token>& tokens, const std::vector<std::string>& types);
+ void AddFirstNode();
+ bool AddRootNode();
+ void RemoveLastNode();
+ void ChangeNodeType();
index_t TrackBack();
-
- void Validate(const std::string& Top, const BNF& bnf) const;
-
- void Dump();
+ void Validate() const;
+ std::map<std::string, std::string> traverse(lower, upper);
+ std::vector<std::string> GetPath(std::string upper, std::string lower);
+ index_t AddNode(const std::string& name, const std::string& child_type, index_t parent_index);
+ void AddPath(const std::vector<std::string>& path, index_t current_index);
+ bool FillTree();
+public:
Compiler(const BNF& bnf, const std::string& Top);
-
std::pair<index_t, std::vector<TreeNode>> compile(std::vector<Token> Tokens);
+ void DumpTree();
};
} // namespace Gram