diff --git a/libSyntax/libsyntax.cpp b/libSyntax/libsyntax.cpp index 7c6b4c0..8cf3072 100644 --- a/libSyntax/libsyntax.cpp +++ b/libSyntax/libsyntax.cpp @@ -52,42 +52,45 @@ QList TokenMatch::parse(const ParseFork& context) const } // 缺一个 ParseFork absence_fork(context); - result_list << absence_fork; absence_fork.error_messages << QString(u8"Syntax[0x0002]缺失Token('%1')。") .arg(this->token_present()).arg(head->row()).arg(head->column()); absence_fork.next = head; absence_fork.occurs = ErrDeals::Absence; + result_list << absence_fork; // 错一个 ParseFork replace_fork(context); - result_list << replace_fork; replace_fork.error_messages << QString(u8"Syntax[0x0003]纠正Token('%1',应该为'%4')。") .arg(head->content()).arg(head->row()).arg(head->column()).arg(this->token_present()); replace_fork.next = head->nextWord(); replace_fork.occurs = ErrDeals::Replace; + result_list << replace_fork; // 多一个 auto temp_head = head->nextWord(); - auto match_result = define_peer->analysis(temp_head); - if (get<0>(match_result)) { - ParseFork surplus_fork(context); - result_list << surplus_fork; - surplus_fork.error_messages << QString(u8"Syntax[0x0004]发现冗余Token('%1')。") - .arg(head->content()).arg(head->row()).arg(head->column()); - surplus_fork.occurs = ErrDeals::Surplus; - surplus_fork.tokens_list << get<0>(match_result); + if(temp_head){ + auto match_result = define_peer->analysis(temp_head); + if (get<0>(match_result)) { + ParseFork surplus_fork(context); + surplus_fork.error_messages << QString(u8"Syntax[0x0004]发现冗余Token('%1')。") + .arg(head->content()).arg(head->row()).arg(head->column()); + surplus_fork.occurs = ErrDeals::Surplus; + surplus_fork.tokens_list << get<0>(match_result); - if (get<1>(match_result)) - surplus_fork.next = make_shared(get<1>(match_result), temp_head->nextWord()); - else - surplus_fork.next = temp_head->nextWord(); + if (get<1>(match_result)) + surplus_fork.next = make_shared(get<1>(match_result), temp_head->nextWord()); + else + surplus_fork.next = temp_head->nextWord(); + + result_list << surplus_fork; + } } } return result_list; } QString TokenMatch::token_present() const { - return QString(u8"%1 ").arg(this->define_peer->reviseWords()); + return QString(u8"%1").arg(this->define_peer->reviseWords()); } Rept::Rept(shared_ptr rule, int min, int max) : rule_peer(rule), min_match(min), max_match(max) {} @@ -191,6 +194,12 @@ QList Rept::parse(const ParseFork& context) const { QString Rept::token_present() const { + if (min_match == 0 && max_match == INT_MAX) + return u8"(" + this->rule_peer->token_present() + QString(u8")*"); + + if (min_match == 1 && max_match == INT_MAX) + return u8"(" + this->rule_peer->token_present() + QString(u8")+"); + return u8"(" + this->rule_peer->token_present() + QString(u8"){%1, %2}").arg(min_match).arg(max_match); } @@ -233,8 +242,8 @@ QString Seqs::token_present() const { QString content; for (auto& it : children()) - content += it->token_present(); - return content; + content += it->token_present() + u8" "; + return content.mid(0, content.size() -1); } @@ -247,6 +256,7 @@ QList Any::parse(const ParseFork& context) const { QList temp_results; for (auto& fork : mbrs_store) { + auto fork_present = fork->token_present(); auto result_forks = fork->parse(context); for (auto rst_fork : result_forks) { switch (rst_fork.occurs) { diff --git a/libToken/tokens_novel.cpp b/libToken/tokens_novel.cpp index 20c7a31..eaac4b9 100644 --- a/libToken/tokens_novel.cpp +++ b/libToken/tokens_novel.cpp @@ -26,7 +26,7 @@ std::shared_ptr lib_token::TokenContent::nextWord() const std::shared_ptr TokenContent::define() const { return this->type_def; } -QString LeftBracket::reviseWords() const { return u8"{"; } +QString LeftBracket::reviseWords() const { return u8"'{'"; } int LeftBracket::typeMark() const { @@ -53,7 +53,7 @@ LeftBracket::analysis(std::shared_ptr content) const { return std::make_tuple(token_inst, nullptr); } -QString RightBracket::reviseWords() const { return u8"}"; } +QString RightBracket::reviseWords() const { return u8"'}'"; } int RightBracket::typeMark() const { @@ -62,7 +62,7 @@ int RightBracket::typeMark() const QString RightBracket::regex() const { return u8"}"; } -QString ReferMark::reviseWords() const { return u8"@"; } +QString ReferMark::reviseWords() const { return u8"'@'"; } int ReferMark::typeMark() const { @@ -144,7 +144,7 @@ VTextSection::analysis(std::shared_ptr content) const { return std::make_tuple(tinst, nullptr); } -QString Split::reviseWords() const { return u8"&"; } +QString Split::reviseWords() const { return u8"'&'"; } int Split::typeMark() const {