diff options
Diffstat (limited to 'cpp')
-rw-r--r-- | cpp/.traces/array_length | 2 | ||||
-rw-r--r-- | cpp/.traces/brace_conversion | 2 | ||||
-rw-r--r-- | cpp/.traces/break_cascading | 4 | ||||
-rw-r--r-- | cpp/.traces/break_cascading2 | 4 | ||||
-rw-r--r-- | cpp/.traces/break_empty_block | 2 | ||||
-rw-r--r-- | cpp/.traces/break_if | 4 | ||||
-rw-r--r-- | cpp/.traces/break_label | 2 | ||||
-rw-r--r-- | cpp/.traces/break_nested | 2 | ||||
-rw-r--r-- | cpp/.traces/break_nested_degenerate | 2 | ||||
-rw-r--r-- | cpp/.traces/break_nested_degenerate2 | 2 | ||||
-rw-r--r-- | cpp/.traces/break_unless | 2 | ||||
-rw-r--r-- | cpp/.traces/factorial | 4 | ||||
-rw-r--r-- | cpp/.traces/loop | 2 | ||||
-rw-r--r-- | cpp/.traces/loop_nested | 2 | ||||
-rw-r--r-- | cpp/.traces/loop_unless | 2 | ||||
-rw-r--r-- | cpp/.traces/new | 4 | ||||
-rw-r--r-- | cpp/.traces/new_array | 4 | ||||
-rw-r--r-- | cpp/.traces/new_string | 2 | ||||
-rw-r--r-- | cpp/.traces/string_literal | 2 | ||||
-rw-r--r-- | cpp/.traces/string_literal_nested | 2 | ||||
-rw-r--r-- | cpp/011load | 11 | ||||
-rw-r--r-- | cpp/012transform | 1 | ||||
-rw-r--r-- | cpp/024brace | 40 | ||||
-rw-r--r-- | cpp/026new | 2 | ||||
-rw-r--r-- | cpp/030length | 2 |
25 files changed, 76 insertions, 32 deletions
diff --git a/cpp/.traces/array_length b/cpp/.traces/array_length index c9f0863f..50c80830 100644 --- a/cpp/.traces/array_length +++ b/cpp/.traces/array_length @@ -10,7 +10,7 @@ parse/0: product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]} parse/0: instruction: 1 parse/0: ingredient: {name: "16", value: 0, type: 0, properties: ["16": "literal"]} parse/0: product: {name: "4", value: 0, type: 1, properties: ["4": "integer"]} -parse/0: instruction: 25 +parse/0: instruction: 31 parse/0: ingredient: {name: "1", value: 0, type: 5-1, properties: ["1": "array":"integer"]} parse/0: product: {name: "5", value: 0, type: 1, properties: ["5": "integer"]} after-brace/0: recipe main diff --git a/cpp/.traces/brace_conversion b/cpp/.traces/brace_conversion index 2db6bee0..455b7cd2 100644 --- a/cpp/.traces/brace_conversion +++ b/cpp/.traces/brace_conversion @@ -1,5 +1,5 @@ parse/0: label: { -parse/0: instruction: 101 +parse/0: instruction: 24 parse/0: instruction: 1 parse/0: ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]} parse/0: product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]} diff --git a/cpp/.traces/break_cascading b/cpp/.traces/break_cascading index 340589e8..ee835faa 100644 --- a/cpp/.traces/break_cascading +++ b/cpp/.traces/break_cascading @@ -2,10 +2,10 @@ parse/0: instruction: 1 parse/0: ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]} parse/0: product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]} parse/0: label: { -parse/0: instruction: 101 +parse/0: instruction: 24 parse/0: label: } parse/0: label: { -parse/0: instruction: 101 +parse/0: instruction: 24 parse/0: label: } brace/0: 100: push (open, 1) brace/0: push (close, 3) diff --git a/cpp/.traces/break_cascading2 b/cpp/.traces/break_cascading2 index 995bda66..c72e2cf6 100644 --- a/cpp/.traces/break_cascading2 +++ b/cpp/.traces/break_cascading2 @@ -5,13 +5,13 @@ parse/0: instruction: 1 parse/0: ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]} parse/0: product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]} parse/0: label: { -parse/0: instruction: 101 +parse/0: instruction: 24 parse/0: instruction: 1 parse/0: ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]} parse/0: product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]} parse/0: label: } parse/0: label: { -parse/0: instruction: 101 +parse/0: instruction: 24 parse/0: label: } brace/0: 100: push (open, 2) brace/0: push (close, 5) diff --git a/cpp/.traces/break_empty_block b/cpp/.traces/break_empty_block index b43601ac..ba91f9b1 100644 --- a/cpp/.traces/break_empty_block +++ b/cpp/.traces/break_empty_block @@ -2,7 +2,7 @@ parse/0: instruction: 1 parse/0: ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]} parse/0: product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]} parse/0: label: { -parse/0: instruction: 101 +parse/0: instruction: 24 parse/0: label: } brace/0: 100: push (open, 1) brace/0: push (close, 3) diff --git a/cpp/.traces/break_if b/cpp/.traces/break_if index 6f8907e7..0b02ca42 100644 --- a/cpp/.traces/break_if +++ b/cpp/.traces/break_if @@ -5,14 +5,14 @@ parse/0: instruction: 1 parse/0: ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]} parse/0: product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]} parse/0: label: { -parse/0: instruction: 101 +parse/0: instruction: 25 parse/0: ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]} parse/0: instruction: 1 parse/0: ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]} parse/0: product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]} parse/0: label: } parse/0: label: { -parse/0: instruction: 102 +parse/0: instruction: 24 parse/0: label: } brace/0: 100: push (open, 2) brace/0: push (close, 5) diff --git a/cpp/.traces/break_label b/cpp/.traces/break_label index c0c939ea..e948e7e7 100644 --- a/cpp/.traces/break_label +++ b/cpp/.traces/break_label @@ -2,7 +2,7 @@ parse/0: instruction: 1 parse/0: ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]} parse/0: product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]} parse/0: label: { -parse/0: instruction: 101 +parse/0: instruction: 24 parse/0: ingredient: {name: "+foo", value: 0, type: 0, properties: ["+foo": "offset"]} parse/0: label: } brace/0: 100: push (open, 1) diff --git a/cpp/.traces/break_nested b/cpp/.traces/break_nested index 261d39d1..8a2ac302 100644 --- a/cpp/.traces/break_nested +++ b/cpp/.traces/break_nested @@ -5,7 +5,7 @@ parse/0: label: { parse/0: instruction: 1 parse/0: ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]} parse/0: product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]} -parse/0: instruction: 101 +parse/0: instruction: 24 parse/0: label: { parse/0: instruction: 1 parse/0: ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]} diff --git a/cpp/.traces/break_nested_degenerate b/cpp/.traces/break_nested_degenerate index 1838fa75..e68442d3 100644 --- a/cpp/.traces/break_nested_degenerate +++ b/cpp/.traces/break_nested_degenerate @@ -5,7 +5,7 @@ parse/0: label: { parse/0: instruction: 1 parse/0: ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]} parse/0: product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]} -parse/0: instruction: 101 +parse/0: instruction: 24 parse/0: label: { parse/0: label: } parse/0: instruction: 1 diff --git a/cpp/.traces/break_nested_degenerate2 b/cpp/.traces/break_nested_degenerate2 index 17339d4f..2a871e43 100644 --- a/cpp/.traces/break_nested_degenerate2 +++ b/cpp/.traces/break_nested_degenerate2 @@ -5,7 +5,7 @@ parse/0: label: { parse/0: instruction: 1 parse/0: ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]} parse/0: product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]} -parse/0: instruction: 101 +parse/0: instruction: 24 parse/0: label: { parse/0: label: } parse/0: label: } diff --git a/cpp/.traces/break_unless b/cpp/.traces/break_unless index 605ff6fd..fdff7f87 100644 --- a/cpp/.traces/break_unless +++ b/cpp/.traces/break_unless @@ -5,7 +5,7 @@ parse/0: instruction: 1 parse/0: ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]} parse/0: product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]} parse/0: label: { -parse/0: instruction: 101 +parse/0: instruction: 26 parse/0: ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]} parse/0: instruction: 1 parse/0: ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]} diff --git a/cpp/.traces/factorial b/cpp/.traces/factorial index 050b8bbe..04c1e0ba 100644 --- a/cpp/.traces/factorial +++ b/cpp/.traces/factorial @@ -9,7 +9,7 @@ parse/0: instruction: 13 parse/0: ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]} parse/0: ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal"]} parse/0: product: {name: "3", value: 0, type: 3, properties: ["3": "boolean"]} -parse/0: instruction: 101 +parse/0: instruction: 25 parse/0: ingredient: {name: "3", value: 0, type: 3, properties: ["3": "boolean"]} parse/0: instruction: 4 parse/0: ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]} @@ -19,7 +19,7 @@ parse/0: instruction: 3 parse/0: ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]} parse/0: ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal"]} parse/0: product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]} -parse/0: instruction: 102 +parse/0: instruction: 27 parse/0: label: } parse/0: instruction: 1 parse/0: ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]} diff --git a/cpp/.traces/loop b/cpp/.traces/loop index 11685d5d..e37e3dac 100644 --- a/cpp/.traces/loop +++ b/cpp/.traces/loop @@ -8,7 +8,7 @@ parse/0: label: { parse/0: instruction: 1 parse/0: ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]} parse/0: product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]} -parse/0: instruction: 101 +parse/0: instruction: 27 parse/0: label: } brace/0: 100: push (open, 2) brace/0: push (close, 5) diff --git a/cpp/.traces/loop_nested b/cpp/.traces/loop_nested index 1eba2a21..44f69eef 100644 --- a/cpp/.traces/loop_nested +++ b/cpp/.traces/loop_nested @@ -10,7 +10,7 @@ parse/0: instruction: 1 parse/0: ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]} parse/0: product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]} parse/0: label: } -parse/0: instruction: 101 +parse/0: instruction: 28 parse/0: ingredient: {name: "4", value: 0, type: 3, properties: ["4": "boolean"]} parse/0: instruction: 1 parse/0: ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]} diff --git a/cpp/.traces/loop_unless b/cpp/.traces/loop_unless index 2de78b4a..5394cba5 100644 --- a/cpp/.traces/loop_unless +++ b/cpp/.traces/loop_unless @@ -5,7 +5,7 @@ parse/0: instruction: 1 parse/0: ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]} parse/0: product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]} parse/0: label: { -parse/0: instruction: 101 +parse/0: instruction: 29 parse/0: ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]} parse/0: instruction: 1 parse/0: ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]} diff --git a/cpp/.traces/new b/cpp/.traces/new index d2e291d7..e9be5862 100644 --- a/cpp/.traces/new +++ b/cpp/.traces/new @@ -1,7 +1,7 @@ -parse/0: instruction: 24 +parse/0: instruction: 30 parse/0: ingredient: {name: "integer", value: 0, type: 0, properties: ["integer": "type"]} parse/0: product: {name: "1", value: 0, type: 2-1, properties: ["1": "address":"integer", "raw": ]} -parse/0: instruction: 24 +parse/0: instruction: 30 parse/0: ingredient: {name: "integer", value: 0, type: 0, properties: ["integer": "type"]} parse/0: product: {name: "2", value: 0, type: 2-1, properties: ["2": "address":"integer", "raw": ]} parse/0: instruction: 13 diff --git a/cpp/.traces/new_array b/cpp/.traces/new_array index d7cd46fc..8a44bcf8 100644 --- a/cpp/.traces/new_array +++ b/cpp/.traces/new_array @@ -1,8 +1,8 @@ -parse/0: instruction: 24 +parse/0: instruction: 30 parse/0: ingredient: {name: "integer", value: 0, type: 0, properties: ["integer": "type"]} parse/0: ingredient: {name: "5", value: 0, type: 0, properties: ["5": "literal"]} parse/0: product: {name: "1", value: 0, type: 2-5-1, properties: ["1": "address":"array":"integer", "raw": ]} -parse/0: instruction: 24 +parse/0: instruction: 30 parse/0: ingredient: {name: "integer", value: 0, type: 0, properties: ["integer": "type"]} parse/0: product: {name: "2", value: 0, type: 2-1, properties: ["2": "address":"integer", "raw": ]} parse/0: instruction: 3 diff --git a/cpp/.traces/new_string b/cpp/.traces/new_string index 56b9ae0f..96077d14 100644 --- a/cpp/.traces/new_string +++ b/cpp/.traces/new_string @@ -1,4 +1,4 @@ -parse/0: instruction: 24 +parse/0: instruction: 30 parse/0: ingredient: {name: "abc def", value: 0, type: 0, properties: ["abc def": "literal-string"]} parse/0: product: {name: "1", value: 0, type: 2-5-8, properties: ["1": "address":"array":"character"]} parse/0: instruction: 20 diff --git a/cpp/.traces/string_literal b/cpp/.traces/string_literal index 39e204e3..80393a55 100644 --- a/cpp/.traces/string_literal +++ b/cpp/.traces/string_literal @@ -1,4 +1,4 @@ -parse/0: instruction: 24 +parse/0: instruction: 30 parse/0: ingredient: {name: "abc def", value: 0, type: 0, properties: ["abc def": "literal-string"]} parse/0: product: {name: "1", value: 0, type: 2-5-8, properties: ["1": "address":"array":"character"]} new/0: abc def -> 0 diff --git a/cpp/.traces/string_literal_nested b/cpp/.traces/string_literal_nested index 5fd3fbff..923cd140 100644 --- a/cpp/.traces/string_literal_nested +++ b/cpp/.traces/string_literal_nested @@ -1,4 +1,4 @@ -parse/0: instruction: 24 +parse/0: instruction: 30 parse/0: ingredient: {name: "abc [def]", value: 0, type: 0, properties: ["abc [def]": "literal-string"]} parse/0: product: {name: "1", value: 0, type: 2-5-8, properties: ["1": "address":"array":"character"]} new/0: abc [def] -> 0 diff --git a/cpp/011load b/cpp/011load index 8cbf2e53..5657486b 100644 --- a/cpp/011load +++ b/cpp/011load @@ -40,8 +40,10 @@ recipe_number add_recipe(istream& in) { if (recipe_name.empty()) raise << "empty recipe name\n"; //? raise << "empty recipe name in " << in.str() << '\n'; - if (Recipe_number.find(recipe_name) == Recipe_number.end()) + if (Recipe_number.find(recipe_name) == Recipe_number.end()) { Recipe_number[recipe_name] = Next_recipe_number++; +//? cout << "AAA: " << recipe_name << " is now " << Recipe_number[recipe_name] << '\n'; //? 1 + } recipe_number r = Recipe_number[recipe_name]; //? cout << recipe_name << ": adding recipe " << r << '\n'; //? 3 @@ -98,8 +100,13 @@ bool next_instruction(istream& in, instruction* curr) { } curr->name = *p; - if (Recipe_number.find(*p) == Recipe_number.end()) + if (Recipe_number.find(*p) == Recipe_number.end()) { Recipe_number[*p] = Next_recipe_number++; +//? cout << "AAA: " << *p << " is now " << Recipe_number[*p] << '\n'; //? 1 + } + if (Recipe_number[*p] == 0) { + raise << "Recipe " << *p << " has number 0, which is reserved for IDLE.\n" << die(); + } curr->operation = Recipe_number[*p]; ++p; for (; p != words.end(); ++p) { diff --git a/cpp/012transform b/cpp/012transform index e9b74776..7fa979c7 100644 --- a/cpp/012transform +++ b/cpp/012transform @@ -16,6 +16,7 @@ vector<transform_fn> Transform; :(code) void transform_all() { +//? cout << "AAA transform_all\n"; //? 1 for (size_t t = 0; t < Transform.size(); ++t) { for (unordered_map<recipe_number, recipe>::iterator p = Recipe.begin(); p != Recipe.end(); ++p) { recipe& r = p->second; diff --git a/cpp/024brace b/cpp/024brace index ec6171f7..47dd5596 100644 --- a/cpp/024brace +++ b/cpp/024brace @@ -11,8 +11,8 @@ //: } //: } //: -//: Braces are just labels, they require no special parsing. The operations -//: 'loop' and 'break' jump to just after the enclosing '{' and '}' +//: Braces are just labels, they require no special parsing. The pseudo +//: recipes 'loop' and 'break' jump to just after the enclosing '{' and '}' //: respectively. //: //: Conditional and unconditional 'loop' and 'break' should give us 80% of the @@ -37,6 +37,8 @@ Transform.push_back(transform_braces); :(code) void transform_braces(const recipe_number r) { +//? cout << "AAA transform_braces\n"; //? 1 +//? exit(0); //? 1 const int OPEN = 0, CLOSE = 1; list<pair<int/*OPEN/CLOSE*/, size_t/*step index*/> > braces; for (size_t index = 0; index < Recipe[r].steps.size(); ++index) { @@ -54,6 +56,7 @@ void transform_braces(const recipe_number r) { trace("after-brace") << "recipe " << Recipe[r].name; for (size_t index = 0; index < Recipe[r].steps.size(); ++index) { instruction& inst = Recipe[r].steps[index]; +//? cout << "AAA " << inst.name << ": " << inst.operation << '\n'; //? 1 if (inst.label == "{") open_braces.push(index); else if (inst.label == "}") open_braces.pop(); else if (inst.is_label) @@ -126,6 +129,7 @@ void transform_braces(const recipe_number r) { } } else if (inst.operation == Recipe_number["break-unless"]) { +//? cout << "AAA break-unless\n"; //? 1 inst.operation = Recipe_number["jump-unless"]; if (inst.ingredients.size() > 1 && isa_literal(inst.ingredients[1])) { // explicit target; a later phase will handle it @@ -157,11 +161,43 @@ size_t matching_brace(size_t index, const list<pair<int, size_t> >& braces) { // temporarily suppress run void transform_test(string form) { +//? cout << "AAA transform_test {\n"; //? 1 vector<recipe_number> tmp = add_recipes(form); +//? cout << "AAA done adding recipes\n"; //? 1 recipes_added_by_test.insert(recipes_added_by_test.end(), tmp.begin(), tmp.end()); transform_all(); +//? cout << "AAA }\n"; //? 1 } +//: Make sure these pseudo recipes get consistent numbers, even though they aren't +//: implemented. +:(before "End Globals") +const int BREAK = 24; +const int BREAK_IF = 25; +const int BREAK_UNLESS = 26; +const int LOOP = 27; +const int LOOP_IF = 28; +const int LOOP_UNLESS = 29; +:(before "End Primitive Recipe Numbers") +Recipe_number["break"] = BREAK; +assert(Next_recipe_number == BREAK); +Next_recipe_number++; +Recipe_number["break-if"] = BREAK_IF; +assert(Next_recipe_number == BREAK_IF); +Next_recipe_number++; +Recipe_number["break-unless"] = BREAK_UNLESS; +assert(Next_recipe_number == BREAK_UNLESS); +Next_recipe_number++; +Recipe_number["loop"] = LOOP; +assert(Next_recipe_number == LOOP); +Next_recipe_number++; +Recipe_number["loop-if"] = LOOP_IF; +assert(Next_recipe_number == LOOP_IF); +Next_recipe_number++; +Recipe_number["loop-unless"] = LOOP_UNLESS; +assert(Next_recipe_number == LOOP_UNLESS); +Next_recipe_number++; + :(scenario "loop") recipe main [ 1:integer <- copy 0:literal diff --git a/cpp/026new b/cpp/026new index e541d923..ee1fd2c5 100644 --- a/cpp/026new +++ b/cpp/026new @@ -37,7 +37,7 @@ if (inst.operation == Recipe_number["new"]) { :(before "End Globals") // Operator to look at elements of arrays. -const int NEW = 24; +const int NEW = 30; :(before "End Primitive Recipe Numbers") Recipe_number["new"] = NEW; assert(Next_recipe_number == NEW); diff --git a/cpp/030length b/cpp/030length index f690d543..7b5c52be 100644 --- a/cpp/030length +++ b/cpp/030length @@ -10,7 +10,7 @@ recipe main [ +mem: storing 3 in location 5 :(before "End Globals") -const int LENGTH = 25; +const int LENGTH = 31; :(before "End Primitive Recipe Numbers") Recipe_number["length"] = LENGTH; assert(Next_recipe_number == LENGTH); |