parser with preprocessing works

This commit is contained in:
vrd
2023-02-25 18:24:43 +02:00
parent 176ca1c85a
commit 222c3e43be
+31 -27
View File
@@ -27,14 +27,13 @@ namespace /* internal */
}
};
char* it_data;
char* end_data; /* past the end pointer */
unsigned line = 1;
pair<person_id, person_id> 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<person_id, person_id> processParents()
pair<person_id, person_id> processParents(char*& it_data)
{
pair<person_id, person_id> 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<person_id> parseSpouses()
vector<person_id> parseSpouses(char*& it_data)
{
vector<person_id> 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<person_id, person_id> 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;
}