Regex parsing: add escape characters
This commit is contained in:
parent
efb88f2519
commit
90ff409281
51
src/re.cpp
51
src/re.cpp
|
@ -119,6 +119,44 @@ namespace lxs {
|
||||||
stk.push(tp);
|
stk.push(tp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<RE> parseEscapeChar(char c) {
|
||||||
|
switch (c)
|
||||||
|
{
|
||||||
|
case '\\':
|
||||||
|
case '*':
|
||||||
|
case '+':
|
||||||
|
case '|':
|
||||||
|
case '(':
|
||||||
|
case ')':
|
||||||
|
case '[':
|
||||||
|
case ']':
|
||||||
|
case '?':
|
||||||
|
case '.':
|
||||||
|
case '\'':
|
||||||
|
case '"':
|
||||||
|
break;
|
||||||
|
case 'n':
|
||||||
|
c = '\n'; break;
|
||||||
|
case 'r':
|
||||||
|
c = '\r'; break;
|
||||||
|
case 'b':
|
||||||
|
c = '\b'; break;
|
||||||
|
case 't':
|
||||||
|
c = '\t'; break;
|
||||||
|
case 's':
|
||||||
|
c = ' '; break;
|
||||||
|
case 'a':
|
||||||
|
c = '\a'; break;
|
||||||
|
case 'f':
|
||||||
|
c = '\f'; break;
|
||||||
|
case 'v':
|
||||||
|
c = '\v'; break;
|
||||||
|
default:
|
||||||
|
throw SyntaxError(("Invalid escape sequence: \\" + std::string(1, c)).c_str());
|
||||||
|
}
|
||||||
|
return std::make_shared<SingleRE>(c);
|
||||||
|
}
|
||||||
|
|
||||||
std::shared_ptr<RE> parseRE(string& input, size_t& idx)
|
std::shared_ptr<RE> parseRE(string& input, size_t& idx)
|
||||||
{
|
{
|
||||||
stack<std::shared_ptr<RE> > stk;
|
stack<std::shared_ptr<RE> > stk;
|
||||||
|
@ -131,9 +169,20 @@ namespace lxs {
|
||||||
idx++;
|
idx++;
|
||||||
if (idx >= input.length())
|
if (idx >= input.length())
|
||||||
throw SyntaxError("Escape sequence at the end of the string");
|
throw SyntaxError("Escape sequence at the end of the string");
|
||||||
//TODO: escape chars
|
|
||||||
else
|
else
|
||||||
throw SyntaxError(("invalid escape sequence: \\" + string(1, input[idx])).c_str());
|
throw SyntaxError(("invalid escape sequence: \\" + string(1, input[idx])).c_str());
|
||||||
|
stk.push(parseEscapeChar(input[idx++]));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case '[':
|
||||||
|
//TODO: parse character classes
|
||||||
|
break;
|
||||||
|
|
||||||
|
case '.':
|
||||||
|
//TODO: any character
|
||||||
|
|
||||||
|
case ']':
|
||||||
|
throw SyntaxError("Unopened ']'");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '*':
|
case '*':
|
||||||
|
|
Loading…
Reference in New Issue