Example #1
0
// build JSON object hierarchy
JSON * JSON::parse_private(Lexer *lexer)
{
    // check token to determine what JSON type to construct
    Json_Token token = lexer->get_token();
    
    switch (token)
    {
        case Object_start_token:
            return parse_object(lexer);
        case Array_start_token:
            return parse_array(lexer);
        case String_token:
            return new_string(lexer->token_src, lexer->token_len);
        case Null_token:
            return new_null();
        case True_token:
            return new_boolean(true);
        case False_token:
            return new_boolean(false);
        case Float_token:
            return new_float(lexer->float_num);
        case Unsigned_token:
            return new_unsigned(lexer->unsigned_num);
        case Signed_token:
            return new_signed(lexer->signed_num);
        default:
            Serial.println(F("JSON syntax error"));
    }

    return null;
}
Example #2
0
bool test_equal()
{
   symbol *s[3];
   integer *i[3];
   boolean *b[3];
   
   s[0] = new_symbol("foo");
   s[1] = new_symbol("bar");
   s[2] = new_symbol("foo");

   i[0] = new_integer(0);
   i[1] = new_integer(1);
   i[2] = new_integer(0);

   b[0] = new_boolean(true);
   b[1] = new_boolean(false);
   b[2] = new_boolean(true);

   assert(generic_equal(s[0], s[0]) == true);
   assert(generic_equal(s[0], s[1]) == false);
   assert(generic_equal(s[0], s[2]) == true);

   assert(generic_equal(i[0], i[0]) == true);
   assert(generic_equal(i[0], i[1]) == false);
   assert(generic_equal(i[0], i[2]) == true);

   assert(generic_equal(b[0], b[0]) == true);
   assert(generic_equal(b[0], b[1]) == false);
   assert(generic_equal(b[0], b[2]) == true);

   assert(generic_equal(b[0], s[0]) == false);
   assert(generic_equal(b[0], i[1]) == false);
   assert(generic_equal(s[0], b[1]) == false);

   return true;
}
Example #3
0
value_t value_identity_compare_cycle_protect(value_t a, value_t b,
    cycle_detector_t *detector) {
  // First check that they even belong to the same domain. Values can be equal
  // across domains.
  value_domain_t a_domain = get_value_domain(a);
  value_domain_t b_domain = get_value_domain(b);
  if (a_domain != b_domain)
    return no();
  // Then dispatch to the domain equals functions.
  switch (a_domain) {
    case vdInteger:
    case vdCustomTagged:
      return new_boolean(is_same_value(a, b));
    case vdHeapObject:
      return heap_object_identity_compare(a, b, detector);
    default:
      return no();
  }
}
Example #4
0
static value_t default_heap_heap_object_identity_compare(value_t a, value_t b,
    cycle_detector_t *detector) {
  return new_boolean(is_same_value(a, b));
}
Example #5
0
File: parse.c Project: mk12/eva
// 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;
}