[0214596] | 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 | |
---|
[9ace5d2] | 13 | |
---|
| 14 | class Link |
---|
| 15 | { |
---|
| 16 | Role role; |
---|
| 17 | FlagSet hflags; |
---|
| 18 | FlagSet dflags; |
---|
[2969c84] | 19 | }; |
---|
[9ace5d2] | 20 | |
---|
| 21 | |
---|
[0214596] | 22 | class Grammar |
---|
| 23 | { |
---|
| 24 | |
---|
| 25 | public: |
---|
| 26 | |
---|
| 27 | // enum CONSTR { SGL, OBL, LEFT, RIGHT, INIT, NONINIT, FIN, NONFIN }; |
---|
| 28 | |
---|
[9ace5d2] | 29 | Grammar() : types_sz(0), cats_sz(0), flags_sz(0) {} ; |
---|
[0214596] | 30 | |
---|
| 31 | int types_sz; |
---|
| 32 | int cats_sz; |
---|
[9ace5d2] | 33 | int flags_sz; |
---|
[0214596] | 34 | |
---|
| 35 | vector< vector< Roles > > connect; |
---|
| 36 | RoleSet sgl; |
---|
| 37 | vector< RoleSet > obl; |
---|
| 38 | RoleSet left; |
---|
| 39 | RoleSet right; |
---|
| 40 | vector< RoleSet > lt; |
---|
| 41 | vector< RoleSet > gt; |
---|
| 42 | |
---|
[9ace5d2] | 43 | |
---|
| 44 | // vector< vector< vector< |
---|
| 45 | vector< FlagSet > set; |
---|
| 46 | vector< FlagSet > pass; |
---|
| 47 | |
---|
[0214596] | 48 | bool read(FILE* f); |
---|
| 49 | void write(FILE* f); |
---|
| 50 | |
---|
| 51 | void add_category(const char* s); |
---|
| 52 | void add_type(const char* s); |
---|
[9ace5d2] | 53 | void add_flag(const char* s); |
---|
[0214596] | 54 | |
---|
| 55 | void set_sgl(Role r) { sgl.set(r); } |
---|
| 56 | void set_obl(Cat c, Role r) { obl[c].set(r); } |
---|
| 57 | void set_left(Role r) { left.set(r); } |
---|
| 58 | void set_right(Role r) { right.set(r); } |
---|
| 59 | void set_order(Role r, Role s) { lt[s].set(r); } |
---|
| 60 | void set_connect(Cat c, Cat d, Role r) { connect[c][d].insert(r); } |
---|
| 61 | void set_lt(Role r, Role s); |
---|
| 62 | void compute_gt(); |
---|
| 63 | |
---|
| 64 | |
---|
| 65 | bool check_constr(NodeProp& hprop, NodeProp& dprop, int dir, Role role); |
---|
| 66 | |
---|
| 67 | }; |
---|
| 68 | |
---|
| 69 | inline bool Grammar::check_constr(NodeProp& hprop, NodeProp& dprop, int dir, Role role) |
---|
| 70 | { |
---|
| 71 | return |
---|
| 72 | !hprop.forbidden[role] && |
---|
| 73 | ( !right[role] || dir==1 ) && |
---|
| 74 | ( !left[role] || dir==0 ) |
---|
| 75 | ; |
---|
| 76 | } |
---|
| 77 | |
---|
| 78 | |
---|
| 79 | #endif |
---|