From 90560d7194f3e451ddab9d4033c98d2e6aec977b Mon Sep 17 00:00:00 2001 From: "Kartik K. Agaram" Date: Sun, 23 Aug 2015 10:19:23 -0700 Subject: 2062 --- html/011load.cc.html | 163 +++++++++++++++++++++++++++++---------------------- 1 file changed, 92 insertions(+), 71 deletions(-) (limited to 'html/011load.cc.html') diff --git a/html/011load.cc.html b/html/011load.cc.html index 07977936..f6d9ea85 100644 --- a/html/011load.cc.html +++ b/html/011load.cc.html @@ -13,15 +13,14 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-color: #080808; } body { font-family: monospace; color: #eeeeee; background-color: #080808; } * { font-size: 1.05em; } -.traceContains { color: #008000; } -.Constant { color: #00a0a0; } -.cSpecial { color: #008000; } .CommentedCode { color: #6c6c6c; } -.Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; } +.cSpecial { color: #008000; } .Comment { color: #9090ff; } .Delimiter { color: #a04060; } .Special { color: #ff6060; } .Identifier { color: #804000; } +.Constant { color: #00a0a0; } +.traceContains { color: #008000; } --> @@ -54,34 +53,34 @@ vector<recipe_ordinal> load(string form(istream& in) { in >> std::noskipws; vector<recipe_ordinal> result; - while (!in.eof()) { + while (!in.eof()) { //? cerr << "===\n"; //? 1 skip_whitespace_and_comments(in); - if (in.eof()) break; + if (in.eof()) break; string command = next_word(in); // Command Handlers - if (command == "recipe") { + if (command == "recipe") { string recipe_name = next_word(in); -//? cerr << "recipe: " << recipe_name << '\n'; //? 1 - if (recipe_name.empty()) +//? cerr << "recipe: " << recipe_name << '\n'; //? 2 + if (recipe_name.empty()) raise << "empty recipe name\n" << end(); - if (Recipe_ordinal.find(recipe_name) == Recipe_ordinal.end()) { + if (Recipe_ordinal.find(recipe_name) == Recipe_ordinal.end()) { Recipe_ordinal[recipe_name] = Next_recipe_ordinal++; } - if (warn_on_redefine(recipe_name) + if (warn_on_redefine(recipe_name) && Recipe.find(Recipe_ordinal[recipe_name]) != Recipe.end()) { raise << "redefining recipe " << Recipe[Recipe_ordinal[recipe_name]].name << "\n" << end(); } // todo: save user-defined recipes to mu's memory Recipe[Recipe_ordinal[recipe_name]] = slurp_recipe(in); -//? cerr << Recipe_ordinal[recipe_name] << ": " << recipe_name << '\n'; //? 1 +//? cerr << Recipe_ordinal[recipe_name] << ": " << recipe_name << '\n'; //? 2 Recipe[Recipe_ordinal[recipe_name]].name = recipe_name; // track added recipes because we may need to undo them in tests; see below recently_added_recipes.push_back(Recipe_ordinal[recipe_name]); result.push_back(Recipe_ordinal[recipe_name]); } // End Command Handlers - else { + else { raise << "unknown top-level command: " << command << '\n' << end(); } } @@ -92,91 +91,111 @@ vector<recipe_ordinal> load(istream& in recipe slurp_recipe(istream& in) { recipe result; skip_whitespace(in); - if (in.get() != '[') + if (in.get() != '[') raise << "recipe body must begin with '['\n" << end(); skip_whitespace_and_comments(in); instruction curr; - while (next_instruction(in, &curr)) { + while (next_instruction(in, &curr)) { // End Rewrite Instruction(curr) -//? cerr << "instruction: " << curr.to_string() << '\n'; //? 2 +//? cerr << "instruction: " << curr.to_string() << '\n'; //? 3 result.steps.push_back(curr); } return result; } -bool next_instruction(istream& in, instruction* curr) { +bool next_instruction(istream& in, instruction* curr) { in >> std::noskipws; curr->clear(); - if (in.eof()) return false; + if (in.eof()) { + raise << "0: unbalanced '[' for recipe\n" << end(); + return false; + } //? show_rest_of_stream(in); //? 1 - skip_whitespace(in); if (in.eof()) return false; + skip_whitespace(in); + if (in.eof()) { + raise << "1: unbalanced '[' for recipe\n" << end(); + return false; + } //? show_rest_of_stream(in); //? 1 - skip_whitespace_and_comments(in); if (in.eof()) return false; + skip_whitespace_and_comments(in); + if (in.eof()) { + raise << "2: unbalanced '[' for recipe\n" << end(); + return false; + } vector<string> words; //? show_rest_of_stream(in); //? 1 - while (in.peek() != '\n') { - skip_whitespace(in); if (in.eof()) return false; + while (in.peek() != '\n' && !in.eof()) { + skip_whitespace(in); + if (in.eof()) { + raise << "3: unbalanced '[' for recipe\n" << end(); + return false; + } //? show_rest_of_stream(in); //? 1 - string word = next_word(in); if (in.eof()) return false; -//? cerr << "AAA: " << word << '\n'; //? 1 + string word = next_word(in); words.push_back(word); - skip_whitespace(in); if (in.eof()) return false; + skip_whitespace(in); } - skip_whitespace_and_comments(in); if (in.eof()) return false; - + skip_whitespace_and_comments(in); //? if (SIZE(words) == 1) cout << words.at(0) << ' ' << SIZE(words.at(0)) << '\n'; //? 1 - if (SIZE(words) == 1 && words.at(0) == "]") { -//? cout << "AAA\n"; //? 1 + 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("parse") << "label: " << curr->label << end(); - return !in.eof(); + if (in.eof()) { + 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 (*p == ",") continue; + if (find(words.begin(), words.end(), "<-") != words.end()) { + for (; *p != "<-"; ++p) { + if (*p == ",") continue; curr->products.push_back(reagent(*p)); //? cerr << "product: " << curr->products.back().to_string() << '\n'; //? 1 } ++p; // skip <- } - if (p == words.end()) { + if (p == words.end()) { raise << "instruction prematurely ended with '<-'\n" << end() << end(); return false; } curr->name = *p; - if (Recipe_ordinal.find(*p) == Recipe_ordinal.end()) { + if (Recipe_ordinal.find(*p) == Recipe_ordinal.end()) { Recipe_ordinal[*p] = Next_recipe_ordinal++; //? cout << "AAA: " << *p << " is now " << Recipe_ordinal[*p] << '\n'; //? 1 } - if (Recipe_ordinal[*p] == 0) { + if (Recipe_ordinal[*p] == 0) { raise << "Recipe " << *p << " has number 0, which is reserved for IDLE.\n" << end() << end(); return false; } curr->operation = Recipe_ordinal[*p]; ++p; - for (; p != words.end(); ++p) { - if (*p == ",") continue; + for (; p != words.end(); ++p) { + if (*p == ",") continue; curr->ingredients.push_back(reagent(*p)); //? cerr << "ingredient: " << curr->ingredients.back().to_string() << '\n'; //? 1 } trace("parse") << "instruction: " << curr->name << 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("parse") << " ingredient: " << p->to_string() << 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("parse") << " product: " << p->to_string() << end(); } - return !in.eof(); + if (in.eof()) { + raise << "9: unbalanced '[' for recipe\n" << end(); + return false; + } + return true; } string next_word(istream& in) { @@ -190,17 +209,17 @@ string next_word(istream& inreturn out.str(); } -void slurp_word(istream& in, ostream& out) { +void slurp_word(istream& in, ostream& out) { //? cout << "AAA slurp_word\n"; //? 1 - char c; - if (in.peek() == ',') { + char c; + if (in.peek() == ',') { in >> c; out << c; return; } - while (in >> c) { + while (in >> c) { //? cout << c << '\n'; //? 1 - if (isspace(c) || c == ',') { + if (isspace(c) || c == ',') { in.putback(c); break; } @@ -208,30 +227,30 @@ string next_word(istream& in} } -void skip_whitespace(istream& in) { - while (isspace(in.peek()) && in.peek() != '\n') { +void skip_whitespace(istream& in) { + while (isspace(in.peek()) && in.peek() != '\n') { in.get(); } } -void skip_whitespace_and_comments(istream& in) { - while (true) { - if (isspace(in.peek())) in.get(); - else if (in.peek() == '#') skip_comment(in); - else break; +void skip_whitespace_and_comments(istream& in) { + while (true) { + if (isspace(in.peek())) in.get(); + else if (in.peek() == '#') skip_comment(in); + else break; } } -void skip_comment(istream& in) { - if (in.peek() == '#') { +void skip_comment(istream& in) { + if (in.peek() == '#') { in.get(); - while (in.peek() != '\n') in.get(); + while (in.peek() != '\n') in.get(); } } -void skip_comma(istream& in) { +void skip_comma(istream& in) { skip_whitespace(in); - if (in.peek() == ',') in.get(); + if (in.peek() == ',') in.get(); skip_whitespace(in); } @@ -239,24 +258,24 @@ string next_word(istream& in//: step on their own toes. But there'll be many occasions later where //: we'll want to disable the warnings. :(before "End Globals") -bool Disable_redefine_warnings = false; +bool Disable_redefine_warnings = false; :(before "End Setup") Disable_redefine_warnings = false; :(code) -bool warn_on_redefine(const string& recipe_name) { - if (Disable_redefine_warnings) return false; +bool warn_on_redefine(const string& recipe_name) { + if (Disable_redefine_warnings) return false; return true; } // for debugging :(before "End Globals") -bool Show_rest_of_stream = false; +bool Show_rest_of_stream = false; :(code) -void show_rest_of_stream(istream& in) { - if (!Show_rest_of_stream) return; +void show_rest_of_stream(istream& in) { + if (!Show_rest_of_stream) return; cerr << '^'; - char c; - while (in >> c) { + char c; + while (in >> c) { cerr << c; } cerr << "$\n"; @@ -266,10 +285,12 @@ Disable_redefine_warnings = false//: Have tests clean up any recipes they added. :(before "End Globals") vector<recipe_ordinal> recently_added_recipes; +long long int Reserved_for_tests = 1000; :(before "End Setup") -for (long long int i = 0; i < SIZE(recently_added_recipes); ++i) { +for (long long int i = 0; i < SIZE(recently_added_recipes); ++i) { //? cout << "AAA clearing " << Recipe[recently_added_recipes.at(i)].name << '\n'; //? 2 - Recipe_ordinal.erase(Recipe[recently_added_recipes.at(i)].name); + if (recently_added_recipes.at(i) >= Reserved_for_tests) // don't renumber existing recipes, like 'interactive' + Recipe_ordinal.erase(Recipe[recently_added_recipes.at(i)].name); Recipe.erase(recently_added_recipes.at(i)); } // Clear Other State For recently_added_recipes @@ -295,7 +316,7 @@ recipe main [ +parse: ingredient: {name: "23", properties: ["23": "literal"]} +parse: product: {name: "1", properties: ["1": "number"]} -:(scenario parse_comment_amongst_instruction2) +:(scenario parse_comment_amongst_instruction_2) recipe main [ # comment 1:number <- copy 23 @@ -305,7 +326,7 @@ recipe main [ +parse: ingredient: {name: "23", properties: ["23": "literal"]} +parse: product: {name: "1", properties: ["1": "number"]} -:(scenario parse_comment_amongst_instruction3) +:(scenario parse_comment_amongst_instruction_3) recipe main [ 1:number <- copy 23 # comment -- cgit 1.4.1-2-gfad0