Skip to content

Commit

Permalink
Fixed invalid pattern arguments detection
Browse files Browse the repository at this point in the history
  • Loading branch information
apathism committed Oct 3, 2019
1 parent bd35ae6 commit 7ebe351
Showing 1 changed file with 19 additions and 3 deletions.
22 changes: 19 additions & 3 deletions core/src/main/lspl/patterns/PatternBuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,15 @@ class ParserImpl: public PatternBuilder::Parser {
return buffer[pos] == '\0';
}

/**
* Проверка на наличие конца строки / ввода
*/
bool seekEndOfLine() {
while (buffer[pos] == ' ')
++pos;
return buffer[pos] == '\0' || buffer[pos] == '\n' || buffer[pos] == '\r';
}

/**
* Создаёт экземпляр исключения с заданным сообщением об ошибке, хранящий
* информацию о текущей позиции парсера и входных данных
Expand Down Expand Up @@ -331,13 +340,20 @@ class ParserImpl: public PatternBuilder::Parser {
pos = before_pos;
return nullptr;
}
if (canBeBinding && alts.size() == 1) {
readStrFollows(rbrace);

// Потенциально вложенный сопоставитель все ещё может быть параметром шаблона, если
// параметр всего один. В таком случае нужно проверить, что
// 1. внутри скобок есть только один параметр;
// 2. этот параметр не является составным;
// 3. после параметра ничего нет (кроме, возможно, шаблона извлечения).
if (canBeBinding && alts.size() == 1 && alts[0].size() == 1
&& dynamic_cast<LoopMatcher*>(alts[0][0].get()) == nullptr
&& (seekEndOfLine() || strFollows("="))) {
pos = before_pos;
return nullptr;
}

readStrFollows(rbrace);

if (allow && strFollows("<") && !strFollows("<<")) {
readStrFollows("<");
min = readUInt();
Expand Down

0 comments on commit 7ebe351

Please sign in to comment.