https://mooseframework.inl.gov
Loading...
Searching...
No Matches
SyntaxTree.C
Go to the documentation of this file.
1//* This file is part of the MOOSE framework
2//* https://mooseframework.inl.gov
3//*
4//* All rights reserved, see COPYRIGHT for full restrictions
5//* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6//*
7//* Licensed under LGPL 2.1, please see LICENSE for details
8//* https://www.gnu.org/licenses/lgpl-2.1.html
9
10#include "SyntaxTree.h"
11
12#include "InputParameters.h"
13#include "MooseUtils.h"
14#include "Parser.h"
15
16#include <algorithm>
17#include <cctype>
18
19SyntaxTree::SyntaxTree(bool use_long_names)
20 : SyntaxFormatterInterface(), _use_long_names(use_long_names)
21{
22}
23
24SyntaxTree::~SyntaxTree() = default;
25
26void
27SyntaxTree::insertNode(std::string syntax,
28 const std::string & action,
29 bool is_action_params,
30 InputParameters * params)
31{
32 if (!_root)
33 _root = std::make_unique<TreeNode>("", *this);
34
35 _root->insertNode(syntax, action, is_action_params, params);
36}
37
38std::string
39SyntaxTree::print(const std::string & search_string)
40{
41 bool found = false;
42 std::string output;
43
44 // Clear the list of "seen" parameters before printing the tree
45 _params_printed.clear();
46
47 if (_root)
48 output = _root->print(-1, search_string, found);
49
50 if (found)
51 return preamble() + output + postscript();
52 else
53 return "";
54}
55
56void
57SyntaxTree::seenIt(const std::string & prefix, const std::string & item)
58{
59 _params_printed.insert(prefix + item);
60}
61
62bool
63SyntaxTree::haveSeenIt(const std::string & prefix, const std::string & item) const
64{
65 return _params_printed.find(prefix + item) != _params_printed.end();
66}
67
68SyntaxTree::TreeNode::TreeNode(const std::string & name,
69 SyntaxTree & syntax_tree,
70 const std::string * action,
71 InputParameters * params,
72 TreeNode * parent)
73 : _name(name), _parent(parent), _syntax_tree(syntax_tree)
74{
75 if (action)
76 _action_params.emplace(*action, std::make_unique<InputParameters>(*params));
77}
78
80
81void
83 const std::string & action,
84 bool is_action_params,
85 InputParameters * params)
86{
87 std::string::size_type pos = syntax.find_first_of("/");
88 std::string item;
89 bool is_leaf = true;
90
91 item = syntax.substr(0, pos);
92 if (pos != std::string::npos)
93 {
94 syntax = syntax.substr(pos + 1);
95 is_leaf = false;
96 }
97
98 bool node_created = false;
99 if (_children.find(item) == _children.end())
100 {
101 _children[item] = std::make_unique<TreeNode>(
102 item, _syntax_tree, is_leaf && is_action_params ? &action : NULL, params, this);
103 if (is_leaf && !is_action_params)
104 _children[item]->insertParams(action, is_action_params, params);
105 node_created = true;
106 }
107
108 if (!is_leaf)
109 _children[item]->insertNode(syntax, action, is_action_params, params);
110 else if (!node_created)
111 _children[item]->insertParams(action, is_action_params, params);
112}
113
114void
115SyntaxTree::TreeNode::insertParams(const std::string & action,
116 bool is_action_params,
117 InputParameters * params)
118{
119 if (is_action_params)
120 _action_params.emplace(action, std::make_unique<InputParameters>(*params));
121 else
122 _moose_object_params.emplace(action, std::make_unique<InputParameters>(*params));
123}
124
125std::string
126SyntaxTree::TreeNode::print(short depth, const std::string & search_string, bool & found)
127{
128 std::string doc = "";
129 std::string long_name(getLongName());
130 std::string name(_syntax_tree.isLongNames() ? long_name : _name);
131 std::string out;
132
133 if (depth < 0)
134 {
135 for (const auto & c_it : _children)
136 {
137 bool local_found = false;
138 std::string local_out(c_it.second->print(depth + 1, search_string, local_found));
139 found |= local_found; // Update the current frame's found variable
140 if (local_found)
141 out += local_out;
142 }
143 return out;
144 }
145
146 // GlobalParamsAction is special - we need to just always print it out
147 // if (_name == "GlobalParamsAction")
148 // found = true;
149
150 std::string indent((depth + 1) * 2, ' ');
151
152 std::multimap<std::string, std::unique_ptr<InputParameters>>::const_iterator it =
153 _moose_object_params.begin();
154 do
155 {
156 bool local_found = false;
157 std::string local_out;
158
159 // Compare the block name, if it's matched we are going to pass an empty search string
160 // which means match ALL parameters
161 std::string local_search_string;
162 if (MooseUtils::wildCardMatch(name, search_string))
163 found = true;
164 else
165 local_search_string = search_string;
166
167 if (it != _moose_object_params.end())
168 doc = it->second->getClassDescription();
169 local_out += _syntax_tree.printBlockOpen(name, depth, doc);
170
171 for (const auto & a_it : _action_params)
172 if (a_it.first != "EmptyAction")
173 {
174 local_out += _syntax_tree.printParams(
175 name, long_name, *(a_it.second), depth, local_search_string, local_found);
176 found |= local_found; // Update the current frame's found variable
177 // DEBUG
178 // Moose::out << "\n" << indent << "(" << ait->first << ")";
179 // DEBUG
180 }
181
182 if (it != _moose_object_params.end())
183 {
184 local_out += _syntax_tree.printParams(
185 name, long_name, *it->second, depth, local_search_string, local_found);
186 found |= local_found;
187 // DEBUG
188 // Moose::out << "\n" << indent << "{" << it->first << "}";
189 // DEBUG
190 }
191
192 local_out += _syntax_tree.preTraverse(depth);
193
194 for (const auto & c_it : _children)
195 {
196 bool child_found = false;
197 std::string child_out(c_it.second->print(depth + 1, local_search_string, child_found));
198 found |= child_found; // Update the current frame's found variable
199
200 if (child_found)
201 local_out += child_out;
202 }
203
204 local_out += _syntax_tree.printBlockClose(name, depth);
205
206 if (found)
207 out += local_out;
208
209 // If there are no moose object params then we have to be careful about how we
210 // increment the iterator. We only want to increment if we aren't already
211 // at the end.
212 } while (it != _moose_object_params.end() && ++it != _moose_object_params.end());
213
214 return out;
215}
216
217std::string
218SyntaxTree::TreeNode::getLongName(const std::string & delim) const
219{
220 if (_parent)
221 return _parent->getLongName(delim) + delim + _name;
222 else
223 return _name;
224}
225
226bool
228{
229 return _use_long_names;
230}
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system.
This interface is for classes that want to be called to format InputParameters.
virtual std::string preamble() const
This method is called once at the beginning of the tree traversal and can be used to build up header ...
virtual std::string postscript() const
This method is called once at the end of the tree traversal and can be used to add any necessary trai...
This class represents a single node in our tree.
Definition SyntaxTree.h:44
std::string print(short depth, const std::string &search_string, bool &found)
Definition SyntaxTree.C:126
std::string getLongName(const std::string &delim="/") const
Definition SyntaxTree.C:218
void insertNode(std::string &syntax, const std::string &action, bool is_action_params=true, InputParameters *params=NULL)
Definition SyntaxTree.C:82
TreeNode(const std::string &name, SyntaxTree &syntax_tree, const std::string *action=NULL, InputParameters *params=NULL, TreeNode *parent=NULL)
Definition SyntaxTree.C:68
std::multimap< std::string, std::unique_ptr< InputParameters > > _action_params
Definition SyntaxTree.h:67
void insertParams(const std::string &action, bool is_action_params, InputParameters *params=NULL)
Definition SyntaxTree.C:115
std::set< std::string > _params_printed
Definition SyntaxTree.h:80
bool isLongNames() const
Definition SyntaxTree.C:227
std::unique_ptr< TreeNode > _root
Definition SyntaxTree.h:76
virtual ~SyntaxTree()
SyntaxTree(bool use_long_names=false)
Definition SyntaxTree.C:19
void insertNode(std::string syntax, const std::string &action, bool is_action_params=true, InputParameters *params=NULL)
Definition SyntaxTree.C:27
void seenIt(const std::string &prefix, const std::string &item)
Definition SyntaxTree.C:57
bool _use_long_names
Definition SyntaxTree.h:77
std::string print(const std::string &search_string)
Definition SyntaxTree.C:39
bool haveSeenIt(const std::string &prefix, const std::string &item) const
Definition SyntaxTree.C:63
bool wildCardMatch(std::string name, std::string search_string)
Definition MooseUtils.C:899