about summary refs log tree commit diff stats
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
parentf3bce7176bc15ec04739c61db0d189cbaaaca7d8 (diff)
downloadmu-7a9b05fa66c97ef912e77e9c7618f4ef198636d0.tar.gz
1066 - bugfix: support string literals with colons
-rw-r--r--cpp/.traces/string_literal_with_colons8
-rw-r--r--cpp/010vm4
-rw-r--r--cpp/025name5
-rw-r--r--cpp/029string30
-rw-r--r--cpp/counters.mu4
5 files changed, 38 insertions, 13 deletions
diff --git a/cpp/.traces/string_literal_with_colons b/cpp/.traces/string_literal_with_colons
new file mode 100644
index 00000000..c00ab66a
--- /dev/null
+++ b/cpp/.traces/string_literal_with_colons
@@ -0,0 +1,8 @@
+parse/0: instruction: 30
+parse/0:   ingredient: {name: "abc:def/ghi", value: 0, type: 0, properties: ["abc:def/ghi": "literal-string"]}
+parse/0:   product: {name: "1", value: 0, type: 2-5-8, properties: ["1": "address":"array":"character"]}
+new/0: abc:def/ghi -> 0
+after-brace/0: recipe main
+after-brace/0: new ...
+run/0: instruction main/0
+mem/0: storing 1000 in location 1
diff --git a/cpp/010vm b/cpp/010vm
index 2c230c10..c233f127 100644
--- a/cpp/010vm
+++ b/cpp/010vm
@@ -181,10 +181,6 @@ Next_recipe_number = 1000;  // consistent new numbers for each test
       types.push_back(0);
       properties[0].second.push_back("dummy");
     }
-    else if (types.empty()) {  // hacky test for string
-      types.push_back(0);
-      properties[0].second.push_back("literal-string");
-    }
   }
   reagent::reagent() :value(0), initialized(false) {
     // The first property is special, so ensure we always have it.
diff --git a/cpp/025name b/cpp/025name
index 45fdece2..1c73b16a 100644
--- a/cpp/025name
+++ b/cpp/025name
@@ -40,11 +40,12 @@ void transform_names(const recipe_number r) {
     // Per-recipe Transforms
     // map names to addresses
     for (size_t in = 0; in < inst.ingredients.size(); ++in) {
-//?       cout << "ingredients\n"; //? 1
+//?       cout << "ingredients\n"; //? 2
       if (is_raw(inst.ingredients[in])) continue;
-//?       cout << "ingredient " << inst.ingredients[in].name << '\n'; //? 1
+//?       cout << "ingredient " << inst.ingredients[in].name << '\n'; //? 2
       if (inst.ingredients[in].name == "default-space")
         inst.ingredients[in].initialized = true;
+      assert(!inst.ingredients[in].types.empty());
       if (inst.ingredients[in].types[0]  // not a literal
           && !inst.ingredients[in].initialized
           && inst.ingredients[in].name.find_first_not_of("0123456789-.") != string::npos) {
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]]
diff --git a/cpp/counters.mu b/cpp/counters.mu
index c3234d38..8cc9a437 100644
--- a/cpp/counters.mu
+++ b/cpp/counters.mu
@@ -23,9 +23,9 @@ recipe main [
   bres:integer <- increment-counter b:address:space, 2:literal
   ares:integer <- increment-counter a:address:space, 1:literal
   # check results
-  $print [Contents of counters a ]
+  $print [Contents of counters a: ]
   $print ares:integer
-  $print [ b ]
+  $print [ b: ]
   $print bres:integer
   $print [
 ]