From 4690ce81e079fc58cae8d6d583e5e3eb3ed81a83 Mon Sep 17 00:00:00 2001 From: "Kartik K. Agaram" Date: Wed, 9 Mar 2016 02:56:27 -0800 Subject: 2743 Looks like "TOhtml | " doesn't work on Mac OS X for some reason.. --- html/011load.cc.html | 209 +++++++++++++++++++++++++-------------------------- 1 file changed, 101 insertions(+), 108 deletions(-) (limited to 'html/011load.cc.html') diff --git a/html/011load.cc.html b/html/011load.cc.html index 0f1a5ae6..7bb6974e 100644 --- a/html/011load.cc.html +++ b/html/011load.cc.html @@ -3,40 +3,33 @@ Mu - 011load.cc - - + + - - + - - -
+
 //: Phase 1 of running mu code: load it from a textual representation.
 
 :(scenarios load)  // use 'load' instead of 'run' in all scenarios in this layer
 :(scenario first_recipe)
-recipe main [
+def main [
   1:number <- copy 23
 ]
 +parse: instruction: copy
@@ -53,42 +46,42 @@ vector<recipe_ordinal> load(string form(istream& in) {
   in >> std::noskipws;
   vector<recipe_ordinal> result;
-  while (has_data(in)) {
+  while (has_data(in)) {
     skip_whitespace_and_comments(in);
-    if (!has_data(in)) break;
+    if (!has_data(in)) break;
     string command = next_word(in);
     // Command Handlers
-    if (command == "recipe") {
+    if (command == "recipe" || command == "def") {
       result.push_back(slurp_recipe(in));
     }
-    else if (command == "recipe!") {
+    else if (command == "recipe!" || command == "def!") {
       Disable_redefine_checks = true;
       result.push_back(slurp_recipe(in));
       Disable_redefine_checks = false;
     }
     // End Command Handlers
-    else {
-      raise_error << "unknown top-level command: " << command << '\n' << end();
+    else {
+      raise << "unknown top-level command: " << command << '\n' << end();
     }
   }
   return result;
 }
 
-long long int slurp_recipe(istream& in) {
+long long int slurp_recipe(istream& in) {
   recipe result;
   result.name = next_word(in);
   // End Load Recipe Name
   skip_whitespace_but_not_newline(in);
   // End Recipe Refinements
-  if (result.name.empty())
-    raise_error << "empty result.name\n" << end();
+  if (result.name.empty())
+    raise << "empty result.name\n" << end();
   trace(9991, "parse") << "--- defining " << result.name << end();
-  if (!contains_key(Recipe_ordinal, result.name))
+  if (!contains_key(Recipe_ordinal, result.name))
     put(Recipe_ordinal, result.name, Next_recipe_ordinal++);
-  if (Recipe.find(get(Recipe_ordinal, result.name)) != Recipe.end()) {
+  if (Recipe.find(get(Recipe_ordinal, result.name)) != Recipe.end()) {
     trace(9991, "parse") << "already exists" << end();
-    if (should_check_for_redefine(result.name))
-      raise_error << "redefining recipe " << result.name << "\n" << end();
+    if (should_check_for_redefine(result.name))
+      raise << "redefining recipe " << result.name << "\n" << end();
     Recipe.erase(get(Recipe_ordinal, result.name));
   }
   slurp_body(in, result);
@@ -99,36 +92,36 @@ long long int slurp_recipe(istream& inreturn get(Recipe_ordinal, result.name);
 }
 
-void slurp_body(istream& in, recipe& result) {
+void slurp_body(istream& in, recipe& result) {
   in >> std::noskipws;
   skip_whitespace_but_not_newline(in);
-  if (in.get() != '[')
-    raise_error << "recipe body must begin with '['\n" << end();
+  if (in.get() != '[')
+    raise << "recipe body must begin with '['\n" << end();
   skip_whitespace_and_comments(in);  // permit trailing comment after '['
   instruction curr;
-  while (next_instruction(in, &curr)) {
+  while (next_instruction(in, &curr)) {
     // End Rewrite Instruction(curr, recipe result)
     trace(9992, "load") << "after rewriting: " << to_string(curr) << end();
-    if (!curr.is_empty()) {
+    if (!curr.is_empty()) {
       curr.original_string = to_string(curr);
       result.steps.push_back(curr);
     }
   }
 }
 
-bool next_instruction(istream& in, instruction* curr) {
+bool next_instruction(istream& in, instruction* curr) {
   curr->clear();
   skip_whitespace_and_comments(in);
-  if (!has_data(in)) {
-    raise_error << "0: unbalanced '[' for recipe\n" << end();
+  if (!has_data(in)) {
+    raise << "0: unbalanced '[' for recipe\n" << end();
     return false;
   }
 
   vector<string> words;
-  while (has_data(in) && in.peek() != '\n') {
+  while (has_data(in) && in.peek() != '\n') {
     skip_whitespace_but_not_newline(in);
-    if (!has_data(in)) {
-      raise_error << "1: unbalanced '[' for recipe\n" << end();
+    if (!has_data(in)) {
+      raise << "1: unbalanced '[' for recipe\n" << end();
       return false;
     }
     string word = next_word(in);
@@ -136,45 +129,45 @@ bool next_instruction(istream& in(in);
   }
   skip_whitespace_and_comments(in);
-  if (SIZE(words) == 1 && words.at(0) == "]")
+  if (SIZE(words) == 1 && words.at(0) == "]")
     return false;  // end of recipe
 
-  if (SIZE(words) == 1 && !isalnum(words.at(0).at(0)) && words.at(0).at(0) != '$') {
+  if (SIZE(words) == 1 && !isalnum(words.at(0).at(0)) && words.at(0).at(0) != '$') {
     curr->is_label = true;
     curr->label = words.at(0);
     trace(9993, "parse") << "label: " << curr->label << end();
-    if (!has_data(in)) {
-      raise_error << "7: unbalanced '[' for recipe\n" << end();
+    if (!has_data(in)) {
+      raise << "7: unbalanced '[' for recipe\n" << end();
       return false;
     }
     return true;
   }
 
   vector<string>::iterator p = words.begin();
-  if (find(words.begin(), words.end(), "<-") != words.end()) {
-    for (; *p != "<-"; ++p)
+  if (find(words.begin(), words.end(), "<-") != words.end()) {
+    for (; *p != "<-"; ++p)
       curr->products.push_back(reagent(*p));
     ++p;  // skip <-
   }
 
-  if (p == words.end()) {
-    raise_error << "instruction prematurely ended with '<-'\n" << end();
+  if (p == words.end()) {
+    raise << "instruction prematurely ended with '<-'\n" << end();
     return false;
   }
   curr->old_name = curr->name = *p;  p++;
   // curr->operation will be set in a later layer
 
-  for (; p != words.end(); ++p)
+  for (; p != words.end(); ++p)
     curr->ingredients.push_back(reagent(*p));
 
   trace(9993, "parse") << "instruction: " << curr->name << end();
   trace(9993, "parse") << "  number of ingredients: " << SIZE(curr->ingredients) << end();
-  for (vector<reagent>::iterator p = curr->ingredients.begin(); p != curr->ingredients.end(); ++p)
+  for (vector<reagent>::iterator p = curr->ingredients.begin(); p != curr->ingredients.end(); ++p)
     trace(9993, "parse") << "  ingredient: " << to_string(*p) << end();
-  for (vector<reagent>::iterator p = curr->products.begin(); p != curr->products.end(); ++p)
+  for (vector<reagent>::iterator p = curr->products.begin(); p != curr->products.end(); ++p)
     trace(9993, "parse") << "  product: " << to_string(*p) << end();
-  if (!has_data(in)) {
-    raise_error << "9: unbalanced '[' for recipe\n" << end();
+  if (!has_data(in)) {
+    raise << "9: unbalanced '[' for recipe\n" << end();
     return false;
   }
   return true;
@@ -191,17 +184,17 @@ string next_word(istream& in:(before "End Globals")
 // word boundaries
-const string Terminators("(){}");
+const string Terminators("(){}");
 :(code)
-void slurp_word(istream& in, ostream& out) {
-  char c;
-  if (has_data(in) && Terminators.find(in.peek()) != string::npos) {
+void slurp_word(istream& in, ostream& out) {
+  char c;
+  if (has_data(in) && Terminators.find(in.peek()) != string::npos) {
     in >> c;
     out << c;
     return;
   }
-  while (in >> c) {
-    if (isspace(c) || Terminators.find(c) != string::npos || Ignore.find(c) != string::npos) {
+  while (in >> c) {
+    if (isspace(c) || Terminators.find(c) != string::npos || Ignore.find(c) != string::npos) {
       in.putback(c);
       break;
     }
@@ -209,32 +202,32 @@ void slurp_word(istream& in}
 }
 
-void skip_whitespace_and_comments(istream& in) {
-  while (true) {
-    if (!has_data(in)) break;
-    if (isspace(in.peek())) in.get();
-    else if (Ignore.find(in.peek()) != string::npos) in.get();
-    else if (in.peek() == '#') skip_comment(in);
-    else break;
+void skip_whitespace_and_comments(istream& in) {
+  while (true) {
+    if (!has_data(in)) break;
+    if (isspace(in.peek())) in.get();
+    else if (Ignore.find(in.peek()) != string::npos) in.get();
+    else if (in.peek() == '#') skip_comment(in);
+    else break;
   }
 }
 
 // confusing; move to the next line only to skip a comment, but never otherwise
-void skip_whitespace_and_comments_but_not_newline(istream& in) {
-  while (true) {
-    if (!has_data(in)) break;
-    if (in.peek() == '\n') break;
-    if (isspace(in.peek())) in.get();
-    else if (Ignore.find(in.peek()) != string::npos) in.get();
-    else if (in.peek() == '#') skip_comment(in);
-    else break;
+void skip_whitespace_and_comments_but_not_newline(istream& in) {
+  while (true) {
+    if (!has_data(in)) break;
+    if (in.peek() == '\n') break;
+    if (isspace(in.peek())) in.get();
+    else if (Ignore.find(in.peek()) != string::npos) in.get();
+    else if (in.peek() == '#') skip_comment(in);
+    else break;
   }
 }
 
-void skip_comment(istream& in) {
-  if (has_data(in) && in.peek() == '#') {
+void skip_comment(istream& in) {
+  if (has_data(in) && in.peek() == '#') {
     in.get();
-    while (has_data(in) && in.peek() != '\n') in.get();
+    while (has_data(in) && in.peek() != '\n') in.get();
   }
 }
 
@@ -242,21 +235,21 @@ void skip_comment(istream& in//: step on their own toes. But there'll be many occasions later where
 //: we'll want to disable the errors.
 :(before "End Globals")
-bool Disable_redefine_checks = false;
+bool Disable_redefine_checks = false;
 :(before "End Setup")
 Disable_redefine_checks = false;
 :(code)
-bool should_check_for_redefine(const string& recipe_name) {
-  if (Disable_redefine_checks) return false;
+bool should_check_for_redefine(const string& recipe_name) {
+  if (Disable_redefine_checks) return false;
   return true;
 }
 
 // for debugging
 :(code)
-void show_rest_of_stream(istream& in) {
+void show_rest_of_stream(istream& in) {
   cerr << '^';
-  char c;
-  while (in >> c)
+  char c;
+  while (in >> c)
     cerr << c;
   cerr << "$\n";
   exit(0);
@@ -265,13 +258,13 @@ void show_rest_of_stream(istream& in//: Have tests clean up any recipes they added.
 :(before "End Globals")
 vector<recipe_ordinal> Recently_added_recipes;
-long long int Reserved_for_tests = 1000;
+long long int Reserved_for_tests = 1000;
 :(before "End Setup")
 clear_recently_added_recipes();
 :(code)
-void clear_recently_added_recipes() {
-  for (long long int i = 0; i < SIZE(Recently_added_recipes); ++i) {
-    if (Recently_added_recipes.at(i) >= Reserved_for_tests  // don't renumber existing recipes, like 'interactive'
+void clear_recently_added_recipes() {
+  for (long long int i = 0; i < SIZE(Recently_added_recipes); ++i) {
+    if (Recently_added_recipes.at(i) >= Reserved_for_tests  // don't renumber existing recipes, like 'interactive'
         && contains_key(Recipe, Recently_added_recipes.at(i)))  // in case previous test had duplicate definitions
       Recipe_ordinal.erase(get(Recipe, Recently_added_recipes.at(i)).name);
     Recipe.erase(Recently_added_recipes.at(i));
@@ -282,9 +275,10 @@ void clear_recently_added_recipes() :(scenario parse_comment_outside_recipe)
 # this comment will be dropped by the tangler, so we need a dummy recipe to stop that
-recipe f1 [ ]
+def f1 [
+]
 # this comment will go through to 'load'
-recipe main [
+def main [
   1:number <- copy 23
 ]
 +parse: instruction: copy
@@ -292,7 +286,7 @@ recipe main [
 +parse:   product: 1: "number"
 
 :(scenario parse_comment_amongst_instruction)
-recipe main [
+def main [
   # comment
   1:number <- copy 23
 ]
@@ -301,7 +295,7 @@ recipe main [
 +parse:   product: 1: "number"
 
 :(scenario parse_comment_amongst_instruction_2)
-recipe main [
+def main [
   # comment
   1:number <- copy 23
   # comment
@@ -311,7 +305,7 @@ recipe main [
 +parse:   product: 1: "number"
 
 :(scenario parse_comment_amongst_instruction_3)
-recipe main [
+def main [
   1:number <- copy 23
   # comment
   2:number <- copy 23
@@ -324,7 +318,7 @@ recipe main [
 +parse:   product: 2: "number"
 
 :(scenario parse_comment_after_instruction)
-recipe main [
+def main [
   1:number <- copy 23  # comment
 ]
 +parse: instruction: copy
@@ -332,19 +326,19 @@ recipe main [
 +parse:   product: 1: "number"
 
 :(scenario parse_label)
-recipe main [
+def main [
   +foo
 ]
 +parse: label: +foo
 
 :(scenario parse_dollar_as_recipe_name)
-recipe main [
+def main [
   $foo
 ]
 +parse: instruction: $foo
 
 :(scenario parse_multiple_properties)
-recipe main [
+def main [
   1:number <- copy 23/foo:bar:baz
 ]
 +parse: instruction: copy
@@ -352,7 +346,7 @@ recipe main [
 +parse:   product: 1: "number"
 
 :(scenario parse_multiple_products)
-recipe main [
+def main [
   1:number, 2:number <- copy 23
 ]
 +parse: instruction: copy
@@ -361,7 +355,7 @@ recipe main [
 +parse:   product: 2: "number"
 
 :(scenario parse_multiple_ingredients)
-recipe main [
+def main [
   1:number, 2:number <- copy 23, 4:number
 ]
 +parse: instruction: copy
@@ -371,7 +365,7 @@ recipe main [
 +parse:   product: 2: "number"
 
 :(scenario parse_multiple_types)
-recipe main [
+def main [
   1:number, 2:address:number <- copy 23, 4:number
 ]
 +parse: instruction: copy
@@ -381,14 +375,14 @@ recipe main [
 +parse:   product: 2: ("address" "number")
 
 :(scenario parse_properties)
-recipe main [
+def main [
   1:address:number/lookup <- copy 23
 ]
 +parse:   product: 1: ("address" "number"), {"lookup": ()}
 
 //: this test we can't represent with a scenario
 :(code)
-void test_parse_comment_terminated_by_eof() {
+void test_parse_comment_terminated_by_eof() {
   Trace_file = "parse_comment_terminated_by_eof";
   load("recipe main [\n"
        "  a:number <- copy 34\n"
@@ -399,19 +393,19 @@ void test_parse_comment_terminated_by_eof() :(scenario forbid_redefining_recipes)
 % Hide_errors = true;
-recipe main [
+def main [
   1:number <- copy 23
 ]
-recipe main [
+def main [
   1:number <- copy 24
 ]
 +error: redefining recipe main
 
 :(scenario permit_forcibly_redefining_recipes)
-recipe main [
+def main [
   1:number <- copy 23
 ]
-recipe! main [
+def! main [
   1:number <- copy 24
 ]
 -error: redefining recipe main
@@ -419,4 +413,3 @@ $error: 0
 
- -- cgit 1.4.1-2-gfad0