1
#include "grammar_tree_item.h"
5
Grammar_tree_item::Grammar_tree_item(const char *text/*, Item_kind item_kind*/)
8
_item_kind(item_kind)*/
12
Grammar_tree_item::Grammar_tree_item()
15
_item_kind(item_kind)*/
19
Grammar_tree_item::~Grammar_tree_item(void)
23
std::string Grammar_tree_item::text() const
28
std::string Grammar_tree_item::text_unquoted() const
30
if (!_text.empty() && _text[0] == '\'')
32
std::stringstream oss;
40
void Grammar_tree_item::text(const std::string &text)
45
bool Grammar_tree_item::empty() const
50
bool Grammar_tree_item::non_prec_child_exists() const
54
bool prev_item_was_prec_directive= false;
55
for (Item_list::const_iterator i= _items.begin(); i != _items.end(); ++i)
57
if ((*i)->is_prec_directive())
58
prev_item_was_prec_directive= true;
59
else if (prev_item_was_prec_directive || (*i)->empty())
60
prev_item_was_prec_directive= false;
71
bool Grammar_tree_item::has_more_then_one_meaningful_child() const
75
bool prev_item_was_prec_directive= false;
76
bool meaningful_child_was_found= false;
77
for (Item_list::const_iterator i= _items.begin(); i != _items.end(); ++i)
79
if ((*i)->is_prec_directive())
80
prev_item_was_prec_directive= true;
81
else if (prev_item_was_prec_directive)
82
prev_item_was_prec_directive= false;
83
else if (!meaningful_child_was_found)
84
meaningful_child_was_found= true;
95
bool Grammar_tree_item::is_terminal() const
99
for (std::string::const_iterator i= _text.begin(); i != _text.end(); ++i)
112
bool Grammar_tree_item::is_last_non_prec_child(const Grammar_tree_item *item) const
116
if (_items.back() != item)
118
// coping with msvs'2005 bug, its rbegin() implementation returns garbage instead of last element
119
Item_list::const_iterator i= _items.end();
125
return (0 == neq_count);
126
else if ((*i)->is_prec_directive())
128
else if (1 < ++neq_count)
131
while (i != _items.begin());
134
return (0 == neq_count);
137
bool Grammar_tree_item::is_prec_directive() const
139
if (_text.empty() || ('%' != _text[0]))
141
return (0 == _stricmp("%prec", _text.c_str()));
145
Item_kind Grammar_tree_item::item_kind() const
150
const Grammar_tree_item::Item_list * Grammar_tree_item::items() const
155
void Grammar_tree_item::add_item_as_last(const Grammar_tree_item *item)
157
_items.push_back(item);
160
void Grammar_tree_item::add_item_as_first(const Grammar_tree_item *item)
162
_items.push_front(item);
165
void Grammar_tree_item::flush(std::ostream& os) const
167
os << "<elem name= '" << _text << "'>";
168
for (Item_list::const_iterator i= _items.begin(); i != _items.end(); ++i)