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