Vcsn  2.3
Be Rational
signature-printer.cc
Go to the documentation of this file.
1 #include <ostream>
2 #include <sstream>
3 
6 
7 
8 namespace vcsn
9 {
10  namespace ast
11  {
12 
13  std::string normalize_context(const std::string& ctx, bool full)
14  {
15  std::ostringstream os;
16  ast::signature_printer printer(os, full);
17  auto ast = parse_context(ctx);
18  ast->accept(printer);
19  return os.str();
20  }
21 
22 #define DEFINE(Type) \
23  void signature_printer::visit(const Type& t)
24 
26  {
27  os_ << t.get_type() << '<';
28  bool first = true;
29  for (auto c: t.get_content())
30  {
31  if (!first)
32  os_ << ", ";
33  first = false;
34  c->accept(*this);
35  }
36  os_ << '>';
37  }
38 
39  DEFINE(context)
40  {
41  os_ << "context<";
42  t.get_labelset()->accept(*this);
43  os_ << ", ";
44  t.get_weightset()->accept(*this);
45  os_ << ">";
46  }
47 
48  DEFINE(tuple)
49  {
50  os_ << "std::tuple<";
51  auto v = t.get_sets();
52  for (unsigned int i = 0; i < v.size() - 1; ++i)
53  {
54  v[i]->accept(*this);
55  os_ << ", ";
56  }
57  v[v.size() - 1]->accept(*this);
58  os_ << '>';
59  }
60 
61  DEFINE(tupleset)
62  {
63  os_ << "lat<";
64  auto v = t.get_sets();
65  for (unsigned int i = 0; i < v.size() - 1; ++i)
66  {
67  v[i]->accept(*this);
68  os_ << ", ";
69  }
70  v[v.size() - 1]->accept(*this);
71  os_ << '>';
72  }
73 
74  DEFINE(nullableset)
75  {
76  os_ << "nullableset<";
77  t.get_labelset()->accept(*this);
78  os_ << '>';
79  }
80 
81  DEFINE(oneset)
82  {
83  (void) t;
84  os_ << "lao";
85  }
86 
87  DEFINE(genset)
88  {
89  os_ << t.letter_type();
90  if (full_)
91  os_ << t.generators();
92  }
93 
94  DEFINE(letterset)
95  {
96  os_ << "letterset<";
97  t.genset()->accept(*this);
98  os_ << '>';
99  }
100 
101  DEFINE(expansionset)
102  {
103  os_ << "expansionset<";
104  t.get_expressionset()->accept(*this);
105  os_ << '>';
106  }
107 
108  DEFINE(expressionset)
109  {
110  os_ << "expressionset<";
111  t.get_context()->accept(*this);
112  os_ << '>';
113  if (full_)
114  os_ << '(' << t.get_identities() << ')';
115  }
116 
117  DEFINE(weightset)
118  {
119  os_ << t.get_type();
120  }
121 
122  DEFINE(wordset)
123  {
124  os_ << "wordset<";
125  t.genset()->accept(*this);
126  os_ << '>';
127  }
128 
129  DEFINE(other)
130  {
131  os_ << t.get_type();
132  }
133 
134  DEFINE(polynomialset)
135  {
136  os_ << "polynomialset<";
137  t.get_content()->accept(*this);
138  os_ << '>';
139  }
140  }
141 }
std::string normalize_context(const std::string &ctx, bool full)
A context, normalized.
#define DEFINE(Type)
Definition: a-star.hh:8
std::ostringstream os
The output stream: the corresponding C++ snippet to compile.
Definition: translate.cc:375
std::shared_ptr< ast_node > parse_context(const std::string &ctx)
Parse a context, and return its AST.