コード例 #1
0
ファイル: parse.c プロジェクト: GJDuck/SMCHR
/*
 * 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;
}
コード例 #2
0
ファイル: execute.c プロジェクト: chtisgit/thunbasic
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);
}