From 9570363aec35e187e2395b1760a4b94e71580ac9 Mon Sep 17 00:00:00 2001 From: "Kartik K. Agaram" Date: Wed, 29 Jul 2015 15:55:05 -0700 Subject: 1885 --- html/013literal_string.cc.html | 98 +++++++++++++++++++++--------------------- 1 file changed, 48 insertions(+), 50 deletions(-) (limited to 'html/013literal_string.cc.html') diff --git a/html/013literal_string.cc.html b/html/013literal_string.cc.html index 03e3b5d3..b6c539cf 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; } .cSpecial { color: #008000; } .Constant { color: #00a0a0; } -.CommentedCode { color: #6c6c6c; } -.Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; } .Comment { color: #9090ff; } .Delimiter { color: #a04060; } .Special { color: #ff6060; } +.CommentedCode { color: #6c6c6c; } .Identifier { color: #804000; } -.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,70 +96,69 @@ 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 "reagent::reagent(string s)") -//? cout << s.at(0) << '\n'; //? 1 - if (s.at(0) == '[') { - assert(*s.rbegin() == ']'); - // delete [] delimiters - s.erase(0, 1); - s.erase(SIZE(s)-1); - name = s; - types.push_back(0); - properties.push_back(pair<string, vector<string> >(name, vector<string>())); - properties.back().second.push_back("literal-string"); - return; - } +:(after "Parsing reagent(string s)") +if (s.at(0) == '[') { + assert(*s.rbegin() == ']'); + // delete [] delimiters + s.erase(0, 1); + s.erase(SIZE(s)-1); + name = s; + types.push_back(0); + properties.push_back(pair<string, vector<string> >(name, vector<string>())); + properties.back().second.push_back("literal-string"); + return; +} //: Two tweaks to printing literal strings compared to other reagents: //: a) Don't print the string twice in the representation, just put '_' in @@ -168,21 +166,21 @@ string slurp_quoted(istream& in//: b) Escape newlines in the string to make it more friendly to trace(). :(after "string reagent::to_string()") - if (!properties.at(0).second.empty() && properties.at(0).second.at(0) == "literal-string") { + if (!properties.at(0).second.empty() && properties.at(0).second.at(0) == "literal-string") { return emit_literal_string(name); } :(code) 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