From e5fa0f19fc650a33043fbeedd2e39ba9a690824d Mon Sep 17 00:00:00 2001 From: Venelin Date: Sat, 18 Mar 2023 18:28:52 +0200 Subject: [PATCH] minor improvements --- src/parser.cpp | 47 +++++++++++++++++++++++++++++++++++------------ todo.txt | 6 +----- 2 files changed, 36 insertions(+), 17 deletions(-) diff --git a/src/parser.cpp b/src/parser.cpp index 643578f..b68d288 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -63,20 +63,37 @@ namespace /* internal */ const char* end; TokenType type; }; - using TokenIt = vector::const_iterator; + /* internal data */ unsigned line = 1; pair prev_parents(Nobody, Nobody); - - /* state */ - /* void state_neutral(char* it_data); */ - void state_person(TokenIt& it, TokenIt end); - /* void state_person_attribute() */ - - /* result */ Tree* cur_tree; + /* state */ + void state_neutral(const vector& tokens); + void state_person(TokenIt& it, TokenIt end); + EventTime state_date(TokenIt& it); + + /* helpers */ + vector tokenize(const MappedFile f); + string parseName(TokenIt& it, TokenIt end); /* construct name from tokens */ + /* find a person's id in the tree based on his name and index + * among same named */ + person_id findPerson(const string& name, U32 same_name_index); + U32 sameNamedIndex(TokenIt& it); + Sex parseSex(TokenIt& it, TokenIt end); + I32 processDatePart(const char*& it_date, const char* end_date); + pair processParents(TokenIt& it, TokenIt end); + vector parseSpouses(TokenIt& it, TokenIt end); /* return the spouse IDs */ + + bool isNum(char c); + TokenType findType(token t); + U32 calcNumber(token t); /* calculate the value of a NUMBER token */ + void expect_newline(TokenIt& it); /* expect that the iterator points a newline */ + + + /* errors */ [[noreturn]]void err_unexpected_end() { endwin(); @@ -233,7 +250,6 @@ namespace /* internal */ err_unexpected_token(*it); } - /* construct name from tokens */ string parseName(TokenIt& it, TokenIt end) { if(it->type != STRING) @@ -249,8 +265,6 @@ namespace /* internal */ return name; } - /* find a person's id in the tree based on his name and index - * among same named */ person_id findPerson(const string& name, U32 same_name_index) { vector same_named = cur_tree->findId(name); @@ -312,23 +326,32 @@ namespace /* internal */ { I32 sign = 1; I32 val = 0; + bool unknown = false; for(; it_date < end_date; ++it_date) { switch(*it_date) { case '-': + if(unknown) + err_unexpected_char(*it_date); /* todo */ sign = -1; break; case '0' ... '9': + if(unknown) + err_unexpected_char(*it_date); /* todo */ val = val*10 + (*it_date - '0'); break; case '.': if(val == 0) err_unexpected_char('.'); + else if(unknown) + return EventTime::UNKNOWN_DATE; else return sign * val; break; - /* case '?': todo */ + case '?': + unknown = true; + break; default: err_unexpected_char(*it_date); } diff --git a/todo.txt b/todo.txt index 6fb3291..0852f52 100644 --- a/todo.txt +++ b/todo.txt @@ -1,7 +1,5 @@ -Parser: -- one pass rather then preprocess - --help + help - based on user config findRelative @@ -30,9 +28,7 @@ Compilation - coordinate types for large trees Backend -- file operatons check if file exists - move to SQLlite -- create tree backup Refactoring - comment style /*