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/013literal_string.cc.html | 81 +++++++++++++++++++++--------------------- 1 file changed, 40 insertions(+), 41 deletions(-) (limited to 'html/013literal_string.cc.html') diff --git a/html/013literal_string.cc.html b/html/013literal_string.cc.html index 07837f40..735e67e0 100644 --- a/html/013literal_string.cc.html +++ b/html/013literal_string.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; } +.Identifier { color: #804000; } .cSpecial { color: #008000; } -.CommentedCode { color: #6c6c6c; } -.Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; } .Comment { color: #9090ff; } .Delimiter { color: #a04060; } .Special { color: #ff6060; } -.Identifier { color: #804000; } +.CommentedCode { color: #6c6c6c; } +.Constant { color: #00a0a0; } +.traceContains { color: #008000; } --> @@ -57,7 +56,7 @@ recipe main [ Type_ordinal["literal-string"] = 0; :(after "string next_word(istream& in)") - if (in.peek() == '[') { + if (in.peek() == '[') { string result = slurp_quoted(in); skip_whitespace(in); skip_comment(in); @@ -68,26 +67,26 @@ Type_ordinal["literal-string"] = :(code) string slurp_quoted(istream& in) { ostringstream out; - assert(!in.eof()); assert(in.peek() == '['); out << static_cast<char>(in.get()); // slurp the '[' - if (code_string(in, out)) + assert(!in.eof()); assert(in.peek() == '['); out << static_cast<char>(in.get()); // slurp the '[' + if (code_string(in, out)) slurp_quoted_comment_aware(in, out); - else + else slurp_quoted_comment_oblivious(in, out); return out.str(); } // A string is a code string if it contains a newline before any non-whitespace // todo: support comments before the newline. But that gets messy. -bool code_string(istream& in, ostringstream& out) { - while (!in.eof()) { - char c = in.get(); - if (!isspace(c)) { +bool code_string(istream& in, ostringstream& out) { + while (!in.eof()) { + char c = in.get(); + if (!isspace(c)) { in.putback(c); //? cerr << "code_string: " << out.str() << '\n'; //? 1 return false; } out << c; - if (c == '\n') { + if (c == '\n') { //? cerr << "code_string: " << out.str() << '\n'; //? 1 return true; } @@ -97,59 +96,59 @@ string slurp_quoted(istream& in// Read a regular string. Regular strings can only contain other regular // strings. -void slurp_quoted_comment_oblivious(istream& in, ostringstream& out) { +void slurp_quoted_comment_oblivious(istream& in, ostringstream& out) { //? cerr << "comment oblivious\n"; //? 1 - int brace_depth = 1; - while (!in.eof()) { - char c = in.get(); + int brace_depth = 1; + while (!in.eof()) { + char c = in.get(); //? cerr << '%' << (int)c << ' ' << brace_depth << ": " << out.str() << "%$\n"; //? 1 //? cout << (int)c << ": " << brace_depth << '\n'; //? 2 - if (c == '\\') { - out << static_cast<char>(in.get()); + if (c == '\\') { + out << static_cast<char>(in.get()); continue; } out << c; //? cout << out.str() << "$\n"; //? 1 - if (c == '[') ++brace_depth; - if (c == ']') --brace_depth; - if (brace_depth == 0) break; + if (c == '[') ++brace_depth; + if (c == ']') --brace_depth; + if (brace_depth == 0) break; } - if (in.eof() && brace_depth > 0) { + if (in.eof() && brace_depth > 0) { raise << "unbalanced '['\n" << end(); out.clear(); } } // Read a code string. Code strings can contain either code or regular strings. -void slurp_quoted_comment_aware(istream& in, ostringstream& out) { +void slurp_quoted_comment_aware(istream& in, ostringstream& out) { //? cerr << "comment aware\n"; //? 1 - char c; - while (in >> c) { + char c; + while (in >> c) { //? cerr << '^' << (int)c << ": " << out.str() << "$\n"; //? 1 - if (c == '\\') { - out << static_cast<char>(in.get()); + if (c == '\\') { + out << static_cast<char>(in.get()); continue; } - if (c == '#') { + if (c == '#') { out << c; - while (!in.eof() && in.peek() != '\n') out << static_cast<char>(in.get()); + while (!in.eof() && in.peek() != '\n') out << static_cast<char>(in.get()); continue; } - if (c == '[') { + if (c == '[') { in.putback(c); // recurse out << slurp_quoted(in); continue; } out << c; - if (c == ']') return; + if (c == ']') return; } raise << "unbalanced '['\n" << end(); out.clear(); } :(after "Parsing reagent(string s)") -if (s.at(0) == '[') { +if (s.at(0) == '[') { assert(*s.rbegin() == ']'); // delete [] delimiters s.erase(0, 1); @@ -167,24 +166,24 @@ string slurp_quoted(istream& in//: b) Escape newlines in the string to make it more friendly to trace(). :(after "string reagent::to_string()") - if (is_literal_string(*this)) + if (is_literal_string(*this)) return emit_literal_string(name); :(code) -bool is_literal_string(const reagent& x) { +bool is_literal_string(const reagent& x) { return !x.properties.at(0).second.empty() && x.properties.at(0).second.at(0) == "literal-string"; } string emit_literal_string(string name) { - size_t pos = 0; - while (pos != string::npos) + size_t pos = 0; + while (pos != string::npos) pos = replace(name, "\n", "\\n", pos); return "{name: \""+name+"\", properties: [_: \"literal-string\"]}"; } -size_t replace(string& str, const string& from, const string& to, size_t n) { - size_t result = str.find(from, n); - if (result != string::npos) +size_t replace(string& str, const string& from, const string& to, size_t n) { + size_t result = str.find(from, n); + if (result != string::npos) str.replace(result, from.length(), to); return result; } -- cgit 1.4.1-2-gfad0