From 7d49642376cd4f90e6bc77acf05da7f0d56bf6e6 Mon Sep 17 00:00:00 2001 From: IlushaShurupov Date: Fri, 11 Aug 2023 16:37:51 +0300 Subject: [PATCH] Fixin cfg --- Parser/applications/Cfg.cpp | 8 ++++++++ Parser/private/CfGrammar.cpp | 7 ++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/Parser/applications/Cfg.cpp b/Parser/applications/Cfg.cpp index 23ad5ac..c7e467a 100644 --- a/Parser/applications/Cfg.cpp +++ b/Parser/applications/Cfg.cpp @@ -13,11 +13,13 @@ void run(const String& source) { if (!grammar.parse(state, source)) { printf("Parsing is failed\n"); + CfGrammar::deinitializeCfGrammarParser(state); return; } if (!grammar.compile()) { printf("Compilation is failed\n"); + CfGrammar::deinitializeCfGrammarParser(state); return; } @@ -41,6 +43,12 @@ int main(int argc, const char* argv[]) { } { + printf("Arguments given: "); + for (auto idx = 0; idx < argc; idx++) { + printf("[%s]", argv[idx]); + } + printf("\n"); + CommandLine cmd = { { "grammar", CommandLine::Arg::STR }, }; diff --git a/Parser/private/CfGrammar.cpp b/Parser/private/CfGrammar.cpp index 5901eca..4b6d82d 100644 --- a/Parser/private/CfGrammar.cpp +++ b/Parser/private/CfGrammar.cpp @@ -38,6 +38,7 @@ void CfGrammar::generateSentences(List& out) { auto appendTerm = copy->terms.findIdx(termIdx); auto deleteTerm = appendTerm; for (auto arg : production->args) { + if (arg->isEpsilon) continue; auto newTerm = copy->terms.newNode({ arg->id, arg->isTerminal }); copy->terms.attach(newTerm, appendTerm); appendTerm = newTerm; @@ -62,11 +63,11 @@ void CfGrammar::generateSentences(List& out) { } void CfGrammar::printSentence(Sentence& in) { - printf("Sentence:"); + printf("Sentence: ["); for (auto term : in.terms) { printf(" %s", term->id.read()); } - printf("\n"); + printf(" ]\n"); } bool CfGrammar::compile() { @@ -103,7 +104,7 @@ bool CfGrammar::compile() { if (arg->isTerminal) { mTerminals.put(rule->id, {}); - } else { + } else if (!arg->isEpsilon) { auto idx = mNonTerminals.presents(arg->id); if (!idx) { printf("Referenced non-terminal '%s' is not defined\n", arg->id.read());