Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
18a6dab
bug fixed
Robby-the-paladin Jan 19, 2023
acbd533
Merge branch 'logger-pain' into PumpLength
Robby-the-paladin Jan 19, 2023
bbcb559
log template
Robby-the-paladin Jan 20, 2023
fea674b
Rename PumpLength-medium.tex to PumpLength.tex
Robby-the-paladin Jan 20, 2023
cc9c725
prefix bug fixed
Robby-the-paladin Jan 20, 2023
ce32395
making pumped regex through Regex constructor
Robby-the-paladin Jan 21, 2023
70dd7ed
Merge branch 'logger-pain' into PumpLength
Robby-the-paladin Jan 21, 2023
355fb49
debug info deleted
Robby-the-paladin Jan 21, 2023
414c028
detailed info
Robby-the-paladin Jan 25, 2023
acd7c8a
infix pumping fixed
Robby-the-paladin Jan 25, 2023
11292f3
star prefix bugfix
Robby-the-paladin Jan 25, 2023
2610e0b
concatenation bug fixed
Robby-the-paladin Jan 26, 2023
ebfdf95
Works?
Robby-the-paladin Jan 26, 2023
6290036
Merge branch 'logger-pain' into SemDet-log
Robby-the-paladin Jan 26, 2023
7678581
Merge branch 'logger-pain' into PumpLength
Robby-the-paladin Jan 26, 2023
1224c35
log entry fix
Robby-the-paladin Jan 26, 2023
f772496
Terrible bugs fixed
Robby-the-paladin Jan 26, 2023
cdcdeda
trap removing magic
Robby-the-paladin Jan 26, 2023
609a259
Merge branch 'logger-tables' into PumpLength
mathhyyn Jan 26, 2023
9bfbad4
передача регулярки в шаблон pumplength #236
mathhyyn Jan 26, 2023
7a15f48
Merge branch 'logger-tables' into PumpLength
mathhyyn Jan 27, 2023
c020a60
SemDet-log merged
Robby-the-paladin Jan 27, 2023
d597fe5
some eps magic
Robby-the-paladin Jan 27, 2023
d69727e
small returning bug fixed
Robby-the-paladin Jan 27, 2023
d8889ee
semdet deannote fix
Robby-the-paladin Jan 27, 2023
74a4064
template update + useless cycle removed
Robby-the-paladin Jan 27, 2023
244fd3e
minor changes
Robby-the-paladin Jan 28, 2023
cabd788
logs changed
Robby-the-paladin Jan 28, 2023
ab95519
Merge branch 'refal' into SemDet-log
Robby-the-paladin Feb 6, 2023
22b7275
renaming + Double subscript fix
Robby-the-paladin Feb 6, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 3 additions & 4 deletions libs/AutomatonToImage/src/AutomatonToImage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,11 +39,11 @@ string AutomatonToImage::to_image(string automat) {
FILE* fo;
fo = fopen("./refal/input.dot", "wt");
fprintf(fo, "%s", automat.c_str());
fclose(fo);
fclose(fo);
system(
"cd refal && refgo Preprocess+MathMode input.dot > error_refal0.txt");
"cd refal && refgo Preprocess+MathMode+FrameFormatter input.dot > error_refal0.txt");
system("cd refal && dot2tex -ftikz -tmath \"Mod_input.dot\" > input.tex");
system("cd refal && refgo Postprocess+MathMode input.tex > error_refal.txt "
system("cd refal && refgo Postprocess+MathMode+FrameFormatter input.tex > error_refal.txt "
"2>&1");

// для Linux:
Expand All @@ -67,7 +67,6 @@ string AutomatonToImage::to_image(string automat) {
// TODO: разные команды для Linux и Windows
system("cd refal && rm input.dot && rm input.tex && rm Mod_input.dot && rm "
"R_input.tex");

// таблица
ifstream infile_for_L("./refal/L_input.tex");

Expand Down
2 changes: 2 additions & 0 deletions libs/Interpreter/src/Interpreter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -341,9 +341,11 @@ optional<GeneralObject> Interpreter::apply_function(
}
}
if (function.name == "SemDet") {
log_template.load_tex_template("SemDet");
return ObjectBoolean(get_automaton(arguments[0]).semdet(&log_template));
}
if (function.name == "PumpLength") {
log_template.load_tex_template("PumpLength");
return ObjectInt(
get<ObjectRegex>(arguments[0]).value.pump_length(&log_template));
}
Expand Down
2 changes: 1 addition & 1 deletion libs/Logger/src/Logger.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ void Logger::render_to_file(const string& filename) {

cout << "\nFrameFormatter + MathMode...\n";

system("cd refal && refgo FrameFormatter+MathMode 2>err.txt");
system("cd refal && refgo RunFormatter+FrameFormatter+MathMode 2>err.txt");

cout << "\nConverting to PDF 1...\n";

Expand Down
6 changes: 5 additions & 1 deletion libs/Objects/include/Objects/FiniteAutomaton.h
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,11 @@ class FiniteAutomaton : public BaseObject {
map<int, bool>& was) const;

// функция проверки на семантическую детерминированность
bool semdet_entry(bool annoted = false, iLogTemplate* log = nullptr) const;
bool semdet_entry(bool traps_removed = false, iLogTemplate* log = nullptr) const;

// Поиск языков состояний
void get_state_languages(vector<Regex>& state_languages,
bool annoted = false) const;

public:
FiniteAutomaton();
Expand Down
5 changes: 5 additions & 0 deletions libs/Objects/include/Objects/Regex.h
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,11 @@ class Regex : BaseObject {
void pre_order_travers() const;
void clear();

// Получение всех символов из строки
bool get_symbols_from_string(vector<Regex>& res);

void eps_removing();

public:
Regex();
Regex(const string&);
Expand Down
118 changes: 70 additions & 48 deletions libs/Objects/src/FiniteAutomaton.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2242,17 +2242,19 @@ std::optional<std::string> FiniteAutomaton::get_prefix(
auto res = get_prefix(*it2, state_end, was);
if (res.has_value()) {
ans = (string)it->first + (string)res.value();
return ans;
}
return ans;
}
}
}
return ans;
}

