Exemple #1
0
void
syntax_free(syntax* t)
{
  if(t==NULL)return;
  switch (t->tag) {
  case syntax_NIL:
    return;
  case syntax_BIN:
    syntax_free(((syntax_bin*)t)->l);
    syntax_free(((syntax_bin*)t)->r);
    break;
  case syntax_IF:
    syntax_free(((syntax_if*)t)->e1);
    syntax_free(((syntax_if*)t)->e2);
    syntax_free(((syntax_if*)t)->e3);
    break;
  case syntax_LET:
    syntax_free(((syntax_let*)t)->e1);
    syntax_free(((syntax_let*)t)->e2);
    break;
  case syntax_LAMBDA:
    syntax_free(((syntax_lambda*)t)->env);
    syntax_free(((syntax_lambda*)t)->e1);
    break;
  case syntax_DOUBLE:
  case syntax_BOOL:
  case syntax_VAR:
  case syntax_PRE:
    break;
  }
  free(t);
}
Exemple #2
0
Fichier : main.c Projet : hsk/docs
int
main(int argc, const char**argv)
{
  parse_string("1+2*3");
  syntax_pp(state.lval, 0);
  syntax_free(state.lval);
  parse_string("(1+2) * ");
  syntax_pp(state.lval, 0);
  syntax_free(state.lval);
  return 0;
}
Exemple #3
0
void
syntax_free(syntax* t)
{
  if(t==NULL)return;
  switch (t->tag) {
  case syntax_BIN:
    syntax_free(((syntax_bin*)t)->l);
    syntax_free(((syntax_bin*)t)->r);
    break;
  default:
    break;
  }
  free(t);
}
Exemple #4
0
void
syntax_free(syntax* t)
{
  if(t!=NULL)
  switch (t->tag) {
  case syntax_BIN:
    syntax_free(((syntax_bin*)t)->l);
    free(((syntax_bin*)t)->op);
    syntax_free(((syntax_bin*)t)->r);
    break;
  default:
    free(t);
    break;
  }
}
Exemple #5
0
/*
 *	Load a (possibly cached) syntax.  If the cache exists, use it
 *	in preference to anything else.
 *
 *	We remember the INODE of the cached file instead of the
 *	modification timestamp.  This is because there may be multiple
 *	people using the same CLI.  If one updates the syntax, we want
 *	the other one to see only the finished new version, and not
 *	any intermediate version.  This requirement means that
 *	updating the syntax has to be done as an atomic operation, i.e.
 *
 *		$ ./bin/rehash > ./cache/syntax.txt.new
 *		$ mv ./cache/syntax.txt.new ./cache/syntax.txt
 */
int recli_load_syntax(recli_config_t *config)
{
	struct stat statbuf;
	cli_syntax_t *head = NULL;
	char buffer[8192];

	snprintf(buffer, sizeof(buffer), "%s/cache/syntax.txt", config->dir);
	if (stat(buffer, &statbuf) == 0) {
		if (config->syntax_inode == statbuf.st_ino) return 0;

		if (syntax_parse_file(buffer, &head) < 0) return -1;

		config->syntax_inode = statbuf.st_ino;
	} else {
		snprintf(buffer, sizeof(buffer), "%s/bin/", config->dir);

		if (recli_load_dirs(&head, buffer, strlen(buffer),
			    config->envp) < 0) return -1;

		/*
		 *	FIXME: dump syntax to syntax.cache file, and
		 *	update cached inode.
		 */
	}

	if (config->syntax) syntax_free(config->syntax);
	config->syntax = head;

	return 0;
}
Exemple #6
0
Fichier : main.c Projet : hsk/docs
int
main(int argc, const char**argv)
{
  eval_init();
  parser_state state;
  parse_string(&state, "1+2*3");
  syntax_p(state.lval, 0);
  syntax_p(eval(syntax_nil, state.lval), 0);
  syntax_free(state.lval);

  parse_string(&state, "1");
  syntax_p(state.lval, 0);
  //printf("eval %lf\n", eval(state.lval));
  syntax_free(state.lval);

  parse_string(&state, "abc");
  syntax_p(state.lval, 0);
  //printf("eval %lf\n", eval(state.lval));
  syntax_free(state.lval);

  parse_string(&state, "1::2+3::()");
  syntax_p(state.lval, 0);
  syntax_p(eval(syntax_nil, state.lval), 0);
  syntax_free(state.lval);

  parse_string(&state, "(a::2)::(b::3)::()");
  syntax* env = state.lval;
  syntax_p(state.lval, 0);

  syntax_p(lookup(env, "a"), 0);
  syntax_p(lookup(env, "b"), 0);
  syntax_p(lookup(env, "c"), 0);
  syntax_free(env);

  parse_string(&state, "abc -> abc");
  syntax_p(state.lval, 0);
  syntax_p(eval(syntax_nil, state.lval), 0);
  syntax_free(state.lval);

  parse_string(&state, "(abc -> abc)10");
  syntax_p(state.lval, 0);
  syntax_p(eval(syntax_nil, state.lval), 0);
  syntax_free(state.lval);

  parse_string(&state, "let abc=1 in abc");
  syntax_p(state.lval, 0);
  syntax_p(eval(syntax_nil, state.lval), 0);
  syntax_free(state.lval);

  parse_string(&state, "let abc=2 in if abc<=1 then 1 else 2");
  syntax_p(state.lval, 0);
  syntax_p(eval(syntax_nil, state.lval), 0);
  syntax_free(state.lval);

  parse_string(&state, "let abc=0 in if abc<=1 then 1 else 2");
  syntax_p(state.lval, 0);
  syntax_p(eval(syntax_nil, state.lval), 0);
  syntax_free(state.lval);

  parse_string(&state, "let abc=0 in abc<=1");
  syntax_p(state.lval, 0);
  syntax_p(eval(syntax_nil, state.lval), 0);
  syntax_free(state.lval);

  parse_string(&state, "let abc=2 in abc<=1");
  syntax_p(state.lval, 0);
  syntax_p(eval(syntax_nil, state.lval), 0);
  syntax_free(state.lval);

  parse_string(&state, "(x -> x + 1)1");
  syntax_p(state.lval, 0);
  syntax_p(eval(syntax_nil, state.lval), 0);
  syntax_free(state.lval);

  parse_string(&state, "let rec abc=1 in abc");
  syntax_p(state.lval, 0);
  syntax_p(eval(syntax_nil, state.lval), 0);
  syntax_free(state.lval);

  parse_string(&state,
    "let rec sum = \n"
    "  x -> if x <= 0 then 0 else x + sum (x-1) \n"
    "in \n"
    "sum 10\n");
  syntax_p(state.lval, 0);
  syntax_p(eval(syntax_nil, state.lval), 0);
  syntax_free(state.lval);

  parse_string(&state, "(1+2) * ");
  syntax_p(state.lval, 0);
  syntax_p(eval(syntax_nil, state.lval), 0);
  syntax_free(state.lval);

  parse_string(&state, "-1");
  syntax_p(state.lval, 0);
  syntax_p(eval(syntax_nil, state.lval), 0);
  syntax_free(state.lval);

  parse_string(&state, "(x-> -x)(+1)");
  syntax_p(state.lval, 0);
  syntax_p(eval(syntax_nil, state.lval), 0);
  syntax_free(state.lval);
  return 0;
}