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 |
---|