summary refs log tree commit diff stats
path: root/lib/frame.h
blob: fa57e1b50c0b73cf9f1ccc5125fbc9523c6b2ee6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#ifndef FRAME_H_9A5D90FE
#define FRAME_H_9A5D90FE

namespace verbly {
  
  class frame_query;

  class frame {
    public:
      class selrestr {
        public:
          enum class type {
            empty,
            singleton,
            group
          };
          
          type get_type() const;
          selrestr(const selrestr& other);
          ~selrestr();
          selrestr& operator=(const selrestr& other);
          
          // Empty
          selrestr();
          
          // Singleton
          selrestr(std::string restriction, bool pos);
          std::string get_restriction() const;
          bool get_pos() const;
          
          // Group
          selrestr(std::list<selrestr> children, bool orlogic);
          std::list<selrestr> get_children() const;
          std::list<selrestr>::const_iterator begin() const;
          std::list<selrestr>::const_iterator end() const;
          bool get_orlogic() const;
          
        private:
          union {
            struct {
              bool pos;
              std::string restriction;
            } _singleton;
            struct {
              std::list<selrestr> children;
              bool orlogic;
            } _group;
          };
          type _type;
      };
      
      class part {
        public:
          enum class type {
            noun_phrase,
            verb,
            literal_preposition,
            selection_preposition,
            adjective,
            adverb,
            literal
          };
          
          type get_type() const;
          part(const part& other);
          ~part();
          
          // Noun phrase
          std::string get_role() const;
          selrestr get_selrestrs() const;
          std::set<std::string> get_synrestrs() const;
          
          // Literal preposition
          std::vector<std::string> get_choices() const;
          
          // Selection preposition
          std::vector<std::string> get_preprestrs() const;
          
          // Literal
          std::string get_literal() const;
          
        private:
          friend class frame_query;
          
          part();
          
          union {
            struct {
              std::string role;
              selrestr selrestrs;
              std::set<std::string> synrestrs;
            } _noun_phrase;
            struct {
              std::vector<std::string> choices;
            } _literal_preposition;
            struct {
              std::vector<std::string> preprestrs;
            } _selection_preposition;
            struct {
              std::string lexval;
            } _literal;
          };
          type _type;
      };
      
      std::vector<part> parts() const;
      std::map<std::string, selrestr> roles() const;
      
    private:
      friend class frame_query;
      
      std::vector<part> _parts;
      std::map<std::string, selrestr> _roles;
  };

};

#endif /* end of include guard: FRAME_H_9A5D90FE */