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);
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
stack<std::shared_ptr<RE> > stk;
|
||||
|
@ -131,9 +169,20 @@ namespace lxs {
|
|||
idx++;
|
||||
if (idx >= input.length())
|
||||
throw SyntaxError("Escape sequence at the end of the string");
|
||||
//TODO: escape chars
|
||||
else
|
||||
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;
|
||||
|
||||
case '*':
|
||||
|
|
Loading…
Reference in New Issue