parser with preprocessing works
This commit is contained in:
+31
-27
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user