72 lines
1.6 KiB
C++
72 lines
1.6 KiB
C++
#include "Lexer.h"
|
|
|
|
bool Lexer::matchPattern(const String& pattern, const String& checkString, char delimiter, Vector<String>& hitSequence)
|
|
{
|
|
if (checkString.empty())
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if (pattern.empty())
|
|
{
|
|
return false;
|
|
}
|
|
|
|
bool found_pattern = true;
|
|
unsigned check_idx = 0;
|
|
unsigned pattern_idx = 0;
|
|
|
|
Vector<String> hits;
|
|
String working_hit;
|
|
while(check_idx < checkString.size())
|
|
{
|
|
if (pattern_idx == pattern.size())
|
|
{
|
|
break;
|
|
}
|
|
|
|
auto check_char = checkString[check_idx];
|
|
auto pattern_char = pattern[pattern_idx];
|
|
if (pattern_char == delimiter)
|
|
{
|
|
if (pattern_idx + 1 < pattern.size())
|
|
{
|
|
if (check_char == pattern[pattern_idx + 1])
|
|
{
|
|
hits.push_back(working_hit);
|
|
working_hit.clear();
|
|
pattern_idx++;
|
|
}
|
|
else
|
|
{
|
|
working_hit+=check_char;
|
|
check_idx++;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
working_hit+=check_char;
|
|
check_idx++;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (check_char == pattern_char)
|
|
{
|
|
check_idx++;
|
|
pattern_idx++;
|
|
}
|
|
else
|
|
{
|
|
found_pattern = false;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (found_pattern)
|
|
{
|
|
hitSequence = hits;
|
|
}
|
|
return found_pattern;
|
|
}
|