Exemple #1
0
static void parse_string(struct context_t *ctx, struct lexem_t *lexem)
{
    locate_lexem(lexem, ctx);
    /* skip " */
    advance(ctx, 1);
    /* compute length */
    struct context_t cpy_ctx = *ctx;
    int length = 0;
    __parse_string(&cpy_ctx, (void *)&length, __parse_string_count);
    /* parse again */
    lexem->type = LEX_STRING;
    lexem->str = xmalloc(length + 1);
    lexem->str[length] = 0;
    char *pstr = lexem->str;
    __parse_string(ctx, (void *)&pstr, __parse_string_emit);
}
Exemple #2
0
void* __parse_file(const char* path, 
                   GError** err,
                   parser parser_cb, 
                   parser_alloc parser_alloc_cb, 
                   parser_free parser_free_cb,
                   lexer lexer_cb)
{
  char* buffer;
  if (!g_file_get_contents(path, &buffer, NULL, err))
    return NULL;
  return __parse_string(buffer, err, parser_cb, parser_alloc_cb, parser_free_cb, lexer_cb);
}
 void DeviceCreationParameterString::SetValue(String val) throw (Exception) {
     if (Fix()) throw Exception("Device parameter is read only");
     SetValueAsString(__parse_string(val));
 }
 DeviceCreationParameterString::DeviceCreationParameterString(String sVal) : DeviceCreationParameter() {
     this->sVal = __parse_string(sVal);
 }
static int __parse_primary (struct expr_parser *self, z_expr_t *expr) {
  const z_lexer_token_t *token = z_lexer_peek(self->lex);
  int negate = 0;

  switch (token->type) {
    case Z_LEXER_TOKEN_INT:
      __parse_int(self, expr);
      z_lexer_next(self->lex);
      break;
    case Z_LEXER_TOKEN_FLOAT:
      __parse_float(self, expr);
      z_lexer_next(self->lex);
      break;
    case Z_LEXER_TOKEN_BOOLEAN:
      expr->type = Z_EXPR_TYPE_INT;
      expr->d.integer = (token->length == 4);
      z_lexer_next(self->lex);
      break;
    case Z_LEXER_TOKEN_STRING:
      __parse_string(self, expr);
      z_lexer_next(self->lex);
      break;
    case Z_LEXER_TOKEN_IDENTIFIER:
      __parse_identifier(self, expr);
      z_lexer_next(self->lex);
      if (self->lex->query[token->start] == '(') {
        __parse_function(self, expr);
      }
      break;
    case Z_LEXER_TOKEN_OPERATOR:
      if (self->lex->query[token->start] == '(') {
        z_lexer_next(self->lex);
        __parse_predicate(self, expr);
        token = z_lexer_peek(self->lex);
        if (self->lex->query[token->start] != ')') {
          return(Z_EXPR_EXPECTED_END_PARENTHESIS);
        }
        z_lexer_next(self->lex);
      } else {
        return(Z_EXPR_PRIMARY_EXPECTED_PARENTHESIS);
      }
      break;
    default:
      return(Z_EXPR_UNKNOWN_PRIMARY_TOKEN);
  }

  if (expr == NULL) {
    return(Z_EXPR_NO_PRIMARY);
  }

  token = z_lexer_peek(self->lex);
  if (token->length == 3 && z_memeq(self->lex->query + token->start, "NOT", 3)) {
    z_lexer_next(self->lex);
    negate = 1;
    token = z_lexer_peek(self->lex);
  }

  if (token->length == 2 && z_memeq(self->lex->query + token->start, "IN", 2)) {
    z_lexer_next(self->lex);
    return(__parse_in(self, expr, negate));
  } else if (token->length == 7 && z_memeq(self->lex->query + token->start, "BETWEEN", 7)) {
    z_lexer_next(self->lex);
    return(__parse_between(self, expr, negate));
  } else if (negate) {
    return(Z_EXPR_PRIMARY_NOT_WITHOUT_OP);
  }

  return(Z_EXPR_OK);
}