diff options
author | Kartik Agaram <vc@akkartik.com> | 2020-01-01 17:04:37 -0800 |
---|---|---|
committer | Kartik Agaram <vc@akkartik.com> | 2020-01-01 17:04:37 -0800 |
commit | 2a4088119cf41175457414dfa59bd4064b8f0562 (patch) | |
tree | 64fe184e399f9870ebd481a90eec34d51e5dff68 /archive/2.vm/016dilated_reagent.cc | |
parent | 23fd294d85959c6b476bcdc35ed6ad508cc99b8f (diff) | |
download | mu-2a4088119cf41175457414dfa59bd4064b8f0562.tar.gz |
5852
Diffstat (limited to 'archive/2.vm/016dilated_reagent.cc')
-rw-r--r-- | archive/2.vm/016dilated_reagent.cc | 166 |
1 files changed, 0 insertions, 166 deletions
diff --git a/archive/2.vm/016dilated_reagent.cc b/archive/2.vm/016dilated_reagent.cc deleted file mode 100644 index 1354ba45..00000000 --- a/archive/2.vm/016dilated_reagent.cc +++ /dev/null @@ -1,166 +0,0 @@ -//: An alternative syntax for reagents that permits whitespace in properties, -//: grouped by brackets. We'll use this ability in the next layer, when we -//: generalize types from lists to trees of properties. - -void test_dilated_reagent() { - load( - "def main [\n" - " {1: number, foo: bar} <- copy 34\n" - "]\n" - ); - CHECK_TRACE_CONTENTS( - "parse: product: {1: \"number\", \"foo\": \"bar\"}\n" - ); -} - -void test_load_trailing_space_after_curly_bracket() { - load( - "def main [\n" - " # line below has a space at the end\n" - " { \n" - "]\n" - "# successfully parsed\n" - ); -} - -void test_dilated_reagent_with_comment() { - load( - "def main [\n" - " {1: number, foo: bar} <- copy 34 # test comment\n" - "]\n" - ); - CHECK_TRACE_CONTENTS( - "parse: product: {1: \"number\", \"foo\": \"bar\"}\n" - ); - CHECK_TRACE_COUNT("error", 0); -} - -void test_dilated_reagent_with_comment_immediately_following() { - load( - "def main [\n" - " 1:number <- copy {34: literal} # test comment\n" - "]\n" - ); - CHECK_TRACE_COUNT("error", 0); -} - -//: First augment next_word to group balanced brackets together. - -:(before "End next_word Special-cases") -if (in.peek() == '(') - return slurp_balanced_bracket(in); -// treat curlies mostly like parens, but don't mess up labels -if (start_of_dilated_reagent(in)) - return slurp_balanced_bracket(in); - -:(code) -// A curly is considered a label if it's the last thing on a line. Dilated -// reagents should remain all on one line. -bool start_of_dilated_reagent(istream& in) { - if (in.peek() != '{') return false; - int pos = in.tellg(); - in.get(); // slurp '{' - skip_whitespace_but_not_newline(in); - char next = in.peek(); - in.seekg(pos); - return next != '\n'; -} - -// Assume the first letter is an open bracket, and read everything until the -// matching close bracket. -// We balance {} () and []. -string slurp_balanced_bracket(istream& in) { - ostringstream result; - char c; - list<char> open_brackets; - while (in >> c) { - if (c == '(') open_brackets.push_back(c); - if (c == ')') { - if (open_brackets.empty() || open_brackets.back() != '(') { - raise << "unbalanced ')'\n" << end(); - continue; - } - assert(open_brackets.back() == '('); - open_brackets.pop_back(); - } - if (c == '[') open_brackets.push_back(c); - if (c == ']') { - if (open_brackets.empty() || open_brackets.back() != '[') { - raise << "unbalanced ']'\n" << end(); - continue; - } - open_brackets.pop_back(); - } - if (c == '{') open_brackets.push_back(c); - if (c == '}') { - if (open_brackets.empty() || open_brackets.back() != '{') { - raise << "unbalanced '}'\n" << end(); - continue; - } - open_brackets.pop_back(); - } - result << c; - if (open_brackets.empty()) break; - } - skip_whitespace_and_comments_but_not_newline(in); - return result.str(); -} - -:(after "Parsing reagent(string s)") -if (starts_with(s, "{")) { - assert(properties.empty()); - istringstream in(s); - in >> std::noskipws; - in.get(); // skip '{' - name = slurp_key(in); - if (name.empty()) { - raise << "invalid reagent '" << s << "' without a name\n" << end(); - return; - } - if (name == "}") { - raise << "invalid empty reagent '" << s << "'\n" << end(); - return; - } - { - string s = next_word(in); - if (s.empty()) { - assert(!has_data(in)); - raise << "incomplete dilated reagent at end of file (0)\n" << end(); - return; - } - string_tree* type_names = new string_tree(s); - // End Parsing Dilated Reagent Type Property(type_names) - type = new_type_tree(type_names); - delete type_names; - } - while (has_data(in)) { - string key = slurp_key(in); - if (key.empty()) continue; - if (key == "}") continue; - string s = next_word(in); - if (s.empty()) { - assert(!has_data(in)); - raise << "incomplete dilated reagent at end of file (1)\n" << end(); - return; - } - string_tree* value = new string_tree(s); - // End Parsing Dilated Reagent Property(value) - properties.push_back(pair<string, string_tree*>(key, value)); - } - return; -} - -:(code) -string slurp_key(istream& in) { - string result = next_word(in); - if (result.empty()) { - assert(!has_data(in)); - raise << "incomplete dilated reagent at end of file (2)\n" << end(); - return result; - } - while (!result.empty() && *result.rbegin() == ':') - strip_last(result); - while (isspace(in.peek()) || in.peek() == ':') - in.get(); - return result; -} |