/* * Parse a term. */ extern term_t parse_term(const char *filename, size_t *line, opinfo_t opinfo, const char *str, const char **end, varset_t *vars) { struct context_s cxt_0; context_t cxt = &cxt_0; cxt->file = filename; cxt->line = *line; if (vars == NULL) cxt->vars = varset_init(); else cxt->vars = *vars; cxt->opinfo = opinfo; cxt->str = (char *)str; cxt->peeked_token = TOKEN_NONE; cxt->peeked_val = TERM_NIL; term_t val; const char *end0; if (end == NULL) end = &end0; if (token_peek(cxt, NULL, NULL) == TOKEN_END) val = (term_t)NULL; else if (!parse_term_op(cxt, &val, UINT32_MAX)) val = (term_t)NULL; else if (!token_expect(cxt, TOKEN_END)) val = (term_t)NULL; else { if (vars != NULL) *vars = cxt->vars; } *end = cxt->str; *line = cxt->line; return val; }
void execute(struct Line *line1, struct VarSet *parent_set) { struct VarSet varset; struct Line *ip, *next; int err = 0; varset_init(&varset, parent_set); for(ip = line1; ip != NULL && err == 0; ip = next){ next = ip->then; DEBUGMSG("CMD=\"%s\"\n", BASIC_pcmds_s[ip->cmd]); switch(ip->cmd){ case BASCMD_LET: err = run_let(ip, &varset); break; case BASCMD_DIM: /* TODO */ break; case BASCMD_PRINT: err = run_print(ip, &varset); break; case BASCMD_INPUT: /* TODO */ break; case BASCMD_READ: /* TODO */ break; case BASCMD_IF: /* TODO */ break; case BASCMD_ON: /* TODO */ break; case BASCMD_FOR: /* TODO */ break; case BASCMD_NEXT: /* TODO */ break; case BASCMD_REM: case BASCMD_DATA: /* these don't do anything */ case BASCMD_GOTO: case BASCMD_END: /* these are run implicitly */ break; case BASCMD_GOSUB: /* TODO */ break; case BASCMD_RETURN: /* TODO */ break; case BASCMD_DEBUG: err = run_debug(ip, &varset); break; default: error("invalid command (this should not happen)"); err = 1; } } varset_deinit(&varset); }