Vcsn  2.0
Be Rational
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
signature-printer.cc
Go to the documentation of this file.
1 #include <ostream>
2 
5 
6 
7 namespace vcsn
8 {
9  namespace ast
10  {
11 
12  std::string normalize(const std::string& sig)
13  {
14  std::ostringstream os;
15  ast::signature_printer printer(os, true);
16  std::istringstream is;
17  ast::context_parser parser(is);
18  is.str(sig);
19  auto ast = parser.parse();
20  ast->accept(printer);
21  return os.str();
22  }
23 
24 #define DEFINE(Type) \
25  void signature_printer::visit(const Type& t)
26 
28  {
29  os_ << t.get_type() << '<';
30  bool first = true;
31  for (auto c: t.get_content())
32  {
33  if (!first)
34  os_ << ", ";
35  first = false;
36  c->accept(*this);
37  }
38  os_ << '>';
39  }
40 
41  DEFINE(context)
42  {
43  t.get_labelset()->accept(*this);
44  os_ << ", ";
45  t.get_weightset()->accept(*this);
46  }
47 
48  DEFINE(tupleset)
49  {
50  os_ << "lat<";
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(nullableset)
62  {
63  os_ << "lan<";
64  t.get_labelset()->accept(*this);
65  os_ << '>';
66  }
67 
68  DEFINE(oneset)
69  {
70  (void) t;
71  os_ << "lao";
72  }
73 
74  DEFINE(genset)
75  {
76  os_ << t.letter_type();
77  if (full_)
78  os_ << t.generators();
79  }
80 
81  DEFINE(letterset)
82  {
83  os_ << "letterset<";
84  t.genset()->accept(*this);
85  os_ << '>';
86  }
87 
88  DEFINE(ratexpset)
89  {
90  os_ << "ratexpset<";
91  t.get_context()->accept(*this);
92  os_ << '>';
93  if (full_)
94  os_ << '(' << t.get_identities() << ')';
95  }
96 
97  DEFINE(weightset)
98  {
99  os_ << t.get_type();
100  }
101 
102  DEFINE(wordset)
103  {
104  os_ << "wordset<";
105  t.genset()->accept(*this);
106  os_ << '>';
107  }
108 
109  DEFINE(other)
110  {
111  os_ << t.get_type();
112  }
113 
114  DEFINE(polynomialset)
115  {
116  os_ << "polynomialset<";
117  t.get_content()->accept(*this);
118  os_ << '>';
119  }
120 
121  }
122 }
#define DEFINE(Type)
std::shared_ptr< ast_node > parse()
Accept anything.
std::istringstream is
The input stream: the specification to translate.
Definition: translate.cc:329
std::string normalize(const std::string &sig)
The signature, normalized.
std::ostringstream os
The output stream: the corresponding C++ snippet to compile.
Definition: translate.cc:331