hobbes
a language, embedded compiler, and runtime for efficient dynamic expression evaluation, data storage and analysis
grammar.H
Go to the documentation of this file.
1 /*
2  * grammar : simplify shorthand for grammar rules (translated "in the obvious way" to plain generative grammars)
3  */
4 
5 #ifndef HOBBES_PARSE_GRAMMAR_HPP_INCLUDED
6 #define HOBBES_PARSE_GRAMMAR_HPP_INCLUDED
7 
8 #include <hobbes/lang/expr.H>
10 #include <string>
11 #include <sstream>
12 #include <memory>
13 #include <map>
14 #include <vector>
15 
16 namespace hobbes {
17 
19 public:
21  virtual void show(std::ostream&) const = 0;
22 private:
23  GrammarValue();
24 };
25 typedef std::shared_ptr<GrammarValue> GrammarValuePtr;
26 
27 class GSymRef : public GrammarValue {
28 public:
29  GSymRef(const std::string&, const LexicalAnnotation&);
30  void show(std::ostream&) const;
31 
32  const std::string& value() const;
33 private:
34  std::string x;
35 };
36 
37 class GStr : public GrammarValue {
38 public:
39  GStr(const std::string&, const LexicalAnnotation&);
40  void show(std::ostream&) const;
41 
42  const std::string& value() const;
43 private:
44  std::string x;
45 };
46 
47 template <typename T>
49  virtual T with(const GSymRef*) const = 0;
50  virtual T with(const GStr*) const = 0;
51  };
52 
53 template <typename T>
54  T switchOf(const GrammarValuePtr& p, const switchGrammarValue<T>& f) {
55  if (const GSymRef* x = dynamic_cast<const GSymRef*>(p.get())) {
56  return f.with(x);
57  } else if (const GStr* x = dynamic_cast<const GStr*>(p.get())) {
58  return f.with(x);
59  } else {
60  std::ostringstream ss;
61  ss << "Internal error, can't switch on unknown grammar value type: ";
62  p->show(ss);
63  throw std::runtime_error(ss.str());
64  }
65  }
66 
68  inline BoundGrammarValue(const std::string& vn, const GrammarValuePtr& e) : varname(vn), element(e) { }
69  std::string varname;
70  GrammarValuePtr element;
71 };
72 typedef std::vector<BoundGrammarValue> BoundGrammarValues;
73 
74 struct GrammarRule {
75  inline GrammarRule(const BoundGrammarValues& vs, const ExprPtr& e) : values(vs), reduction(e) { }
76 
77  BoundGrammarValues values;
79 };
80 typedef std::vector<GrammarRule> GrammarRules;
81 
82 typedef std::pair<std::string, GrammarRules> GrammarSymDef;
83 typedef std::vector<GrammarSymDef> Grammar;
84 
85 // allow the construction of parsers from grammars
86 class cc;
87 ExprPtr makeParser(cc*, const Grammar&, const LexicalAnnotation&);
88 
89 }
90 
91 #endif
92 
std::vector< GrammarRule > GrammarRules
Definition: grammar.H:80
Definition: grammar.H:48
ExprPtr makeParser(cc *, const Grammar &, const LexicalAnnotation &)
Definition: grammar.C:49
std::pair< std::string, GrammarRules > GrammarSymDef
Definition: grammar.H:82
std::vector< BoundGrammarValue > BoundGrammarValues
Definition: grammar.H:72
virtual void show(std::ostream &) const =0
Definition: grammar.H:37
Definition: boot.H:7
std::vector< GrammarSymDef > Grammar
Definition: grammar.H:83
GrammarRule(const BoundGrammarValues &vs, const ExprPtr &e)
Definition: grammar.H:75
GrammarValuePtr element
Definition: grammar.H:70
T switchOf(const PrimitivePtr &p, const switchConst< T > &f)
Definition: expr.H:1045
BoundGrammarValues values
Definition: grammar.H:77
std::string varname
Definition: grammar.H:69
std::string x
Definition: grammar.H:44
Definition: grammar.H:18
BoundGrammarValue(const std::string &vn, const GrammarValuePtr &e)
Definition: grammar.H:68
Definition: grammar.H:27
ExprPtr reduction
Definition: grammar.H:78
Definition: grammar.H:67
std::shared_ptr< Expr > ExprPtr
Definition: expr.H:58
virtual T with(const GSymRef *) const =0
Definition: lannotation.H:36
Definition: cc.H:64
Definition: lannotation.H:22
std::vector< V > values(const std::map< K, V > &m)
Definition: array.H:218
std::string x
Definition: grammar.H:34
Definition: grammar.H:74
std::shared_ptr< GrammarValue > GrammarValuePtr
Definition: grammar.H:25