static void find_completions ( drd_info drd, tree t, hashset<string>& h, string prefix= "") { if (is_atomic (t)) { string s= t->label; int i= 0, n= N(s); while (i<n) { if (is_iso_alpha (s[i])) { int start= i; while ((i<n) && (is_iso_alpha (s[i]))) i++; string r= s (start, i); if (starts (r, prefix) && (r != prefix)) h->insert (r (N(prefix), N(r))); } else skip_symbol (s, i); } } else { int i, n= N(t); for (i=0; i<n; i++) if (drd->is_accessible_child (t, i)) find_completions (drd, t[i], h, prefix); } }
// Parses any expression. struct ParseResult parse(const char *text) { struct ParseResult result; result.err_type = PARSE_SUCCESS; const char *s = text; s += skip_whitespace(s); size_t len; switch (*s) { case '\0': result.err_type = ERR_UNEXPECTED_EOI; break; case '(': s++; result = parse_pair(s); s += result.chars_read; break; case ')': result.err_type = ERR_UNEXPECTED_RPAREN; break; case '.': result.err_type = ERR_INVALID_DOT; break; case '#': len = skip_symbol(s + 1); if (len == 1 && s[1] == 't') { s += 2; result.expr = new_boolean(true); } else if (len == 1 && s[1] == 'f') { s += 2; result.expr = new_boolean(false); } else if (len > 2 && s[1] == '\\') { char c = parse_char_name(s + 2, len - 1); if (c == '\0') { s += 2; result.err_type = ERR_UNKNOWN_CHARACTER; } else { s += 1 + len; result.expr = new_character(c); } } else if (s[1] == '\\' && s[2] && !isspace(s[2])) { result.expr = new_character(s[2]); s += 3; } else { result.err_type = ERR_INVALID_LITERAL; } break; case '\'': s++; result = parse(s); s += result.chars_read; if (result.err_type == PARSE_SUCCESS) { result.expr = new_pair( new_stdmacro(F_QUOTE), new_pair(result.expr, new_null())); } break; case '`': s++; result = parse(s); s += result.chars_read; if (result.err_type == PARSE_SUCCESS) { result.expr = new_pair( new_stdmacro(F_QUASIQUOTE), new_pair(result.expr, new_null())); } break; case ',': s++; enum StandardMacro stdmacro = F_UNQUOTE; if (*s == '@') { s++; stdmacro = F_UNQUOTE_SPLICING; } result = parse(s); s += result.chars_read; if (result.err_type == PARSE_SUCCESS) { result.expr = new_pair( new_stdmacro(stdmacro), new_pair(result.expr, new_null())); } break; case '"': s++; len = skip_string(s); if (!(s[len-1] == '\\' && (len < 2 || s[len-2] == '\\')) && s[len] == '"') { result.expr = parse_string(s, len); } else { result.err_type = ERR_UNEXPECTED_EOI; } s += len; s++; break; default:; len = skip_symbol(s); assert(len > 0); Number number; if (parse_number(s, len, &number)) { result.expr = new_number(number); } else { InternId symbol_id = intern_string_n(s, len); result.expr = new_symbol(symbol_id); } s += len; break; } if (result.err_type == PARSE_SUCCESS) { s += skip_whitespace(s); assert(s > text); } result.chars_read = (size_t)(s - text); return result; }