parent $root_evaluator object $compile_evaluator var $root dbref 'compile_evaluator var $root child_index 0 var $root fertile 1 var $root manager $compile_evaluator var $root owned [$compile_evaluator] var $root owners [$] var $root writable [] var $root readable ['parameters, 'methods, 'code] var $root inited 1 method compile_cml arg text; var output, char, mode, vars; //Turn the given text into the ctext format. if (type(text) == 'list) text = text.to_string(" "); if (type(text) != 'string) throw(~type, "Text should be a string."); text = text + "\""; if ((text[1]) == "\"") text = substr(text, 1); vars = #[]; vars = .parse_string(vars, text); return vars; . method parse_string arg vars, text; var output, word, is_text, token, ret_val; output = []; word = ""; is_text = 0; while (text) { ret_val = text.split_on_next(["\"", "{", "%", "&"]); word = ret_val[1]; token = ret_val[2]; text = ret_val[3]; switch (token) { case "{": output = ._handle_word(output, word); vars = .parse_command(vars, text); output = [@output, vars['result]]; text = vars['text]; is_text = 1; case "%": output = ._handle_word(output, word); vars = .parse_varref(vars, text); output = [@output, vars['result]]; text = vars['text]; is_text = 1; case "&": output = ._handle_word(output, word); vars = .parse_charref(vars, text); output = [@output, vars['result]]; text = vars['text]; is_text = 1; case "\"": output = ._handle_word(output, word); if (is_text) { vars = .text_stmt(vars, output); output = vars['result]; } if (listlen(output) == 1) output = output[1]; vars = dict_add(vars, 'text, text); return dict_add(vars, 'result, output); } } vars = dict_add(vars, 'text, text); return dict_add(vars, 'result, output); . method parse_command arg vars, text; var output, ret_val, term, word, final, first_term, final_args, token; output = []; term = []; word = ""; while (text) { ret_val = text.split_on_next(["\"", "{", "%", "&", "[", " ", "}"]); word = ret_val[1]; token = ret_val[2]; text = ret_val[3]; switch (token) { case "{": output = ._handle_word(output, term); vars = .parse_command(vars, text); output = [@output, vars['result]]; text = vars['text]; case "[": output = ._handle_word(output, term); vars = .parse_list(vars, text); output = [@output, vars['result]]; text = vars['text]; case "%": output = ._handle_word(output, term); vars = .parse_varref(vars, text); output = [@output, vars['result]]; text = vars['text]; case "\"": output = ._handle_word(output, term); vars = .parse_string(vars, text); output = [@output, vars['result]]; text = vars['text]; case " ": if ((word == "pre") && (!output)) { ret_val = ")" in text; output = [['string_type, "pre"], ['string_type, substr(text, 1, ret_val - 1)]]; text = substr(text, ret_val); } else { output = ._handle_word(output, word); } case "}": output = ._handle_word(output, word); // if (type(output[1]) != 'list) // output = [output]; first_term = output[1]; if ((first_term[1]) == 'string_type) { first_term = tosym((first_term[2]) + "_stmt"); final_args = sublist(output, 2); catch ~methodnf { vars = .(first_term)(vars, final_args); } with handler { vars = dict_add(vars, 'result, [first_term, final_args]); } } else if (type(first_term[1]) == 'symbol) { final_args = [@first_term[2], @sublist(output, 2)]; first_term = first_term[1]; vars = dict_add(vars, 'result, [first_term, final_args]); } else { first_term = 'eval_stmt; final_args = [first_term]; vars = dict_add(vars, 'result, [first_term, final_args]); } vars = dict_add(vars, 'text, text); return vars; } } vars = dict_add(vars, 'text, ""); return dict_add(vars, 'result, ['string_type, "unended command"]); . method parse_charref arg vars, text; var pos; pos = ";" in text; vars = dict_add(vars, 'text, substr(text, pos + 1)); text = substr(text, 1, pos - 1); switch (text) { case "lp": text = "("; case "amp": text = "&"; case "quote": text = "\""; case "per": text = "%"; case "lb": text = "{"; case "rb": text = "}"; case "tick": text = "'"; default: text = (">>ERROR: Unknown character " + text) + "<<"; } return dict_add(vars, 'result, ['string_type, text]); . method parse_varref arg vars, text; var output, ret_val, word, token; output = []; word = ""; while (text) { ret_val = text.split_on_next(["{", "%", "&", ";"]); word = ret_val[1]; token = ret_val[2]; text = ret_val[3]; switch (token) { case "{": output = ._handle_word(output, word); ret_val = .parse_command(vars, text); output = [@output, vars['result]]; text = vars['text]; case "%": output = ._handle_word(output, word); ret_val = .parse_varref(vars, text); output = [@output, vars['result]]; text = vars['text]; case "&": output = ._handle_word(output, word); ret_val = .parse_charref(vars, text); output = [@output, vars['result]]; text = vars['result]; case ";": output = ._handle_word(output, word); vars = dict_add(vars, 'text, text); return dict_add(vars, 'result, ['get_stmt, output]); } } . method parse_list arg vars, text; var output, term, word, token, int, ret_val; output = []; term = []; word = ""; while (text) { ret_val = text.split_on_next(["[", "]", "{", "\"", "%", "&", " "]); word = ret_val[1]; token = ret_val[2]; text = ret_val[3]; switch (token) { case "{": output = ._handle_word(output, word); vars = .parse_command(vars, text); output = [@output, vars['result]]; text = vars['text]; case "[": output = ._handle_word(output, word); vars = .parse_list(vars, text); output = [@output, vars['result]]; text = vars['text]; case "%": output = ._handle_word(output, word); vars = .parse_varref(vars, text); output = [@output, vars['result]]; text = vars['text]; case "\"": output = ._handle_word(output, word); vars = .parse_string(vars, text); output = [@output, vars['text]]; text = vars['text]; case " ": output = ._handle_word(output, word); case "]": output = ['list_type, ._handle_word(output, word)]; vars = dict_add(vars, 'text, text); return dict_add(vars, 'result, output); } } . method _handle_word arg output, word; if (word) { if (type(word) == 'string) { if (word.is_numeric()) { word = ['integer_type, toint(word)]; } else if ((word[1]) == "$") { if (" " in word) word = ['string_type, word]; else word = ['dbref_type, $object.to_dbref(word)]; } else if ((word[1]) == "'") { word = ['symbol_type, tosym(word)]; } else { word = ['string_type, word]; } } output = [@output, word]; } return output; . method char_type arg vars, args; .debug("foo"); if ((args[1]) != 'string_type) return ['string_type, ">>ERROR: Character must be a constant string."]; switch (args) { case "lp": return ['string_type, "("]; case "amp": return [string_type, "&"]; case "quote": return ['string_type, "\""]; case "per": return ['string_type, "%"]; default: return ['string_type, (">>ERROR: Unknown character " + args) + "<<"]; } . method text_stmt arg vars, args; var last, output, term, first; output = []; for term in (args) { if (output) { last = output.last(); if (((term[1]) == 'string_type) && ((last[1]) == 'string_type)) { term = ['string_type, (last[2]) + (term[2])]; output = output.chop(); } } output = [@output, term]; } if (listlen(output) == 1) { first = output[1]; if ((first[1]) == 'string_type) return dict_add(vars, 'result, first); } return dict_add(vars, 'result, ['text_stmt, output]); .