浏览代码

AK: Add `GenericLexer::consume_escaped_character()'

...and use it in `consume_and_unescape_string()'.
AnotherTest 4 年之前
父节点
当前提交
27040e65eb
共有 2 个文件被更改,包括 18 次插入13 次删除
  1. 17 13
      AK/GenericLexer.cpp
  2. 1 0
      AK/GenericLexer.h

+ 17 - 13
AK/GenericLexer.cpp

@@ -221,23 +221,27 @@ String GenericLexer::consume_and_unescape_string(char escape_char)
     if (view.is_null())
         return {};
 
-    // Transform common escape sequences
-    auto unescape_character = [](char c) {
-        static const char* escape_map = "n\nr\rt\tb\bf\f";
-        for (size_t i = 0; escape_map[i] != '\0'; i += 2)
-            if (c == escape_map[i])
-                return escape_map[i + 1];
-        return c;
-    };
-
     StringBuilder builder;
-    for (size_t i = 0; i < view.length(); ++i) {
-        char c = (view[i] == escape_char) ? unescape_character(view[++i]) : view[i];
-        builder.append(c);
-    }
+    for (size_t i = 0; i < view.length(); ++i)
+        builder.append(consume_escaped_character(escape_char));
     return builder.to_string();
 }
 
+char GenericLexer::consume_escaped_character(char escape_char, const StringView& escape_map)
+{
+    if (!consume_specific(escape_char))
+        return consume();
+
+    auto c = consume();
+
+    for (size_t i = 0; i < escape_map.length(); i += 2) {
+        if (c == escape_map[i])
+            return escape_map[i + 1];
+    }
+
+    return c;
+}
+
 // Ignore a number of characters (1 by default)
 void GenericLexer::ignore(size_t count)
 {

+ 1 - 0
AK/GenericLexer.h

@@ -52,6 +52,7 @@ public:
     bool consume_specific(char);
     bool consume_specific(StringView);
     bool consume_specific(const char*);
+    char consume_escaped_character(char escape_char = '\\', const StringView& escape_map = "n\nr\rt\tb\bf\f");
     StringView consume(size_t count);
     StringView consume_all();
     StringView consume_line();