From 90ff40928113a8a8036e6685f76c8ec821a4f4f3 Mon Sep 17 00:00:00 2001 From: Robin Jadoul Date: Mon, 25 Apr 2016 10:43:06 +0200 Subject: [PATCH] Regex parsing: add escape characters --- src/re.cpp | 51 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/src/re.cpp b/src/re.cpp index 63e4e40..a51b875 100644 --- a/src/re.cpp +++ b/src/re.cpp @@ -119,6 +119,44 @@ namespace lxs { stk.push(tp); } + std::shared_ptr 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(c); + } + std::shared_ptr parseRE(string& input, size_t& idx) { stack > 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 '*':