From 222c3e43be897a918a1c02fd1b24d1f5e6f34275 Mon Sep 17 00:00:00 2001 From: Venelin Date: Sat, 25 Feb 2023 18:24:43 +0200 Subject: [PATCH] parser with preprocessing works --- src/parser.cpp | 58 +++++++++++++++++++++++++++----------------------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/src/parser.cpp b/src/parser.cpp index 52bc768..2a5246a 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -27,14 +27,13 @@ namespace /* internal */ } }; - char* it_data; char* end_data; /* past the end pointer */ unsigned line = 1; + pair prev_parents(Nobody, Nobody); /* state */ - void (*state)(); /* current state */ - void state_neutral(); - void state_person(); + void state_neutral(char* it_data); + void state_person(char*& it_data); /* void state_person_attribute() */ /* result */ @@ -54,7 +53,7 @@ namespace /* internal */ exit(1); } - void proceedToNameEnd() + void proceedToNameEnd(char*& it_data) { while(it_data < end_data && *it_data != ',' && @@ -67,7 +66,7 @@ namespace /* internal */ } - Sex findSex() + Sex findSex(char*& it_data) { Sex res = M; if(*it_data == ',') @@ -87,7 +86,7 @@ namespace /* internal */ return res; } - I32 processDatePart() + I32 processDatePart(char*& it_data) { I32 sign = 1; I32 val = 0; @@ -118,25 +117,25 @@ namespace /* internal */ unexpected_end(); } - EventTime processDate() /* todo validate */ + EventTime processDate(char*& it_data) /* todo validate */ { EventTime date; - date.year = processDatePart(); + date.year = processDatePart(it_data); if(*it_data == '.') { ++it_data; - date.month = processDatePart(); + date.month = processDatePart(it_data); if(*it_data == '.') { ++it_data; - date.day = processDatePart(); + date.day = processDatePart(it_data); } } return date; } - pair processParents() + pair processParents(char*& it_data) { pair res(Nobody, Nobody); string name; /* todo dont use string */ @@ -144,7 +143,6 @@ namespace /* internal */ { switch(*it_data) { - /* case '-':todo */ case ',': if(res.first == Nobody) res.first = cur_tree->findId(name.data()); @@ -154,13 +152,18 @@ namespace /* internal */ /* todo */exit(1); name.clear(); break; + case '-': + if(name.empty() && res.first == Nobody) + return prev_parents; + else + unexpected_char('-'); case '\n': ++line; if(res.first == Nobody) res.first = cur_tree->findId(name.data()); else res.second = cur_tree->findId(name.data()); - return res; + return prev_parents = res; default: name.push_back(*it_data); } @@ -168,7 +171,7 @@ namespace /* internal */ } - vector parseSpouses() + vector parseSpouses(char*& it_data) { vector res; string name; @@ -198,14 +201,14 @@ namespace /* internal */ return res; } - void state_neutral() + void state_neutral(char* it_data) { for(; it_data < end_data; ++it_data) { switch(*it_data) { default: - state_person(); + state_person(it_data); break; case '\n': ++line; @@ -219,7 +222,7 @@ namespace /* internal */ } } - void state_person() + void state_person(char*& it_data) { char* name_start = it_data; pair parents(Nobody, Nobody); @@ -227,11 +230,11 @@ namespace /* internal */ EventTime birth{}; EventTime death{}; - proceedToNameEnd(); + proceedToNameEnd(it_data); /* string_view name(name_start, it_data); */ string name(name_start, it_data); - Sex sex = findSex(); + Sex sex = findSex(it_data); for(; it_data < end_data; ++it_data) { @@ -247,19 +250,19 @@ namespace /* internal */ { case 'b': it_data += 2; - birth = processDate(); + birth = processDate(it_data); break; case 'd': it_data += 2; - death = processDate(); + death = processDate(it_data); break; case 'p': it_data += 2; - parents = processParents(); + parents = processParents(it_data); break; case 's': it_data += 2; - spouses = parseSpouses(); + spouses = parseSpouses(it_data); break; default: unexpected_char(it_data[-1]); @@ -282,6 +285,9 @@ namespace /* internal */ /* break; */ } } + cur_tree->addPerson(name.c_str(), sex, parents.first, parents.second, birth, death); + for(person_id spouse: spouses) + cur_tree->addRelation(spouse, Spouse, cur_tree->last()); } alloced preprocess(MappedFile file) /* remove whitespace and comments */ @@ -320,10 +326,8 @@ Tree parseTftFile(MappedFile file) cur_tree = &result; alloced preprocessed = preprocess(file); - it_data = preprocessed.data; - /* end_data = preprocessed.end; */ - state_neutral(); + state_neutral(preprocessed.data); return result; }