source: src/dgp/grammar.hh

Last change on this file was d484a32, checked in by Tomasz Obrebski <obrebski@…>, 10 years ago

some unnecessary variables/functions deleted

  • Property mode set to 100644
File size: 6.9 KB
Line 
1#ifndef _GRAMMAR_HH
2#define _GRAMMAR_HH
3
4#include <bitset>
5#include <vector>
6#include <list>
7#include <set>
8
9#include "const.hh"
10#include "thesymbols.hh"
11#include "sgraph.hh"
12#include "boubble.hh"
13
14using namespace std;
15
16//enum PROP { INIT=0, FIN=1 };
17//typedef bitset<16> PropSet;
18
19const PropSet EmptyPropSet = PropSet();
20
21const FlagSet EmptyFlagSet = FlagSet();
22
23//====================================================================================================
24// class Link
25//====================================================================================================
26
27struct Link
28{
29  // Link(Role r, Flag dfplus="NULL", Flag dfminus="NULL") : role(r), dflagplus(dfplus), dflagminus(dfminus) { }
30  Link(Role r, PropSet ps=EmptyPropSet, Flag hfp="NULL", Flag hfm="NULL", Flag dfp="NULL", Flag dfm="NULL", int lineno=0)
31    : role(r), props(ps), hflagplus(hfp), hflagminus(hfm), dflagplus(dfp), dflagminus(dfm) { }
32  //Link(Role r) : role(r), dflagplus("NULL") { }
33
34  Role role;
35  Flag hflagplus;
36  Flag hflagminus;
37  Flag dflagplus;
38  Flag dflagminus;
39  PropSet props;
40  int lineno;
41
42  bool operator<(const Link& l) const 
43  {
44    if(role < l.role) return true;
45    if(hflagplus < l.hflagplus) return true;
46    if(hflagminus < l.hflagminus) return true;
47    if(dflagplus < l.dflagplus) return true;
48    if(dflagminus < l.dflagminus) return true;
49    if(props.to_ulong() < l.props.to_ulong()) return true;
50    return false;
51  }
52
53};
54
55typedef set<Link> Links;
56
57//====================================================================================================
58// class Grammar
59//====================================================================================================
60
61class Grammar
62{
63
64 public:
65
66  static const int RESIZE_DELTA=16;
67
68  Grammar() {} ;
69
70  list<const Link*> connectable2(Cat h, Cat d, FlagSet hfs, FlagSet dfs);
71
72  bool    check_constr(NodeProp& hprop, NodeProp& dprop, int dir, Role role);
73  bool    check_constr2(NodeProp& hprop, NodeProp& dprop, int dir, const Link& link);
74
75  bool    check_longrel(Cat hcat, Cat dcat, LongRel rel);
76  bool    is_sgl(Role r);
77  RoleSet is_obl(Cat c);
78 
79  RoleSet& constr_include(Role r) { return include[r]; };
80  RoleSet& constr_exclude(Role r) { return exclude[r]; };
81 
82  FlagSet initial_flags(Cat c) { return set[c]; }
83  FlagSet pass_flags(Role r)   { return pass[r]; }
84
85  list<Boubble*>    trigger_boubbles(Cat c, Role r, Dir d);
86
87  bool    read(FILE* f);
88  void    write(ostream& os);
89  void    write(FILE* f);
90
91private:
92
93  RoleSet                      sgl;
94  vector< RoleSet >            obl;      //[Cat]
95  RoleSet                      left;
96  RoleSet                      right;
97  RoleSet                      init;
98  RoleSet                      fin;
99  FlagSet                      initf;
100  FlagSet                      finf;
101
102  vector< RoleSet >            lt;       //[Role]
103  vector< RoleSet >            gt;       //[Role]
104
105  vector< FlagSet >            set;      //[Cat]
106  //  vector< FlagSet >            rset;     //[Role]
107  vector< FlagSet >            pass;     //[Role]
108
109  // vector< vector< Roles > >    connect;  //[Cat][Cat]
110
111  vector< vector< Links > >    connect1; //[Cat][Cat]
112
113  vector< RoleSet >            include;  //[Role]
114  vector< RoleSet >            exclude;  //[Role]
115
116  vector< vector< LongRels > > longrel;  //[Cat][Cat]
117
118  list< Boubble* >             boubbles;
119 
120  vector< vector< list<Boubble*> > >   uptrigger;//[Cat][Role]
121  vector< vector< list<Boubble*> > >   dntrigger;//[Cat][Role]
122
123  void add_category(const char* s);
124  void add_type(const char* s);
125  void add_flag(const char* s)                   { Flag::add(s); }
126  void add_long(const char* l, const char* p)    { LongRel::add(l); boubbles.push_back( new Boubble(p,l) );
127                                                                    boubbles.push_back( (new Boubble(p,l))->reversed() ); }
128  void add_triggers(Cat h, Cat d, LongRel l);
129
130  void set_sgl(Role r)                     { sgl.set(r); }
131  void set_obl(Cat c, Role r)              { obl[c].set(r); }
132  void set_left(Role r)                    { left.set(r); }
133  void set_right(Role r)                   { right.set(r); }
134  void set_init(Role r)                    { init.set(r); }
135  void set_fin(Role r)                     { fin.set(r); }
136  void set_initf(Flag f)                   { initf.set(f); }
137  void set_finf(Flag f)                    { finf.set(f); }
138  void set_order(Role r, Role s)           { lt[s].set(r); }
139
140  //  void set_connect(Cat c, Cat d, Role r)   { connect[c][d].insert(r); }
141  //  void set_connect(Cat c, Cat d, Flag f, Role r)   { connect1[c][d].insert(Link(r,f)); }
142
143  void set_connect(Cat h, Flag hfp, Flag hfm, Cat d, Flag dfp, Flag dfm, Role r, PropSet ps, int lineno )   { connect1[h][d].insert(Link(r,ps,hfp,hfm,dfp,dfm,lineno)); }
144
145  void set_include(Role r, Role s)         { include[r].set(s); }
146  void set_exclude(Role r, Role s)         { exclude[r].set(s); }
147  void set_longrel(Cat c, Cat d, LongRel l){ longrel[c][d].insert(l); }
148  void set_set(Cat c, Flag f)              { set[c].set(f); }
149  void set_pass(Role r, Flag f)            { pass[r].set(f); }
150  void set_lt(Role r, Role s);
151  void compute_gt();
152  void compute_triggers();
153  bool contains_boubble(const list<Boubble*> boubble_list, Boubble* bp) const;
154
155};
156
157//----------------------------------------------------------------------------------------------------
158
159inline
160list<const Link*> Grammar::connectable2(Cat h, Cat d, FlagSet hfs, FlagSet dfs)  // ZBYT WOLNE!!!!!!!!!!!!!!!!!!!!!!!!!! (-> Roles&)
161{
162  list<const Link*> ret;
163  for(Links::const_iterator l = connect1[h][d].begin(); l != connect1[h][d].end(); l++)
164    if( (l->hflagplus==0 || hfs[l->hflagplus]) && (l->hflagminus==0 || !hfs[l->hflagminus]) )
165      if( (l->dflagplus==0 || dfs[l->dflagplus]) && (l->dflagminus==0 || !dfs[l->dflagminus]) )
166        ret.push_back(&(*l));
167  return ret;
168}
169
170//----------------------------------------------------------------------------------------------------
171
172inline
173bool Grammar::check_constr2(NodeProp& hprop, NodeProp& dprop, int dir, const Link& link)    // dir: 0-left 1-right
174{
175  return 
176    !hprop.forbidden[link.role] &&
177    ( dir==1 || (!right[link.role] && !link.props[Prop("RIGHT")]) ) &&  // ZREZYGNOWAÆ Z TABLICY right[<role>]
178    ( dir==0 || (!left[link.role] && !link.props[Prop("LEFT")]) ) &&
179    ( dir!=0 || !hprop.init_attached ) &&
180    ( dir!=1 || !hprop.fin_attached )
181    ;
182}
183
184//----------------------------------------------------------------------------------------------------
185
186inline
187bool Grammar::check_longrel(Cat hcat, Cat dcat, LongRel rel)
188{
189  return longrel[hcat][dcat].find(rel) != longrel[hcat][dcat].end();
190}
191
192//----------------------------------------------------------------------------------------------------
193
194inline bool Grammar::is_sgl(Role r)
195{
196  return sgl[r];
197}
198
199//----------------------------------------------------------------------------------------------------
200
201inline RoleSet Grammar::is_obl(Cat c)
202{
203  return obl[c];
204}
205
206//====================================================================================================
207
208#endif
Note: See TracBrowser for help on using the repository browser.