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