bool FiniteAutomaton::semdet_entry(bool annoted, iLogTemplate* log) const {
void FiniteAutomaton::get_state_languages(vector<Regex>& state_languages,
bool annoted) const {
if (!annoted) {
return annote().semdet_entry(true);
annote().remove_trap_states().get_state_languages(state_languages, true);
return;
}
// Logger::log(
//"Получение языка из производной регулярки автомата по префиксу");
Expand All @@ -2261,65 +2263,88 @@ bool FiniteAutomaton::semdet_entry(bool annoted, iLogTemplate* log) const {
for (int i = 0; i < states.size(); i++) {
if (states[i].is_terminal) final_states.push_back(i);
}
std::vector<Regex> state_languages;
state_languages.resize(states.size());
for (int i = 0; i < states.size(); i++) {
auto prefix = get_prefix(initial_state, i, was);
was.clear();
// cout << "Try " << i << "\n";
if (!prefix.has_value()) continue;
Regex reg;
// Получение языка из производной регулярки автомата по префиксу:
// this -> reg (arden?)
reg = to_regex();
// cout << "State: " << i << "\n";
// cout << "Prefix: " << prefix.value() << "\n";
// cout << "Regex: " << reg.to_txt() << "\n";
// Logger::log("State", to_string(i));
// Logger::log("Prefix", prefix.value());
// Logger::log("Regex", reg.to_txt());
auto derivative = reg.prefix_derivative(prefix.value());
//cout << prefix.value() << " " << reg.to_txt() << "\n";
if (!derivative.has_value()) continue;
state_languages[i] = derivative.value();
// cout << "Derevative: " << state_languages[i].to_txt() << "\n";
// Logger::log("Derevative", state_languages[i].to_txt());

// TODO: logs
if (log) {
log->set_parameter("state", i);
log->set_parameter("prefix", prefix.value());
log->set_parameter("regex", reg);
log->set_parameter("derivative", state_languages[i]);
}
state_languages[i].make_language();
state_languages[i].from_string(derivative.value().to_txt());
state_languages[i] = state_languages[i].deannote();
//cout << state_languages[i].to_txt() << "\n";
}
for (int i = 0; i < states.size(); i++) {
for (int j = 0; j < states.size(); j++) {
for (auto transition = states[j].transitions.begin();
transition != states[j].transitions.end(); transition++) {
bool verified_ambiguity = false;
}

bool FiniteAutomaton::semdet_entry(bool traps_removed, iLogTemplate* log) const {
if (!traps_removed) {
return remove_trap_states().semdet_entry(true, log);
}
vector<Regex> state_languages;
get_state_languages(state_languages, false);
auto make_string_transition = [=](string from, alphabet_symbol through,
string to) {
string f = from;
string arrow = ">->>{" + string(through) + "}";
string t = to;
return f + arrow + t;
};
std::string ambiguous_transitions = "";
for (int j = 0; j < states.size(); j++) {
for (auto transition = states[j].transitions.begin();
transition != states[j].transitions.end(); transition++) {
bool verified_ambiguity = false;
if (transition->second.size() > 1) {
ambiguous_transitions += "Ambigous: ";
for (auto it = transition->second.begin();
it != transition->second.end(); it++) {
bool reliability = true;
for (auto it2 = transition->second.begin();
it2 != transition->second.end(); it2++) {
if (!state_languages[*it].subset(
state_languages[*it2])) {
reliability = false;
break;
}
it != transition->second.end(); it++) {
ambiguous_transitions +=
make_string_transition(states[j].identifier, transition->first, states[*it].identifier) +
",";
}
}
for (auto it = transition->second.begin();
it != transition->second.end(); it++) {
bool reliability = true;
for (auto it2 = transition->second.begin();
it2 != transition->second.end(); it2++) {
if (!state_languages[*it].subset(
state_languages[*it2])) {
reliability = false;
break;
}
verified_ambiguity |= reliability;
}
if (!verified_ambiguity) {
// Logger::log("Результат SemDet", "false");
// Logger::finish_step();
return false;
verified_ambiguity |= reliability;
if (reliability && transition->second.size() > 1) {
ambiguous_transitions +=
"Reliable:" +
make_string_transition(states[j].identifier, transition->first, states[*it].identifier) +
+"\\\\";
}
}
if (!verified_ambiguity) {
// Logger::log("Результат SemDet", "false");
// Logger::finish_step();
ambiguous_transitions += "Reliable: none\\\\";
if (log) {
log->set_parameter("ambiguous transitions", ambiguous_transitions);
log->set_parameter("semdet result", "false\\\\");
}
return false;
}
}
}
if (log) {
if (ambiguous_transitions == "") {
ambiguous_transitions = "None";
}
log->set_parameter("ambiguous transitions", ambiguous_transitions);
log->set_parameter("semdet result", "true\\\\");
}
// Logger::log("Результат SemDet", "true");
return true;
}

Expand All @@ -2328,10 +2353,7 @@ bool FiniteAutomaton::semdet(iLogTemplate* log) const {
if (log) {
log->set_parameter("oldautomaton", *this);
}
bool result = semdet_entry(log);
if (log) {
log->set_parameter("result", result);
}
bool result = semdet_entry(false, log);
return result;
// Logger::finish_step();
}
Expand Down
2 changes: 1 addition & 1 deletion libs/Objects/src/Grammar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -430,7 +430,7 @@ string Grammar::pg_to_txt() const {
for (const auto& elem : out) {
ss << elem << "\\\\";
}
ss << "------------ base words ------------"
ss << "------------------------- Базисные слова -----------------------"
<< "\\\\";

for (int i = 0; i < prefix_grammar.size(); i++) {
Expand Down
Loading