hobbes
a language, embedded compiler, and runtime for efficient dynamic expression evaluation, data storage and analysis
terminal.H
Go to the documentation of this file.
1 
2 #ifndef HOBBES_PARSE_TERMINAL_HPP_INCLUDED
3 #define HOBBES_PARSE_TERMINAL_HPP_INCLUDED
4 
5 #include <hobbes/parse/data.H>
7 #include <iostream>
8 #include <vector>
9 #include <map>
10 #include <set>
11 
12 namespace hobbes {
13 
14 /*
15  * standard terminals
16  */
17 
18 // a "terminal" is an opaque value, assumed primitive
19 struct terminal {
20  // format this terminal for output on a text console
21  virtual void show(std::ostream&) const = 0;
22 
23  // produce match patterns and value-reference expressions
24  // (to generate code to try to match for a terminal and, if matched, to refer to its value)
25  virtual PatternPtr matchPattern() const = 0;
26  virtual ExprPtr matchRefExpr() const = 0;
27 };
28 typedef std::vector<terminal*> terminals;
29 typedef std::set<terminal*> terminalset;
30 
31 // characters can be terminals
32 class character : public terminal {
33 public:
34  character(char x = 0);
35  char value() const;
36  void value(char);
37  void show(std::ostream&) const;
38 
39  PatternPtr matchPattern() const;
40  ExprPtr matchRefExpr() const;
41 private:
42  char x;
43 };
44 
45 // a named symbol, distinct from other terminals
46 class symbol : public terminal {
47 public:
48  symbol(const std::string& sname);
49  const std::string& name() const;
50  void show(std::ostream& out) const;
51 
52  PatternPtr matchPattern() const;
53  ExprPtr matchRefExpr() const;
54 private:
55  std::string sname;
56 };
57 
58 // EOF is a special terminal
59 class endOfFile : public terminal {
60 public:
61  endOfFile();
62  void show(std::ostream&) const;
63  static terminal* value();
64 
65  PatternPtr matchPattern() const;
66  ExprPtr matchRefExpr() const;
67 };
68 
69 // allow terminals to be ordered by basic precedence / associativity definitions
70 namespace assoc {
71  enum pref { non, left, right };
72 }
73 
74 struct prec {
75  inline prec() : level(0), asc(assoc::non) { }
76  inline prec(nat level, assoc::pref asc) : level(level), asc(asc) { }
77 
80 };
81 
82 typedef std::map<terminal*, prec> precedence;
83 
84 }
85 
86 #endif
Definition: terminal.H:71
assoc::pref asc
Definition: terminal.H:79
std::vector< terminal * > terminals
Definition: terminal.H:28
virtual PatternPtr matchPattern() const =0
prec()
Definition: terminal.H:75
unsigned int nat
Definition: data.H:20
Definition: terminal.H:19
Definition: boot.H:7
Definition: terminal.H:74
virtual ExprPtr matchRefExpr() const =0
std::string sname
Definition: terminal.H:55
virtual void show(std::ostream &) const =0
std::shared_ptr< Expr > ExprPtr
Definition: expr.H:58
prec(nat level, assoc::pref asc)
Definition: terminal.H:76
#define out
Definition: netio.H:19
Definition: terminal.H:71
std::map< terminal *, prec > precedence
Definition: terminal.H:82
Definition: terminal.H:59
char x
Definition: terminal.H:42
pref
Definition: terminal.H:71
nat level
Definition: terminal.H:78
Definition: terminal.H:46
Definition: terminal.H:71
std::shared_ptr< Pattern > PatternPtr
Definition: pattern.H:18
std::set< terminal * > terminalset
Definition: terminal.H:29
Definition: terminal.H:32