about summary refs log tree commit diff stats
path: root/cpp/029string
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2015-04-15 10:27:16 -0700
committerKartik K. Agaram <vc@akkartik.com>2015-04-15 10:27:16 -0700
commit7a9b05fa66c97ef912e77e9c7618f4ef198636d0 (patch)
tree91968b29cd1dc9949f3b883707978801ed448c02 /cpp/029string
parentf3bce7176bc15ec04739c61db0d189cbaaaca7d8 (diff)
downloadmu-7a9b05fa66c97ef912e77e9c7618f4ef198636d0.tar.gz
1066 - bugfix: support string literals with colons
Diffstat (limited to 'cpp/029string')
-rw-r--r--cpp/029string30
1 files changed, 25 insertions, 5 deletions
diff --git a/cpp/029string b/cpp/029string
index 320337c4..9ca09115 100644
--- a/cpp/029string
+++ b/cpp/029string
@@ -12,6 +12,12 @@ recipe main [
 ]
 +parse:   ingredient: {name: "abc def", value: 0, type: 0, properties: ["abc def": "literal-string"]}
 
+:(scenario "string_literal_with_colons")
+recipe main [
+  1:address:array:character <- new [abc:def/ghi]
+]
++parse:   ingredient: {name: "abc:def/ghi", value: 0, type: 0, properties: ["abc:def/ghi": "literal-string"]}
+
 :(before "End Mu Types Initialization")
 Type_number["literal-string"] = 0;
 
@@ -21,21 +27,35 @@ if (in.peek() == '[') return slurp_quoted(in);
 :(code)
 string slurp_quoted(istream& in) {
   assert(!in.eof());
-  assert(in.get() == '[');
+  assert(in.peek() == '[');
   ostringstream out;
-  int size = 1;
+  int size = 0;
   while (!in.eof()) {
     char c = in.get();
-    if (c == '[') ++size;
-    if (c == ']') --size;
-    if (size == 0) break;
 //?     cout << c << '\n'; //? 1
     out << c;
 //?     cout << out.str() << "$\n"; //? 1
+    if (c == '[') ++size;
+    if (c == ']') --size;
+    if (size == 0) break;
   }
   return out.str();
 }
 
+:(after "reagent::reagent(string s)")
+//?   cout << s[0] << '\n'; //? 1
+  if (s[0] == '[') {
+    assert(s[s.size()-1] == ']');
+    // delete [] delimiters
+    s.erase(0, 1);
+    s.erase(s.size()-1, s.size());
+    name = s;
+    types.push_back(0);
+    properties.push_back(pair<string, vector<string> >(name, vector<string>()));
+    properties.back().second.push_back("literal-string");
+    return;
+  }
+
 :(scenario "string_literal_nested")
 recipe main [
   1:address:array:character <- new [abc [def]]