1
0
forked from GitHub/gf-core

PGFs merging should update the probspace only once

This commit is contained in:
Krasimir Angelov
2023-03-09 12:59:18 +01:00
parent dfa2c7873b
commit 4863ab0ec9
2 changed files with 22 additions and 2 deletions

View File

@@ -306,7 +306,7 @@ ref<PgfDTyp> PgfReader::read_type()
return tp; return tp;
} }
ref<PgfAbsFun> PgfReader::read_absfun() ref<PgfAbsFun> PgfReader::read_absfun_only()
{ {
ref<PgfAbsFun> absfun = ref<PgfAbsFun> absfun =
read_name<PgfAbsFun>(&PgfAbsFun::name); read_name<PgfAbsFun>(&PgfAbsFun::name);
@@ -330,6 +330,13 @@ ref<PgfAbsFun> PgfReader::read_absfun()
} }
absfun->prob = read_prob(&absfun->name); absfun->prob = read_prob(&absfun->name);
return absfun;
}
ref<PgfAbsFun> PgfReader::read_absfun()
{
ref<PgfAbsFun> absfun = read_absfun_only();
PgfProbspace funs_by_cat = PgfProbspace funs_by_cat =
probspace_insert(abstract->funs_by_cat, absfun); probspace_insert(abstract->funs_by_cat, absfun);
abstract->funs_by_cat = funs_by_cat; abstract->funs_by_cat = funs_by_cat;
@@ -337,6 +344,17 @@ ref<PgfAbsFun> PgfReader::read_absfun()
return absfun; return absfun;
} }
ref<PgfAbsFun> PgfReader::merge_absfun()
{
ref<PgfAbsFun> absfun = read_absfun_only();
if (namespace_lookup(abstract->funs, &absfun->name) == 0) {
throw pgf_error("The set of abstract functions is merged PGFs must be the same");
}
return absfun;
}
ref<PgfAbsCat> PgfReader::read_abscat() ref<PgfAbsCat> PgfReader::read_abscat()
{ {
ref<PgfAbsCat> abscat = read_name<PgfAbsCat>(&PgfAbsCat::name); ref<PgfAbsCat> abscat = read_name<PgfAbsCat>(&PgfAbsCat::name);
@@ -460,7 +478,7 @@ void PgfReader::merge_abstract(ref<PgfAbstr> abstract)
throw pgf_error("The abstract syntax names doesn't match"); throw pgf_error("The abstract syntax names doesn't match");
merge_namespace<PgfFlag>(&PgfReader::read_flag); merge_namespace<PgfFlag>(&PgfReader::read_flag);
merge_namespace<PgfAbsFun>(&PgfReader::read_absfun); merge_namespace<PgfAbsFun>(&PgfReader::merge_absfun);
merge_namespace<PgfAbsCat>(&PgfReader::read_abscat); merge_namespace<PgfAbsCat>(&PgfReader::read_abscat);
} }

View File

@@ -64,6 +64,8 @@ public:
ref<PgfFlag> read_flag(); ref<PgfFlag> read_flag();
ref<PgfAbsFun> read_absfun(); ref<PgfAbsFun> read_absfun();
ref<PgfAbsFun> merge_absfun();
ref<PgfAbsFun> read_absfun_only();
ref<PgfAbsCat> read_abscat(); ref<PgfAbsCat> read_abscat();
void read_abstract(ref<PgfAbstr> abstract); void read_abstract(ref<PgfAbstr> abstract);
void merge_abstract(ref<PgfAbstr> abstract); void merge_abstract(ref<PgfAbstr> abstract);