diff options
Diffstat (limited to 'generator')
-rw-r--r-- | generator/CMakeLists.txt | 2 | ||||
-rw-r--r-- | generator/generator.cpp | 545 | ||||
-rw-r--r-- | generator/prepositions.txt | 49 | ||||
-rw-r--r-- | generator/schema.sql | 16 | ||||
-rw-r--r-- | generator/vn.diff | 482 |
5 files changed, 1069 insertions, 25 deletions
diff --git a/generator/CMakeLists.txt b/generator/CMakeLists.txt index bbc3c4f..552526d 100644 --- a/generator/CMakeLists.txt +++ b/generator/CMakeLists.txt | |||
@@ -5,7 +5,7 @@ find_package(PkgConfig) | |||
5 | pkg_check_modules(sqlite3 sqlite3 REQUIRED) | 5 | pkg_check_modules(sqlite3 sqlite3 REQUIRED) |
6 | find_package(libxml2 REQUIRED) | 6 | find_package(libxml2 REQUIRED) |
7 | 7 | ||
8 | include_directories(${sqlite3_INCLUDE_DIR} ${LIBXML2_INCLUDE_DIR}) | 8 | include_directories(${sqlite3_INCLUDE_DIR} ${LIBXML2_INCLUDE_DIR} ../vendor/json/src) |
9 | add_executable(generator generator.cpp) | 9 | add_executable(generator generator.cpp) |
10 | set_property(TARGET generator PROPERTY CXX_STANDARD 11) | 10 | set_property(TARGET generator PROPERTY CXX_STANDARD 11) |
11 | set_property(TARGET generator PROPERTY CXX_STANDARD_REQUIRED ON) | 11 | set_property(TARGET generator PROPERTY CXX_STANDARD_REQUIRED ON) |
diff --git a/generator/generator.cpp b/generator/generator.cpp index 7ec94df..aea750c 100644 --- a/generator/generator.cpp +++ b/generator/generator.cpp | |||
@@ -11,36 +11,75 @@ | |||
11 | #include <regex> | 11 | #include <regex> |
12 | #include <list> | 12 | #include <list> |
13 | #include <algorithm> | 13 | #include <algorithm> |
14 | #include <json.hpp> | ||
14 | #include "progress.h" | 15 | #include "progress.h" |
16 | #include "../lib/util.h" | ||
15 | 17 | ||
16 | struct verb { | 18 | using json = nlohmann::json; |
19 | |||
20 | struct verb_t { | ||
17 | std::string infinitive; | 21 | std::string infinitive; |
18 | std::string past_tense; | 22 | std::string past_tense; |
19 | std::string past_participle; | 23 | std::string past_participle; |
20 | std::string ing_form; | 24 | std::string ing_form; |
21 | std::string s_form; | 25 | std::string s_form; |
26 | int id; | ||
22 | }; | 27 | }; |
23 | 28 | ||
24 | struct adjective { | 29 | struct adjective_t { |
25 | std::string base; | 30 | std::string base; |
26 | std::string comparative; | 31 | std::string comparative; |
27 | std::string superlative; | 32 | std::string superlative; |
28 | }; | 33 | }; |
29 | 34 | ||
30 | struct noun { | 35 | struct noun_t { |
31 | std::string singular; | 36 | std::string singular; |
32 | std::string plural; | 37 | std::string plural; |
33 | }; | 38 | }; |
34 | 39 | ||
35 | struct group { | 40 | struct selrestr_t { |
41 | enum class type_t { | ||
42 | singleton, | ||
43 | andlogic, | ||
44 | orlogic, | ||
45 | empty | ||
46 | }; | ||
47 | type_t type; | ||
48 | std::string restriction; | ||
49 | bool pos; | ||
50 | std::list<selrestr_t> subordinates; | ||
51 | }; | ||
52 | |||
53 | struct framepart_t { | ||
54 | enum class type_t { | ||
55 | np, | ||
56 | v, | ||
57 | pp, | ||
58 | adj, | ||
59 | adv, | ||
60 | lex | ||
61 | }; | ||
62 | type_t type; | ||
63 | std::string role; | ||
64 | selrestr_t selrestrs; | ||
65 | std::set<std::string> preprestrs; | ||
66 | std::set<std::string> synrestrs; | ||
67 | std::list<std::string> choices; | ||
68 | std::string lexval; | ||
69 | }; | ||
70 | |||
71 | struct group_t { | ||
36 | std::string id; | 72 | std::string id; |
73 | std::string parent; | ||
37 | std::set<std::string> members; | 74 | std::set<std::string> members; |
75 | std::map<std::string, selrestr_t> roles; | ||
76 | std::list<std::list<framepart_t>> frames; | ||
38 | }; | 77 | }; |
39 | 78 | ||
40 | std::map<std::string, group> groups; | 79 | std::map<std::string, group_t> groups; |
41 | std::map<std::string, verb> verbs; | 80 | std::map<std::string, verb_t> verbs; |
42 | std::map<std::string, adjective> adjectives; | 81 | std::map<std::string, adjective_t> adjectives; |
43 | std::map<std::string, noun> nouns; | 82 | std::map<std::string, noun_t> nouns; |
44 | std::map<int, std::map<int, int>> wn; | 83 | std::map<int, std::map<int, int>> wn; |
45 | std::map<std::string, std::set<std::string>> pronunciations; | 84 | std::map<std::string, std::set<std::string>> pronunciations; |
46 | 85 | ||
@@ -59,15 +98,97 @@ void print_usage() | |||
59 | exit(1); | 98 | exit(1); |
60 | } | 99 | } |
61 | 100 | ||
62 | void db_error(sqlite3* ppdb, std::string) | 101 | void db_error(sqlite3* ppdb, std::string query) |
63 | { | 102 | { |
64 | std::cout << "Error writing to output database: " << sqlite3_errmsg(ppdb) << std::endl; | 103 | std::cout << "Error writing to output database: " << sqlite3_errmsg(ppdb) << std::endl; |
104 | std::cout << query << std::endl; | ||
65 | sqlite3_close_v2(ppdb); | 105 | sqlite3_close_v2(ppdb); |
66 | print_usage(); | 106 | print_usage(); |
67 | } | 107 | } |
68 | 108 | ||
69 | /* | 109 | json export_selrestrs(selrestr_t r) |
70 | void parse_group(xmlNodePtr top, std::string filename) | 110 | { |
111 | if (r.type == selrestr_t::type_t::empty) | ||
112 | { | ||
113 | return {}; | ||
114 | } else if (r.type == selrestr_t::type_t::singleton) | ||
115 | { | ||
116 | json result; | ||
117 | result["type"] = r.restriction; | ||
118 | result["pos"] = r.pos; | ||
119 | return result; | ||
120 | } else { | ||
121 | json result; | ||
122 | if (r.type == selrestr_t::type_t::andlogic) | ||
123 | { | ||
124 | result["logic"] = "and"; | ||
125 | } else { | ||
126 | result["logic"] = "or"; | ||
127 | } | ||
128 | |||
129 | std::list<json> outlist; | ||
130 | std::transform(std::begin(r.subordinates), std::end(r.subordinates), std::back_inserter(outlist), &export_selrestrs); | ||
131 | result["children"] = outlist; | ||
132 | |||
133 | return result; | ||
134 | } | ||
135 | } | ||
136 | |||
137 | selrestr_t parse_selrestrs(xmlNodePtr top, std::string filename) | ||
138 | { | ||
139 | selrestr_t r; | ||
140 | xmlChar* key; | ||
141 | |||
142 | if (!xmlStrcmp(top->name, (const xmlChar*) "SELRESTRS")) | ||
143 | { | ||
144 | if (xmlChildElementCount(top) == 0) | ||
145 | { | ||
146 | r.type = selrestr_t::type_t::empty; | ||
147 | } else if (xmlChildElementCount(top) == 1) | ||
148 | { | ||
149 | r = parse_selrestrs(xmlFirstElementChild(top), filename); | ||
150 | } else { | ||
151 | r.type = selrestr_t::type_t::andlogic; | ||
152 | |||
153 | if (xmlHasProp(top, (const xmlChar*) "logic")) | ||
154 | { | ||
155 | key = xmlGetProp(top, (const xmlChar*) "logic"); | ||
156 | if (!xmlStrcmp(key, (const xmlChar*) "or")) | ||
157 | { | ||
158 | r.type = selrestr_t::type_t::orlogic; | ||
159 | } | ||
160 | xmlFree(key); | ||
161 | } | ||
162 | |||
163 | for (xmlNodePtr selrestr = top->xmlChildrenNode; selrestr != nullptr; selrestr = selrestr->next) | ||
164 | { | ||
165 | if (!xmlStrcmp(selrestr->name, (const xmlChar*) "SELRESTRS") || !xmlStrcmp(selrestr->name, (const xmlChar*) "SELRESTR")) | ||
166 | { | ||
167 | r.subordinates.push_back(parse_selrestrs(selrestr, filename)); | ||
168 | } | ||
169 | } | ||
170 | } | ||
171 | } else if (!xmlStrcmp(top->name, (const xmlChar*) "SELRESTR")) | ||
172 | { | ||
173 | r.type = selrestr_t::type_t::singleton; | ||
174 | |||
175 | key = xmlGetProp(top, (xmlChar*) "Value"); | ||
176 | r.pos = (std::string((const char*)key) == "+"); | ||
177 | xmlFree(key); | ||
178 | |||
179 | key = xmlGetProp(top, (xmlChar*) "type"); | ||
180 | r.restriction = (const char*) key; | ||
181 | xmlFree(key); | ||
182 | } else { | ||
183 | // Invalid | ||
184 | std::cout << "Bad VerbNet file format: " << filename << std::endl; | ||
185 | print_usage(); | ||
186 | } | ||
187 | |||
188 | return r; | ||
189 | } | ||
190 | |||
191 | group_t& parse_group(xmlNodePtr top, std::string filename) | ||
71 | { | 192 | { |
72 | xmlChar* key = xmlGetProp(top, (xmlChar*) "ID"); | 193 | xmlChar* key = xmlGetProp(top, (xmlChar*) "ID"); |
73 | if (key == 0) | 194 | if (key == 0) |
@@ -75,41 +196,183 @@ void parse_group(xmlNodePtr top, std::string filename) | |||
75 | std::cout << "Bad VerbNet file format: " << filename << std::endl; | 196 | std::cout << "Bad VerbNet file format: " << filename << std::endl; |
76 | print_usage(); | 197 | print_usage(); |
77 | } | 198 | } |
78 | std::string vnid = key; | 199 | std::string vnid = (const char*)key; |
79 | vnid = vnid.substr(vnid.find_first_of("-")+1); | 200 | vnid = vnid.substr(vnid.find_first_of("-")+1); |
80 | xmlFree(key); | 201 | xmlFree(key); |
81 | 202 | ||
82 | group g; | 203 | group_t g; |
83 | g.id = vnid; | 204 | g.id = vnid; |
84 | 205 | ||
85 | for (xmlNodePtr node = top->xmlChildrenNode; node != nullptr; node = node->next) | 206 | for (xmlNodePtr node = top->xmlChildrenNode; node != nullptr; node = node->next) |
86 | { | 207 | { |
87 | if (!xmlStrcmp(node->name, (const xmlChar*) "MEMBERS")) | 208 | if (!xmlStrcmp(node->name, (const xmlChar*) "SUBCLASSES")) |
209 | { | ||
210 | for (xmlNodePtr subclass = node->xmlChildrenNode; subclass != nullptr; subclass = subclass->next) | ||
211 | { | ||
212 | if (!xmlStrcmp(subclass->name, (const xmlChar*) "VNSUBCLASS")) | ||
213 | { | ||
214 | auto& sg = parse_group(subclass, filename); | ||
215 | sg.parent = vnid; | ||
216 | |||
217 | for (auto member : sg.members) | ||
218 | { | ||
219 | g.members.insert(member); | ||
220 | } | ||
221 | |||
222 | // The schema requires that subclasses appear after role definitions, so we can do this now | ||
223 | for (auto role : g.roles) | ||
224 | { | ||
225 | if (sg.roles.count(role.first) == 0) | ||
226 | { | ||
227 | sg.roles[role.first] = role.second; | ||
228 | } | ||
229 | } | ||
230 | } | ||
231 | } | ||
232 | } else if (!xmlStrcmp(node->name, (const xmlChar*) "MEMBERS")) | ||
88 | { | 233 | { |
89 | for (xmlNodePtr member = node->xmlChildrenNode; member != nullptr; member = member->next) | 234 | for (xmlNodePtr member = node->xmlChildrenNode; member != nullptr; member = member->next) |
90 | { | 235 | { |
91 | if (!xmlStrcmp(member->name, (const xmlChar*) "MEMBER")) | 236 | if (!xmlStrcmp(member->name, (const xmlChar*) "MEMBER")) |
92 | { | 237 | { |
93 | key = xmlGetProp(member, (xmlChar*) "name"); | 238 | key = xmlGetProp(member, (xmlChar*) "name"); |
94 | g.members.insert(key); | 239 | g.members.insert((const char*)key); |
95 | xmlFree(key); | 240 | xmlFree(key); |
96 | } | 241 | } |
97 | } | 242 | } |
243 | } else if (!xmlStrcmp(node->name, (const xmlChar*) "THEMROLES")) | ||
244 | { | ||
245 | for (xmlNodePtr role = node->xmlChildrenNode; role != nullptr; role = role->next) | ||
246 | { | ||
247 | if (!xmlStrcmp(role->name, (const xmlChar*) "THEMROLE")) | ||
248 | { | ||
249 | selrestr_t r; | ||
250 | r.type = selrestr_t::type_t::empty; | ||
251 | |||
252 | key = xmlGetProp(role, (const xmlChar*) "type"); | ||
253 | std::string type = (const char*)key; | ||
254 | xmlFree(key); | ||
255 | |||
256 | for (xmlNodePtr rolenode = role->xmlChildrenNode; rolenode != nullptr; rolenode = rolenode->next) | ||
257 | { | ||
258 | if (!xmlStrcmp(rolenode->name, (const xmlChar*) "SELRESTRS")) | ||
259 | { | ||
260 | r = parse_selrestrs(rolenode, filename); | ||
261 | } | ||
262 | } | ||
263 | |||
264 | g.roles[type] = r; | ||
265 | } | ||
266 | } | ||
98 | } else if (!xmlStrcmp(node->name, (const xmlChar*) "FRAMES")) | 267 | } else if (!xmlStrcmp(node->name, (const xmlChar*) "FRAMES")) |
99 | { | 268 | { |
100 | for (xmlNodePtr frame = node->xmlChildrenNode; frame != nullptr; frame = frame->next) | 269 | for (xmlNodePtr frame = node->xmlChildrenNode; frame != nullptr; frame = frame->next) |
101 | { | 270 | { |
102 | if (!xmlStrcmp(frame->name, (const xmlChar*) "FRAME")) | 271 | if (!xmlStrcmp(frame->name, (const xmlChar*) "FRAME")) |
103 | { | 272 | { |
273 | std::list<framepart_t> f; | ||
274 | |||
104 | for (xmlNodePtr framenode = frame->xmlChildrenNode; framenode != nullptr; framenode = framenode->next) | 275 | for (xmlNodePtr framenode = frame->xmlChildrenNode; framenode != nullptr; framenode = framenode->next) |
105 | { | 276 | { |
106 | 277 | if (!xmlStrcmp(framenode->name, (const xmlChar*) "SYNTAX")) | |
278 | { | ||
279 | for (xmlNodePtr syntaxnode = framenode->xmlChildrenNode; syntaxnode != nullptr; syntaxnode = syntaxnode->next) | ||
280 | { | ||
281 | framepart_t fp; | ||
282 | |||
283 | if (!xmlStrcmp(syntaxnode->name, (const xmlChar*) "NP")) | ||
284 | { | ||
285 | fp.type = framepart_t::type_t::np; | ||
286 | |||
287 | key = xmlGetProp(syntaxnode, (xmlChar*) "value"); | ||
288 | fp.role = (const char*)key; | ||
289 | xmlFree(key); | ||
290 | |||
291 | fp.selrestrs.type = selrestr_t::type_t::empty; | ||
292 | |||
293 | for (xmlNodePtr npnode = syntaxnode->xmlChildrenNode; npnode != nullptr; npnode = npnode->next) | ||
294 | { | ||
295 | if (!xmlStrcmp(npnode->name, (const xmlChar*) "SYNRESTRS")) | ||
296 | { | ||
297 | for (xmlNodePtr synrestr = npnode->xmlChildrenNode; synrestr != nullptr; synrestr = synrestr->next) | ||
298 | { | ||
299 | if (!xmlStrcmp(synrestr->name, (const xmlChar*) "SYNRESTR")) | ||
300 | { | ||
301 | key = xmlGetProp(synrestr, (xmlChar*) "type"); | ||
302 | fp.synrestrs.insert(std::string((const char*)key)); | ||
303 | xmlFree(key); | ||
304 | } | ||
305 | } | ||
306 | } | ||
307 | |||
308 | if (!xmlStrcmp(npnode->name, (const xmlChar*) "SELRESTRS")) | ||
309 | { | ||
310 | fp.selrestrs = parse_selrestrs(npnode, filename); | ||
311 | } | ||
312 | } | ||
313 | } else if (!xmlStrcmp(syntaxnode->name, (xmlChar*) "VERB")) | ||
314 | { | ||
315 | fp.type = framepart_t::type_t::v; | ||
316 | } else if (!xmlStrcmp(syntaxnode->name, (xmlChar*) "PREP")) | ||
317 | { | ||
318 | fp.type = framepart_t::type_t::pp; | ||
319 | |||
320 | if (xmlHasProp(syntaxnode, (xmlChar*) "value")) | ||
321 | { | ||
322 | key = xmlGetProp(syntaxnode, (xmlChar*) "value"); | ||
323 | std::string choices = (const char*)key; | ||
324 | xmlFree(key); | ||
325 | |||
326 | fp.choices = verbly::split<std::list<std::string>>(choices, " "); | ||
327 | } | ||
328 | |||
329 | for (xmlNodePtr npnode = syntaxnode->xmlChildrenNode; npnode != nullptr; npnode = npnode->next) | ||
330 | { | ||
331 | if (!xmlStrcmp(npnode->name, (const xmlChar*) "SELRESTRS")) | ||
332 | { | ||
333 | for (xmlNodePtr synrestr = npnode->xmlChildrenNode; synrestr != nullptr; synrestr = synrestr->next) | ||
334 | { | ||
335 | if (!xmlStrcmp(synrestr->name, (const xmlChar*) "SELRESTR")) | ||
336 | { | ||
337 | key = xmlGetProp(synrestr, (xmlChar*) "type"); | ||
338 | fp.preprestrs.insert(std::string((const char*)key)); | ||
339 | xmlFree(key); | ||
340 | } | ||
341 | } | ||
342 | } | ||
343 | } | ||
344 | } else if (!xmlStrcmp(syntaxnode->name, (xmlChar*) "ADJ")) | ||
345 | { | ||
346 | fp.type = framepart_t::type_t::adj; | ||
347 | } else if (!xmlStrcmp(syntaxnode->name, (xmlChar*) "ADV")) | ||
348 | { | ||
349 | fp.type = framepart_t::type_t::adv; | ||
350 | } else if (!xmlStrcmp(syntaxnode->name, (xmlChar*) "LEX")) | ||
351 | { | ||
352 | fp.type = framepart_t::type_t::lex; | ||
353 | |||
354 | key = xmlGetProp(syntaxnode, (xmlChar*) "value"); | ||
355 | fp.lexval = (const char*)key; | ||
356 | xmlFree(key); | ||
357 | } else { | ||
358 | continue; | ||
359 | } | ||
360 | |||
361 | f.push_back(fp); | ||
362 | } | ||
363 | |||
364 | g.frames.push_back(f); | ||
365 | } | ||
107 | } | 366 | } |
108 | } | 367 | } |
109 | } | 368 | } |
110 | } | 369 | } |
111 | } | 370 | } |
112 | }*/ | 371 | |
372 | groups[vnid] = g; | ||
373 | |||
374 | return groups[vnid]; | ||
375 | } | ||
113 | 376 | ||
114 | int main(int argc, char** argv) | 377 | int main(int argc, char** argv) |
115 | { | 378 | { |
@@ -118,7 +381,10 @@ int main(int argc, char** argv) | |||
118 | print_usage(); | 381 | print_usage(); |
119 | } | 382 | } |
120 | 383 | ||
121 | /*DIR* dir; | 384 | // VerbNet data |
385 | std::cout << "Reading verb frames..." << std::endl; | ||
386 | |||
387 | DIR* dir; | ||
122 | if ((dir = opendir(argv[1])) == nullptr) | 388 | if ((dir = opendir(argv[1])) == nullptr) |
123 | { | 389 | { |
124 | std::cout << "Invalid VerbNet data directory." << std::endl; | 390 | std::cout << "Invalid VerbNet data directory." << std::endl; |
@@ -160,7 +426,7 @@ int main(int argc, char** argv) | |||
160 | parse_group(top, filename); | 426 | parse_group(top, filename); |
161 | } | 427 | } |
162 | 428 | ||
163 | closedir(dir);*/ | 429 | closedir(dir); |
164 | 430 | ||
165 | // Get verbs from AGID | 431 | // Get verbs from AGID |
166 | std::cout << "Reading inflections..." << std::endl; | 432 | std::cout << "Reading inflections..." << std::endl; |
@@ -222,7 +488,7 @@ int main(int argc, char** argv) | |||
222 | { | 488 | { |
223 | case 'V': | 489 | case 'V': |
224 | { | 490 | { |
225 | verb v; | 491 | verb_t v; |
226 | v.infinitive = word; | 492 | v.infinitive = word; |
227 | if (forms.size() == 4) | 493 | if (forms.size() == 4) |
228 | { | 494 | { |
@@ -258,7 +524,7 @@ int main(int argc, char** argv) | |||
258 | 524 | ||
259 | case 'A': | 525 | case 'A': |
260 | { | 526 | { |
261 | adjective adj; | 527 | adjective_t adj; |
262 | adj.base = word; | 528 | adj.base = word; |
263 | if (forms.size() == 2) | 529 | if (forms.size() == 2) |
264 | { | 530 | { |
@@ -276,7 +542,7 @@ int main(int argc, char** argv) | |||
276 | 542 | ||
277 | case 'N': | 543 | case 'N': |
278 | { | 544 | { |
279 | noun n; | 545 | noun_t n; |
280 | n.singular = word; | 546 | n.singular = word; |
281 | if (forms.size() == 1) | 547 | if (forms.size() == 1) |
282 | { | 548 | { |
@@ -388,6 +654,85 @@ int main(int argc, char** argv) | |||
388 | sqlite3_finalize(schmstmt); | 654 | sqlite3_finalize(schmstmt); |
389 | } | 655 | } |
390 | 656 | ||
657 | std::cout << "Writing prepositions..." << std::endl; | ||
658 | std::ifstream prepfile("prepositions.txt"); | ||
659 | if (!prepfile.is_open()) | ||
660 | { | ||
661 | std::cout << "Could not find prepositions file" << std::endl; | ||
662 | print_usage(); | ||
663 | } | ||
664 | |||
665 | for (;;) | ||
666 | { | ||
667 | std::string line; | ||
668 | if (!getline(prepfile, line)) | ||
669 | { | ||
670 | break; | ||
671 | } | ||
672 | |||
673 | if (line.back() == '\r') | ||
674 | { | ||
675 | line.pop_back(); | ||
676 | } | ||
677 | |||
678 | std::regex relation("^([^:]+): (.+)"); | ||
679 | std::smatch relation_data; | ||
680 | std::regex_search(line, relation_data, relation); | ||
681 | std::string prep = relation_data[1]; | ||
682 | std::list<std::string> groups = verbly::split<std::list<std::string>>(relation_data[2], ", "); | ||
683 | |||
684 | std::string query("INSERT INTO prepositions (form) VALUES (?)"); | ||
685 | sqlite3_stmt* ppstmt; | ||
686 | |||
687 | if (sqlite3_prepare_v2(ppdb, query.c_str(), query.length(), &ppstmt, NULL) != SQLITE_OK) | ||
688 | { | ||
689 | db_error(ppdb, query); | ||
690 | } | ||
691 | |||
692 | sqlite3_bind_text(ppstmt, 1, prep.c_str(), prep.length(), SQLITE_STATIC); | ||
693 | |||
694 | if (sqlite3_step(ppstmt) != SQLITE_DONE) | ||
695 | { | ||
696 | db_error(ppdb, query); | ||
697 | } | ||
698 | |||
699 | sqlite3_finalize(ppstmt); | ||
700 | |||
701 | query = "SELECT last_insert_rowid()"; | ||
702 | if (sqlite3_prepare_v2(ppdb, query.c_str(), query.length(), &ppstmt, NULL) != SQLITE_OK) | ||
703 | { | ||
704 | db_error(ppdb, query); | ||
705 | } | ||
706 | |||
707 | if (sqlite3_step(ppstmt) != SQLITE_ROW) | ||
708 | { | ||
709 | db_error(ppdb, query); | ||
710 | } | ||
711 | |||
712 | int rowid = sqlite3_column_int(ppstmt, 0); | ||
713 | sqlite3_finalize(ppstmt); | ||
714 | |||
715 | for (auto group : groups) | ||
716 | { | ||
717 | query = "INSERT INTO preposition_groups (preposition_id, groupname) VALUES (?, ?)"; | ||
718 | if (sqlite3_prepare_v2(ppdb, query.c_str(), query.length(), &ppstmt, NULL) != SQLITE_OK) | ||
719 | { | ||
720 | db_error(ppdb, query); | ||
721 | } | ||
722 | |||
723 | sqlite3_bind_int(ppstmt, 1, rowid); | ||
724 | sqlite3_bind_text(ppstmt, 2, group.c_str(), group.length(), SQLITE_STATIC); | ||
725 | |||
726 | if (sqlite3_step(ppstmt) != SQLITE_DONE) | ||
727 | { | ||
728 | db_error(ppdb, query); | ||
729 | } | ||
730 | |||
731 | sqlite3_finalize(ppstmt); | ||
732 | } | ||
733 | } | ||
734 | |||
735 | |||
391 | { | 736 | { |
392 | progress ppgs("Writing verbs...", verbs.size()); | 737 | progress ppgs("Writing verbs...", verbs.size()); |
393 | for (auto& mapping : verbs) | 738 | for (auto& mapping : verbs) |
@@ -431,6 +776,8 @@ int main(int argc, char** argv) | |||
431 | 776 | ||
432 | sqlite3_finalize(ppstmt); | 777 | sqlite3_finalize(ppstmt); |
433 | 778 | ||
779 | mapping.second.id = rowid; | ||
780 | |||
434 | for (auto pronunciation : pronunciations[canonical]) | 781 | for (auto pronunciation : pronunciations[canonical]) |
435 | { | 782 | { |
436 | query = "INSERT INTO verb_pronunciations (verb_id, pronunciation) VALUES (?, ?)"; | 783 | query = "INSERT INTO verb_pronunciations (verb_id, pronunciation) VALUES (?, ?)"; |
@@ -455,6 +802,160 @@ int main(int argc, char** argv) | |||
455 | } | 802 | } |
456 | } | 803 | } |
457 | 804 | ||
805 | { | ||
806 | progress ppgs("Writing verb frames...", groups.size()); | ||
807 | for (auto& mapping : groups) | ||
808 | { | ||
809 | std::list<json> roledatal; | ||
810 | std::transform(std::begin(mapping.second.roles), std::end(mapping.second.roles), std::back_inserter(roledatal), [] (std::pair<std::string, selrestr_t> r) { | ||
811 | json role; | ||
812 | role["type"] = r.first; | ||
813 | role["selrestrs"] = export_selrestrs(r.second); | ||
814 | |||
815 | return role; | ||
816 | }); | ||
817 | |||
818 | json roledata(roledatal); | ||
819 | std::string rdm = roledata.dump(); | ||
820 | |||
821 | sqlite3_stmt* ppstmt; | ||
822 | std::string query("INSERT INTO groups (data) VALUES (?)"); | ||
823 | if (sqlite3_prepare_v2(ppdb, query.c_str(), query.length(), &ppstmt, NULL) != SQLITE_OK) | ||
824 | { | ||
825 | db_error(ppdb, query); | ||
826 | } | ||
827 | |||
828 | sqlite3_bind_blob(ppstmt, 1, rdm.c_str(), rdm.size(), SQLITE_STATIC); | ||
829 | |||
830 | if (sqlite3_step(ppstmt) != SQLITE_DONE) | ||
831 | { | ||
832 | db_error(ppdb, query); | ||
833 | } | ||
834 | |||
835 | sqlite3_finalize(ppstmt); | ||
836 | |||
837 | query = "SELECT last_insert_rowid()"; | ||
838 | if (sqlite3_prepare_v2(ppdb, query.c_str(), query.length(), &ppstmt, NULL) != SQLITE_OK) | ||
839 | { | ||
840 | db_error(ppdb, query); | ||
841 | } | ||
842 | |||
843 | if (sqlite3_step(ppstmt) != SQLITE_ROW) | ||
844 | { | ||
845 | db_error(ppdb, query); | ||
846 | } | ||
847 | |||
848 | int gid = sqlite3_column_int(ppstmt, 0); | ||
849 | sqlite3_finalize(ppstmt); | ||
850 | |||
851 | for (auto frame : mapping.second.frames) | ||
852 | { | ||
853 | std::list<json> fdatap; | ||
854 | std::transform(std::begin(frame), std::end(frame), std::back_inserter(fdatap), [] (framepart_t& fp) { | ||
855 | json part; | ||
856 | |||
857 | switch (fp.type) | ||
858 | { | ||
859 | case framepart_t::type_t::np: | ||
860 | { | ||
861 | part["type"] = "np"; | ||
862 | part["role"] = fp.role; | ||
863 | part["selrestrs"] = export_selrestrs(fp.selrestrs); | ||
864 | part["synrestrs"] = fp.synrestrs; | ||
865 | |||
866 | break; | ||
867 | } | ||
868 | |||
869 | case framepart_t::type_t::pp: | ||
870 | { | ||
871 | part["type"] = "pp"; | ||
872 | part["values"] = fp.choices; | ||
873 | part["preprestrs"] = fp.preprestrs; | ||
874 | |||
875 | break; | ||
876 | } | ||
877 | |||
878 | case framepart_t::type_t::v: | ||
879 | { | ||
880 | part["type"] = "v"; | ||
881 | |||
882 | break; | ||
883 | } | ||
884 | |||
885 | case framepart_t::type_t::adj: | ||
886 | { | ||
887 | part["type"] = "adj"; | ||
888 | |||
889 | break; | ||
890 | } | ||
891 | |||
892 | case framepart_t::type_t::adv: | ||
893 | { | ||
894 | part["type"] = "adv"; | ||
895 | |||
896 | break; | ||
897 | } | ||
898 | |||
899 | case framepart_t::type_t::lex: | ||
900 | { | ||
901 | part["type"] = "lex"; | ||
902 | part["value"] = fp.lexval; | ||
903 | |||
904 | break; | ||
905 | } | ||
906 | } | ||
907 | |||
908 | return part; | ||
909 | }); | ||
910 | |||
911 | json fdata(fdatap); | ||
912 | std::string marshall = fdata.dump(); | ||
913 | |||
914 | query = "INSERT INTO frames (group_id, data) VALUES (?, ?)"; | ||
915 | if (sqlite3_prepare_v2(ppdb, query.c_str(), query.length(), &ppstmt, NULL) != SQLITE_OK) | ||
916 | { | ||
917 | db_error(ppdb, query); | ||
918 | } | ||
919 | |||
920 | sqlite3_bind_int(ppstmt, 1, gid); | ||
921 | sqlite3_bind_blob(ppstmt, 2, marshall.c_str(), marshall.length(), SQLITE_STATIC); | ||
922 | |||
923 | if (sqlite3_step(ppstmt) != SQLITE_DONE) | ||
924 | { | ||
925 | db_error(ppdb, query); | ||
926 | } | ||
927 | |||
928 | sqlite3_finalize(ppstmt); | ||
929 | } | ||
930 | |||
931 | for (auto member : mapping.second.members) | ||
932 | { | ||
933 | if (verbs.count(member) == 1) | ||
934 | { | ||
935 | auto& v = verbs[member]; | ||
936 | |||
937 | query = "INSERT INTO verb_groups (verb_id, group_id) VALUES (?, ?)"; | ||
938 | if (sqlite3_prepare_v2(ppdb, query.c_str(), query.length(), &ppstmt, NULL) != SQLITE_OK) | ||
939 | { | ||
940 | db_error(ppdb, query); | ||
941 | } | ||
942 | |||
943 | sqlite3_bind_int(ppstmt, 1, v.id); | ||
944 | sqlite3_bind_int(ppstmt, 2, gid); | ||
945 | |||
946 | if (sqlite3_step(ppstmt) != SQLITE_DONE) | ||
947 | { | ||
948 | db_error(ppdb, query); | ||
949 | } | ||
950 | |||
951 | sqlite3_finalize(ppstmt); | ||
952 | } | ||
953 | } | ||
954 | |||
955 | ppgs.update(); | ||
956 | } | ||
957 | } | ||
958 | |||
458 | // Get nouns/adjectives/adverbs from WordNet | 959 | // Get nouns/adjectives/adverbs from WordNet |
459 | // Useful relations: | 960 | // Useful relations: |
460 | // - s: master list | 961 | // - s: master list |
diff --git a/generator/prepositions.txt b/generator/prepositions.txt new file mode 100644 index 0000000..283e5c4 --- /dev/null +++ b/generator/prepositions.txt | |||
@@ -0,0 +1,49 @@ | |||
1 | from: src, path, spatial, loc | ||
2 | out: src, path, spatial | ||
3 | out of: src, path, spatial, loc | ||
4 | off: src, path, spatial, loc | ||
5 | off of: src, path, spatial | ||
6 | into: dest_conf, dest, path, spatial | ||
7 | onto: dest_conf, dest, path, spatial | ||
8 | for: dest_dir, dest, path, spatial | ||
9 | at: dest_dir, dest, path, spatial, loc | ||
10 | to: dest_dir, dest, path, spatial | ||
11 | towards: dest_dir, dest, path, spatial | ||
12 | along: dir, path, spatial, loc | ||
13 | across: dir, path, spatial | ||
14 | around: dir, path, spatial, loc | ||
15 | down: dir, path, spatial | ||
16 | over: dir, path, spatial, loc | ||
17 | past: dir, path, spatial | ||
18 | round: dir, path, spatial, loc | ||
19 | through: dir, path, spatial | ||
20 | towards: dir, path, spatial | ||
21 | up: dir, path, spatial | ||
22 | about: loc, spatial | ||
23 | above: loc, spatial | ||
24 | against: loc, spatial | ||
25 | alongside: loc, spatial | ||
26 | amid: loc, spatial | ||
27 | among: loc, spatial | ||
28 | amongst: loc, spatial | ||
29 | astride: loc, spatial | ||
30 | athwart: loc, spatial | ||
31 | before: loc, spatial | ||
32 | behind: loc, spatial | ||
33 | beside: loc, spatial | ||
34 | between: loc, spatial | ||
35 | beyond: loc, spatial | ||
36 | by: loc, spatial | ||
37 | in: loc, spatial | ||
38 | in front of: loc, spatial | ||
39 | inside: loc, spatial | ||
40 | near: loc, spatial | ||
41 | next to: loc, spatial | ||
42 | on: loc, spatial | ||
43 | opposite: loc, spatial | ||
44 | outside: loc, spatial | ||
45 | throughout: loc, spatial | ||
46 | under: loc, spatial | ||
47 | underneath: loc, spatial | ||
48 | upon: loc, spatial | ||
49 | within: loc, spatial \ No newline at end of file | ||
diff --git a/generator/schema.sql b/generator/schema.sql index 8e1e822..2295444 100644 --- a/generator/schema.sql +++ b/generator/schema.sql | |||
@@ -11,8 +11,7 @@ CREATE TABLE `verbs` ( | |||
11 | DROP TABLE IF EXISTS `groups`; | 11 | DROP TABLE IF EXISTS `groups`; |
12 | CREATE TABLE `groups` ( | 12 | CREATE TABLE `groups` ( |
13 | `group_id` INTEGER PRIMARY KEY, | 13 | `group_id` INTEGER PRIMARY KEY, |
14 | `parent_id` INTEGER, | 14 | `data` BLOB NOT NULL |
15 | FOREIGN KEY (`parent_id`) REFERENCES `groups`(`group_id`) | ||
16 | ); | 15 | ); |
17 | 16 | ||
18 | DROP TABLE IF EXISTS `frames`; | 17 | DROP TABLE IF EXISTS `frames`; |
@@ -251,3 +250,16 @@ CREATE TABLE `adverb_adverb_derivation` ( | |||
251 | FOREIGN KEY (`adverb_1_id`) REFERENCES `adverbs`(`adverb_id`), | 250 | FOREIGN KEY (`adverb_1_id`) REFERENCES `adverbs`(`adverb_id`), |
252 | FOREIGN KEY (`adverb_2_id`) REFERENCES `adverbs`(`adverb_id`) | 251 | FOREIGN KEY (`adverb_2_id`) REFERENCES `adverbs`(`adverb_id`) |
253 | ); | 252 | ); |
253 | |||
254 | DROP TABLE IF EXISTS `prepositions`; | ||
255 | CREATE TABLE `prepositions` ( | ||
256 | `preposition_id` INTEGER PRIMARY KEY, | ||
257 | `form` VARCHAR(32) NOT NULL | ||
258 | ); | ||
259 | |||
260 | DROP TABLE IF EXISTS `preposition_groups`; | ||
261 | CREATE TABLE `preposition_groups` ( | ||
262 | `preposition_id` INTEGER NOT NULL, | ||
263 | `groupname` VARCHAR(32) NOT NULL, | ||
264 | FOREIGN KEY (`preposition_id`) REFERENCES `prepositions`(`preposition_id`) | ||
265 | ); | ||
diff --git a/generator/vn.diff b/generator/vn.diff new file mode 100644 index 0000000..f636d28 --- /dev/null +++ b/generator/vn.diff | |||
@@ -0,0 +1,482 @@ | |||
1 | diff /Users/hatkirby/Downloads/new_vn 2/admit-65.xml datadir/vn/admit-65.xml | ||
2 | 104c104 | ||
3 | < <SELRESTRS logic="or"> | ||
4 | --- | ||
5 | > <SELRESTRS> | ||
6 | diff /Users/hatkirby/Downloads/new_vn 2/amuse-31.1.xml datadir/vn/amuse-31.1.xml | ||
7 | 270a271,273 | ||
8 | > <THEMROLE type="Cause"> | ||
9 | > <SELRESTRS/> | ||
10 | > </THEMROLE> | ||
11 | 368c371,373 | ||
12 | < <LEX value="'s"/> | ||
13 | --- | ||
14 | > <NP value="Cause"> | ||
15 | > <SYNRESTRS/> | ||
16 | > </NP> | ||
17 | 404c409,411 | ||
18 | < <SYNRESTRS/> | ||
19 | --- | ||
20 | > <SYNRESTRS> | ||
21 | > <SYNRESTR Value="+" type="adjp"/> | ||
22 | > </SYNRESTRS> | ||
23 | diff /Users/hatkirby/Downloads/new_vn 2/animal_sounds-38.xml datadir/vn/animal_sounds-38.xml | ||
24 | 186a187,191 | ||
25 | > <PREP> | ||
26 | > <SELRESTRS> | ||
27 | > <SELRESTR Value="+" type="loc" /> | ||
28 | > </SELRESTRS> | ||
29 | > </PREP> | ||
30 | diff /Users/hatkirby/Downloads/new_vn 2/assessment-34.1.xml datadir/vn/assessment-34.1.xml | ||
31 | 103d102 | ||
32 | < <LEX value="'s"/> | ||
33 | diff /Users/hatkirby/Downloads/new_vn 2/battle-36.4.xml datadir/vn/battle-36.4.xml | ||
34 | 96c96 | ||
35 | < <SYNRESTR Value="+" type="what_extract"/> | ||
36 | --- | ||
37 | > <SYNRESTR Value="+" type="wh_comp"/> | ||
38 | diff /Users/hatkirby/Downloads/new_vn 2/become-109.1.xml datadir/vn/become-109.1.xml | ||
39 | 34c34,36 | ||
40 | < <SYNRESTRS/> | ||
41 | --- | ||
42 | > <SYNRESTRS> | ||
43 | > <SYNRESTR Value="+" type="adjp"/> | ||
44 | > </SYNRESTRS> | ||
45 | diff /Users/hatkirby/Downloads/new_vn 2/beg-58.2.xml datadir/vn/beg-58.2.xml | ||
46 | 41c41 | ||
47 | < <SYNRESTR Value="-" type="for_comp"/> | ||
48 | --- | ||
49 | > <SYNRESTR Value="+" type="for_comp"/> | ||
50 | diff /Users/hatkirby/Downloads/new_vn 2/bend-45.2.xml datadir/vn/bend-45.2.xml | ||
51 | 47c47,49 | ||
52 | < <SELRESTRS/> | ||
53 | --- | ||
54 | > <SELRESTRS> | ||
55 | > <SELRESTR Value="+" type="state"/> | ||
56 | > </SELRESTRS> | ||
57 | 230c232,234 | ||
58 | < <SYNRESTRS/> | ||
59 | --- | ||
60 | > <SYNRESTRS> | ||
61 | > <SYNRESTR Value="+" type="adjp"/> | ||
62 | > </SYNRESTRS> | ||
63 | 280,282c284 | ||
64 | < <SELRESTRS> | ||
65 | < <SELRESTR Value="+" type="state"/> | ||
66 | < </SELRESTRS> | ||
67 | --- | ||
68 | > <SELRESTRS/> | ||
69 | 332,334c334 | ||
70 | < <SELRESTRS> | ||
71 | < <SELRESTR Value="+" type="state"/> | ||
72 | < </SELRESTRS> | ||
73 | --- | ||
74 | > <SELRESTRS/> | ||
75 | diff /Users/hatkirby/Downloads/new_vn 2/break-45.1.xml datadir/vn/break-45.1.xml | ||
76 | 255c255,257 | ||
77 | < <SYNRESTRS/> | ||
78 | --- | ||
79 | > <SYNRESTRS> | ||
80 | > <SYNRESTR Value="+" type="adjp"/> | ||
81 | > </SYNRESTRS> | ||
82 | 307c309,311 | ||
83 | < <SYNRESTRS/> | ||
84 | --- | ||
85 | > <SYNRESTRS> | ||
86 | > <SYNRESTR Value="+" type="adjp"/> | ||
87 | > </SYNRESTRS> | ||
88 | diff /Users/hatkirby/Downloads/new_vn 2/characterize-29.2.xml datadir/vn/characterize-29.2.xml | ||
89 | 107c107 | ||
90 | < <LEX value="as"/> | ||
91 | --- | ||
92 | > <LEX value="to be"/> | ||
93 | 109,111c109,111 | ||
94 | < <SYNRESTRS> | ||
95 | < <SYNRESTR Value="+" type="small_clause"/> | ||
96 | < </SYNRESTRS> | ||
97 | --- | ||
98 | > <SYNRESTRS> | ||
99 | > <SYNRESTR Value="+" type="adjp"/> | ||
100 | > </SYNRESTRS> | ||
101 | 386a387,391 | ||
102 | > <NP value="Attribute"> | ||
103 | > <SYNRESTRS> | ||
104 | > <SYNRESTR Value="+" type="adjp"/> | ||
105 | > </SYNRESTRS> | ||
106 | > </NP> | ||
107 | diff /Users/hatkirby/Downloads/new_vn 2/coloring-24.xml datadir/vn/coloring-24.xml | ||
108 | 89c89,91 | ||
109 | < <SYNRESTRS/> | ||
110 | --- | ||
111 | > <SYNRESTRS> | ||
112 | > <SYNRESTR Value="+" type="adjp"/> | ||
113 | > </SYNRESTRS> | ||
114 | diff /Users/hatkirby/Downloads/new_vn 2/confess-37.10.xml datadir/vn/confess-37.10.xml | ||
115 | 110a111,115 | ||
116 | > <NP value="Attribute"> | ||
117 | > <SYNRESTRS> | ||
118 | > <SYNRESTR Value="+" type="adjp"/> | ||
119 | > </SYNRESTRS> | ||
120 | > </NP> | ||
121 | diff /Users/hatkirby/Downloads/new_vn 2/consider-29.9.xml datadir/vn/consider-29.9.xml | ||
122 | 191,193c191,193 | ||
123 | < <SYNRESTRS> | ||
124 | < <SYNRESTR Value="-" type="sentential"/> | ||
125 | < </SYNRESTRS> | ||
126 | --- | ||
127 | > <SYNRESTRS> | ||
128 | > <SYNRESTR Value="+" type="adjp"/> | ||
129 | > </SYNRESTRS> | ||
130 | 334,336c334,336 | ||
131 | < <SYNRESTRS> | ||
132 | < <SYNRESTR Value="-" type="sentential"/> | ||
133 | < </SYNRESTRS> | ||
134 | --- | ||
135 | > <SYNRESTRS> | ||
136 | > <SYNRESTR Value="+" type="adjp"/> | ||
137 | > </SYNRESTRS> | ||
138 | 468,470c468,470 | ||
139 | < <SYNRESTRS> | ||
140 | < <SYNRESTR Value="-" type="sentential"/> | ||
141 | < </SYNRESTRS> | ||
142 | --- | ||
143 | > <SYNRESTRS> | ||
144 | > <SYNRESTR Value="+" type="adjp"/> | ||
145 | > </SYNRESTRS> | ||
146 | 554,556c554,556 | ||
147 | < <SYNRESTRS> | ||
148 | < <SYNRESTR Value="-" type="sentential"/> | ||
149 | < </SYNRESTRS> | ||
150 | --- | ||
151 | > <SYNRESTRS> | ||
152 | > <SYNRESTR Value="+" type="adjp"/> | ||
153 | > </SYNRESTRS> | ||
154 | diff /Users/hatkirby/Downloads/new_vn 2/cut-21.1.xml datadir/vn/cut-21.1.xml | ||
155 | 316c316,318 | ||
156 | < <SYNRESTRS/> | ||
157 | --- | ||
158 | > <SYNRESTRS> | ||
159 | > <SYNRESTR Value="+" type="adjp"/> | ||
160 | > </SYNRESTRS> | ||
161 | 368c370,372 | ||
162 | < <SYNRESTRS/> | ||
163 | --- | ||
164 | > <SYNRESTRS> | ||
165 | > <SYNRESTR Value="+" type="adjp"/> | ||
166 | > </SYNRESTRS> | ||
167 | 560c564,566 | ||
168 | < <SYNRESTRS/> | ||
169 | --- | ||
170 | > <SYNRESTRS> | ||
171 | > <SYNRESTR Value="+" type="adjp"/> | ||
172 | > </SYNRESTRS> | ||
173 | diff /Users/hatkirby/Downloads/new_vn 2/declare-29.4.xml datadir/vn/declare-29.4.xml | ||
174 | 33,35c33,35 | ||
175 | < <SYNRESTRS> | ||
176 | < <SYNRESTR Value="-" type="sentential"/> | ||
177 | < </SYNRESTRS> | ||
178 | --- | ||
179 | > <SYNRESTRS> | ||
180 | > <SYNRESTR Value="+" type="adjp"/> | ||
181 | > </SYNRESTRS> | ||
182 | 122,124c122,124 | ||
183 | < <SYNRESTRS> | ||
184 | < <SYNRESTR Value="-" type="sentential"/> | ||
185 | < </SYNRESTRS> | ||
186 | --- | ||
187 | > <SYNRESTRS> | ||
188 | > <SYNRESTR Value="+" type="adjp"/> | ||
189 | > </SYNRESTRS> | ||
190 | 244,246c244,246 | ||
191 | < <SYNRESTRS> | ||
192 | < <SYNRESTR Value="-" type="sentential"/> | ||
193 | < </SYNRESTRS> | ||
194 | --- | ||
195 | > <SYNRESTRS> | ||
196 | > <SYNRESTR Value="+" type="adjp"/> | ||
197 | > </SYNRESTRS> | ||
198 | diff /Users/hatkirby/Downloads/new_vn 2/estimate-34.2.xml datadir/vn/estimate-34.2.xml | ||
199 | 123a124 | ||
200 | > <LEX value="to be"/> | ||
201 | 125,127c126,128 | ||
202 | < <SYNRESTRS> | ||
203 | < <SYNRESTR Value="+" type="to_be"/> | ||
204 | < </SYNRESTRS> | ||
205 | --- | ||
206 | > <SYNRESTRS> | ||
207 | > <SYNRESTR Value="+" type="adjp"/> | ||
208 | > </SYNRESTRS> | ||
209 | diff /Users/hatkirby/Downloads/new_vn 2/get-13.5.1.xml datadir/vn/get-13.5.1.xml | ||
210 | 55,56c55 | ||
211 | < <SELRESTR Value="-" type="location"/> | ||
212 | < <SELRESTR Value="-" type="region"/> | ||
213 | --- | ||
214 | > <SELRESTR Value="+" type="currency"/> | ||
215 | diff /Users/hatkirby/Downloads/new_vn 2/hit-18.1.xml datadir/vn/hit-18.1.xml | ||
216 | 234c234,236 | ||
217 | < <SYNRESTRS/> | ||
218 | --- | ||
219 | > <SYNRESTRS> | ||
220 | > <SYNRESTR Value="+" type="adjp"/> | ||
221 | > </SYNRESTRS> | ||
222 | 294c296,298 | ||
223 | < <SYNRESTRS/> | ||
224 | --- | ||
225 | > <SYNRESTRS> | ||
226 | > <SYNRESTR Value="+" type="adjp"/> | ||
227 | > </SYNRESTRS> | ||
228 | 619c623,625 | ||
229 | < <SYNRESTRS/> | ||
230 | --- | ||
231 | > <SYNRESTRS> | ||
232 | > <SYNRESTR Value="+" type="adjp"/> | ||
233 | > </SYNRESTRS> | ||
234 | diff /Users/hatkirby/Downloads/new_vn 2/instr_communication-37.4.xml datadir/vn/instr_communication-37.4.xml | ||
235 | 195c195,197 | ||
236 | < <SYNRESTRS/> | ||
237 | --- | ||
238 | > <SYNRESTRS> | ||
239 | > <SYNRESTR Value="+" type="quotation"/> | ||
240 | > </SYNRESTRS> | ||
241 | 233c235,237 | ||
242 | < <SYNRESTRS/> | ||
243 | --- | ||
244 | > <SYNRESTRS> | ||
245 | > <SYNRESTR Value="+" type="quotation"/> | ||
246 | > </SYNRESTRS> | ||
247 | diff /Users/hatkirby/Downloads/new_vn 2/judgment-33.xml datadir/vn/judgment-33.xml | ||
248 | 187a188,190 | ||
249 | > <NP value="Attribute"> | ||
250 | > <SYNRESTRS/> | ||
251 | > </NP> | ||
252 | 243a247 | ||
253 | > <LEX value="to be"/> | ||
254 | 245,247c249 | ||
255 | < <SYNRESTRS> | ||
256 | < <SYNRESTR Value="+" type="small_clause"/> | ||
257 | < </SYNRESTRS> | ||
258 | --- | ||
259 | > <SYNRESTRS/> | ||
260 | diff /Users/hatkirby/Downloads/new_vn 2/manner_speaking-37.3.xml datadir/vn/manner_speaking-37.3.xml | ||
261 | 264c264,266 | ||
262 | < <SYNRESTRS/> | ||
263 | --- | ||
264 | > <SYNRESTRS> | ||
265 | > <SYNRESTR Value="+" type="quotation"/> | ||
266 | > </SYNRESTRS> | ||
267 | 603c605,607 | ||
268 | < <SYNRESTRS/> | ||
269 | --- | ||
270 | > <SYNRESTRS> | ||
271 | > <SYNRESTR Value="+" type="quotation"/> | ||
272 | > </SYNRESTRS> | ||
273 | diff /Users/hatkirby/Downloads/new_vn 2/other_cos-45.4.xml datadir/vn/other_cos-45.4.xml | ||
274 | 534c534,536 | ||
275 | < <SYNRESTRS/> | ||
276 | --- | ||
277 | > <SYNRESTRS> | ||
278 | > <SYNRESTR Value="+" type="adjp"/> | ||
279 | > </SYNRESTRS> | ||
280 | diff /Users/hatkirby/Downloads/new_vn 2/pocket-9.10.xml datadir/vn/pocket-9.10.xml | ||
281 | 256c256,258 | ||
282 | < <SYNRESTRS/> | ||
283 | --- | ||
284 | > <SYNRESTRS> | ||
285 | > <SYNRESTR Value="+" type="adv-loc"/> | ||
286 | > </SYNRESTRS> | ||
287 | diff /Users/hatkirby/Downloads/new_vn 2/poison-42.2.xml datadir/vn/poison-42.2.xml | ||
288 | 93c93,95 | ||
289 | < <SYNRESTRS/> | ||
290 | --- | ||
291 | > <SYNRESTRS> | ||
292 | > <SYNRESTR Value="+" type="adjp"/> | ||
293 | > </SYNRESTRS> | ||
294 | diff /Users/hatkirby/Downloads/new_vn 2/pour-9.5.xml datadir/vn/pour-9.5.xml | ||
295 | 59,61c59,62 | ||
296 | < <SELRESTRS> | ||
297 | < <SELRESTR Value="+" type="path"/> | ||
298 | < <SELRESTR Value="-" type="dest_dir"/> | ||
299 | --- | ||
300 | > <SELRESTRS logic="or"> | ||
301 | > <SELRESTR Value="+" type="dir"/> | ||
302 | > <SELRESTR Value="+" type="src"/> | ||
303 | > <SELRESTR Value="+" type="dest_conf"/> | ||
304 | 157,160c158,162 | ||
305 | < <SELRESTRS> | ||
306 | < <SELRESTR Value="+" type="path"/> | ||
307 | < <SELRESTR Value="-" type="dest_dir"/> | ||
308 | < </SELRESTRS> | ||
309 | --- | ||
310 | > <SELRESTRS logic="or"> | ||
311 | > <SELRESTR Value="+" type="dir"/> | ||
312 | > <SELRESTR Value="+" type="src"/> | ||
313 | > <SELRESTR Value="+" type="dest_conf"/> | ||
314 | > </SELRESTRS> | ||
315 | diff /Users/hatkirby/Downloads/new_vn 2/push-12.xml datadir/vn/push-12.xml | ||
316 | 90c90,92 | ||
317 | < <SYNRESTRS/> | ||
318 | --- | ||
319 | > <SYNRESTRS> | ||
320 | > <SYNRESTR Value="+" type="adjp"/> | ||
321 | > </SYNRESTRS> | ||
322 | diff /Users/hatkirby/Downloads/new_vn 2/roll-51.3.1.xml datadir/vn/roll-51.3.1.xml | ||
323 | 190c190,192 | ||
324 | < <SYNRESTRS/> | ||
325 | --- | ||
326 | > <SYNRESTRS> | ||
327 | > <SYNRESTR Value="+" type="adjp"/> | ||
328 | > </SYNRESTRS> | ||
329 | 256c258,260 | ||
330 | < <SYNRESTRS/> | ||
331 | --- | ||
332 | > <SYNRESTRS> | ||
333 | > <SYNRESTR Value="+" type="adjp"/> | ||
334 | > </SYNRESTRS> | ||
335 | diff /Users/hatkirby/Downloads/new_vn 2/see-30.1.xml datadir/vn/see-30.1.xml | ||
336 | 16a17,19 | ||
337 | > <THEMROLE type="Patient"> | ||
338 | > <SELRESTRS/> | ||
339 | > </THEMROLE> | ||
340 | 93a97,102 | ||
341 | > <PREP value="in"> | ||
342 | > <SELRESTRS/> | ||
343 | > </PREP> | ||
344 | > <NP value="Patient"> | ||
345 | > <SYNRESTRS/> | ||
346 | > </NP> | ||
347 | 231a241,243 | ||
348 | > <NP value="Patient"> | ||
349 | > <SYNRESTRS/> | ||
350 | > </NP> | ||
351 | diff /Users/hatkirby/Downloads/new_vn 2/seem-109.xml datadir/vn/seem-109.xml | ||
352 | 30,32c30,32 | ||
353 | < <SYNRESTRS> | ||
354 | < <SYNRESTR Value="-" type="sentential"/> | ||
355 | < </SYNRESTRS> | ||
356 | --- | ||
357 | > <SYNRESTRS> | ||
358 | > <SYNRESTR Value="+" type="adjp"/> | ||
359 | > </SYNRESTRS> | ||
360 | diff /Users/hatkirby/Downloads/new_vn 2/slide-11.2.xml datadir/vn/slide-11.2.xml | ||
361 | 69,72c69,73 | ||
362 | < <SELRESTRS> | ||
363 | < <SELRESTR Value="+" type="path"/> | ||
364 | < <SELRESTR Value="-" type="dest_dir"/> | ||
365 | < </SELRESTRS> | ||
366 | --- | ||
367 | > <SELRESTRS logic="or"> | ||
368 | > <SELRESTR Value="+" type="dir"/> | ||
369 | > <SELRESTR Value="+" type="src"/> | ||
370 | > <SELRESTR Value="+" type="dest_conf"/> | ||
371 | > </SELRESTRS> | ||
372 | 218,221c219,223 | ||
373 | < <SELRESTRS> | ||
374 | < <SELRESTR Value="+" type="path"/> | ||
375 | < <SELRESTR Value="-" type="dest_dir"/> | ||
376 | < </SELRESTRS> | ||
377 | --- | ||
378 | > <SELRESTRS logic="or"> | ||
379 | > <SELRESTR Value="+" type="dir"/> | ||
380 | > <SELRESTR Value="+" type="src"/> | ||
381 | > <SELRESTR Value="+" type="dest_conf"/> | ||
382 | > </SELRESTRS> | ||
383 | diff /Users/hatkirby/Downloads/new_vn 2/spank-18.3.xml datadir/vn/spank-18.3.xml | ||
384 | 69a70,72 | ||
385 | > <THEMROLE type="Recipient"> | ||
386 | > <SELRESTRS/> | ||
387 | > </THEMROLE> | ||
388 | 201c204,206 | ||
389 | < <SYNRESTRS/> | ||
390 | --- | ||
391 | > <SYNRESTRS> | ||
392 | > <SYNRESTR Value="+" type="adjp"/> | ||
393 | > </SYNRESTRS> | ||
394 | 529,532c534,541 | ||
395 | < <SYNRESTRS> | ||
396 | < <SYNRESTR Value="+" type="genitive"/> | ||
397 | < <SYNRESTR Value="+" type="body_part"/> | ||
398 | < </SYNRESTRS> | ||
399 | --- | ||
400 | > <SYNRESTRS> | ||
401 | > <SYNRESTR Value="+" type="genitive"/> | ||
402 | > </SYNRESTRS> | ||
403 | > </NP> | ||
404 | > <NP value="Recipient"> | ||
405 | > <SYNRESTRS> | ||
406 | > <SYNRESTR Value="+" type="body_part"/> | ||
407 | > </SYNRESTRS> | ||
408 | diff /Users/hatkirby/Downloads/new_vn 2/swat-18.2.xml datadir/vn/swat-18.2.xml | ||
409 | 264c264,266 | ||
410 | < <SYNRESTRS/> | ||
411 | --- | ||
412 | > <SYNRESTRS> | ||
413 | > <SYNRESTR Value="+" type="adjp"/> | ||
414 | > </SYNRESTRS> | ||
415 | 324c326,328 | ||
416 | < <SYNRESTRS/> | ||
417 | --- | ||
418 | > <SYNRESTRS> | ||
419 | > <SYNRESTR Value="+" type="adjp"/> | ||
420 | > </SYNRESTRS> | ||
421 | diff /Users/hatkirby/Downloads/new_vn 2/tape-22.4.xml datadir/vn/tape-22.4.xml | ||
422 | 364c364,366 | ||
423 | < <SYNRESTRS/> | ||
424 | --- | ||
425 | > <SYNRESTRS> | ||
426 | > <SYNRESTR Value="+" type="adjp"/> | ||
427 | > </SYNRESTRS> | ||
428 | diff /Users/hatkirby/Downloads/new_vn 2/vehicle-51.4.1.xml datadir/vn/vehicle-51.4.1.xml | ||
429 | 227c227,229 | ||
430 | < <SYNRESTRS/> | ||
431 | --- | ||
432 | > <SYNRESTRS> | ||
433 | > <SYNRESTR Value="+" type="adjp"/> | ||
434 | > </SYNRESTRS> | ||
435 | diff /Users/hatkirby/Downloads/new_vn 2/waltz-51.5.xml datadir/vn/waltz-51.5.xml | ||
436 | 181c181,183 | ||
437 | < <SYNRESTRS/> | ||
438 | --- | ||
439 | > <SYNRESTRS> | ||
440 | > <SYNRESTR Value="+" type="adjp"/> | ||
441 | > </SYNRESTRS> | ||
442 | diff /Users/hatkirby/Downloads/new_vn 2/want-32.1.xml datadir/vn/want-32.1.xml | ||
443 | 142a143 | ||
444 | > <ADV/> | ||
445 | 194a196 | ||
446 | > <ADJ/> | ||
447 | 305a308 | ||
448 | > <LEX value="to be"/> | ||
449 | 307,309c310,312 | ||
450 | < <SYNRESTRS> | ||
451 | < <SYNRESTR Value="+" type="to_be"/> | ||
452 | < </SYNRESTRS> | ||
453 | --- | ||
454 | > <SYNRESTRS> | ||
455 | > <SYNRESTR Value="+" type="adjp"/> | ||
456 | > </SYNRESTRS> | ||
457 | diff /Users/hatkirby/Downloads/new_vn 2/wipe_instr-10.4.2.xml datadir/vn/wipe_instr-10.4.2.xml | ||
458 | 178c178,180 | ||
459 | < <SYNRESTRS/> | ||
460 | --- | ||
461 | > <SYNRESTRS> | ||
462 | > <SYNRESTR Value="+" type="adjp"/> | ||
463 | > </SYNRESTRS> | ||
464 | diff /Users/hatkirby/Downloads/new_vn 2/wipe_manner-10.4.1.xml datadir/vn/wipe_manner-10.4.1.xml | ||
465 | 198c198,199 | ||
466 | < <SELRESTR Value="-" type="region"/> | ||
467 | --- | ||
468 | > <SELRESTR Value="+" type="location"/> | ||
469 | > <SELRESTR Value="-" type="region"/> | ||
470 | diff /Users/hatkirby/Downloads/new_vn 2/wish-62.xml datadir/vn/wish-62.xml | ||
471 | 91a92 | ||
472 | > <LEX value="to be"/> | ||
473 | 93,95c94,96 | ||
474 | < <SYNRESTRS> | ||
475 | < <SYNRESTR Value="+" type="to_be"/> | ||
476 | < </SYNRESTRS> | ||
477 | --- | ||
478 | > <SYNRESTRS> | ||
479 | > <SYNRESTR Value="+" type="adjp"/> | ||
480 | > </SYNRESTRS> | ||
481 | 122a124 | ||
482 | > <ADJ/> | ||