コード例 #1
0
ファイル: ubasic.c プロジェクト: mizuki-tohru/stm32f4-console
//static void gosub_statement(void)
void gosub_statement(void)
{
	int linenum,nextnum;
	char *tmpptr, *tmpnextptr;
	
	accept(TOKENIZER_GOSUB);
	linenum = tokenizer_num();
	accept(TOKENIZER_NUMBER);
	tmpptr = ptr;
	tmpnextptr = nextptr;
	while(tokenizer_token() != TOKENIZER_CR &&
		tokenizer_token() != TOKENIZER_ENDOFINPUT){
		tokenizer_next();
	}
	accept(TOKENIZER_CR);
	nextnum = tokenizer_num();
	ptr = tmpptr;
	nextptr = tmpnextptr;
	if(gosub_stack_ptr < MAX_GOSUB_STACK_DEPTH) {
		gosub_stack[gosub_stack_ptr] = nextnum;
		gosub_stack_ptr++;
		jump_linenum(linenum);
	}else{
	}
}
コード例 #2
0
ファイル: ubasic.c プロジェクト: CobooGuo/ubasic
/*---------------------------------------------------------------------------*/
static void
line_statement(void)
{
  DEBUG_PRINTF("----------- Line number %d ---------\n", tokenizer_num());
  index_add(tokenizer_num(), tokenizer_pos());
  accept(TOKENIZER_NUMBER);
  statement();
  return;
}
コード例 #3
0
ファイル: ubasic.c プロジェクト: mizuki-tohru/stm32f4-console
//static void let_statement(void)
void let_statement(void)
{
	long var;
	long ix;
	ix = 0;
	var = tokenizer_variable_num();
	if((var >= MAX_VARNUM)&&(var <(MAX_VARNUM+MAX_ARRYNUM))){
		accept(TOKENIZER_VARIABLE);
		ix = tokenizer_num();
		accept(TOKENIZER_ARRAY);
	}else{
		accept(TOKENIZER_VARIABLE);
	}
	if(ptr[0] == '='){
		accept(TOKENIZER_EQ);
		if(var < MAX_VARNUM){
			ubasic_set_variable(var, expr());
		}else if(var < (MAX_VARNUM+MAX_ARRYNUM)){
			if(ix<MAX_ARRYLEN){
				ubasic_set_array(var,ix, expr());
			}
		}else if(var < (MAX_VARNUM+MAX_ARRYNUM+MAX_STRINGNUM)){
			ubasic_set_variable(var, expr());
		}else if(var < (MAX_VARNUM+MAX_ARRYNUM+MAX_STRINGNUM+MAX_BIGVARNUM)){
			ubasic_set_variable(var, expr());
		}
	}
	accept(TOKENIZER_CR);
}
コード例 #4
0
static void find_linenum (int linenum)
{
  /* Skip irrelevant new-lines and comments. */
  while (tokenizer_token() != T_NUMBER)
    tokenizer_next();
  while (tokenizer_num() != linenum &&
  tokenizer_token() != T_EOF)
  {
    /* Check line number, then skip the rest of line statement. */
    do {
      do {
        tokenizer_next();
      } while (tokenizer_token() != T_EOL &&
      tokenizer_token() != T_EOF);
      if (tokenizer_token() == T_EOL)
      {
        /* Skip irrelevant new-lines and comments. */
        while (tokenizer_token() != T_NUMBER &&
        tokenizer_token() != T_EOF)
          tokenizer_next();
      }
    } while (tokenizer_token() != T_NUMBER &&
      tokenizer_token() != T_EOF);
  }
}
コード例 #5
0
ファイル: ubasic.c プロジェクト: CobooGuo/ubasic
/*---------------------------------------------------------------------------*/
static void
gosub_statement(void)
{
  int linenum;
  accept(TOKENIZER_GOSUB);
  linenum = tokenizer_num();
  accept(TOKENIZER_NUMBER);
  accept(TOKENIZER_CR);
  if(gosub_stack_ptr < MAX_GOSUB_STACK_DEPTH) {
    gosub_stack[gosub_stack_ptr] = tokenizer_num();
    gosub_stack_ptr++;
    jump_linenum(linenum);
  } else {
    DEBUG_PRINTF("gosub_statement: gosub stack exhausted\n");
  }
}
コード例 #6
0
ファイル: ubasic.c プロジェクト: CobooGuo/ubasic
/*---------------------------------------------------------------------------*/
static void
for_statement(void)
{
  int for_variable, to;

  accept(TOKENIZER_FOR);
  for_variable = tokenizer_variable_num();
  accept(TOKENIZER_VARIABLE);
  accept(TOKENIZER_EQ);
  ubasic_set_variable(for_variable, expr());
  accept(TOKENIZER_TO);
  to = expr();
  accept(TOKENIZER_CR);

  if(for_stack_ptr < MAX_FOR_STACK_DEPTH) {
    for_stack[for_stack_ptr].line_after_for = tokenizer_num();
    for_stack[for_stack_ptr].for_variable = for_variable;
    for_stack[for_stack_ptr].to = to;
    DEBUG_PRINTF("for_statement: new for, var %d to %d\n",
                for_stack[for_stack_ptr].for_variable,
                for_stack[for_stack_ptr].to);

    for_stack_ptr++;
  } else {
    DEBUG_PRINTF("for_statement: for stack depth exceeded\n");
  }
}
コード例 #7
0
ファイル: ubasic.c プロジェクト: mizuki-tohru/stm32f4-console
//static void line_statement(void)
void line_statement(void)
{
	ErrLine = tokenizer_num();
	/*    current_linenum = tokenizer_num();*/
	accept(TOKENIZER_NUMBER);
	statement();
	return;
}
コード例 #8
0
ファイル: ubasic.c プロジェクト: EtchedPixels/ubasic
/*---------------------------------------------------------------------------*/
static void
jump_linenum_slow(int linenum)
{
  tokenizer_init(program_ptr);
  while(tokenizer_num() != linenum) {
    do {
      do {
        tokenizer_next();
      } while(current_token != TOKENIZER_CR &&
          current_token != TOKENIZER_ENDOFINPUT);
      if(current_token == TOKENIZER_CR) {
        tokenizer_next();
      }
    } while(current_token != TOKENIZER_NUMBER);
    DEBUG_PRINTF("jump_linenum_slow: Found line %d\n", tokenizer_num());
  }
}
コード例 #9
0
ファイル: ubasic.c プロジェクト: EtchedPixels/ubasic
/*---------------------------------------------------------------------------*/
static void line_statements(void)
{
  line_num = tokenizer_num();
  DEBUG_PRINTF("----------- Line number %d ---------\n", line_num);
  index_add(line_num, tokenizer_pos());
  accept_tok(TOKENIZER_NUMBER);
  statements();
  return;
}
コード例 #10
0
static void goto_statement (void)
{
  int to;
  accept(T_GOTO);
  to = tokenizer_num();
  accept(T_NUMBER);
  accept(T_EOL);
  jump_linenum(to);
}
コード例 #11
0
static void if_statement (void)
{
  int r, to;
  accept(T_IF);
  r = relation();
  accept(T_THEN);
  to = tokenizer_num();
  accept(T_NUMBER);
  accept(T_EOL);
  if (r)
    jump_linenum(to);
}
コード例 #12
0
ファイル: ubasic.c プロジェクト: mizuki-tohru/stm32f4-console
//static int factor(void)
int factor(void)
{
	int r;
	switch(tokenizer_token()) {
		case TOKENIZER_NUMBER:
			r = tokenizer_num();
			accept(TOKENIZER_NUMBER);
			break;
		case TOKENIZER_LEFTPAREN:
			accept(TOKENIZER_LEFTPAREN);
			r = expr();
			accept(TOKENIZER_RIGHTPAREN);
			break;
		default:
			r = varfactor();
			break;
	}
	return r;
}
コード例 #13
0
ファイル: ubasic.c プロジェクト: mizuki-tohru/stm32f4-console
//static void for_statement(void)
void for_statement(void)
{
	long for_variable, to;
	accept(TOKENIZER_FOR);
	for_variable = tokenizer_variable_num();
	accept(TOKENIZER_VARIABLE);
	accept(TOKENIZER_EQ);
	ubasic_set_variable(for_variable, expr());
	accept(TOKENIZER_TO);
	to = expr();
	accept(TOKENIZER_CR);

	if(for_stack_ptr < MAX_FOR_STACK_DEPTH) {
		for_stack[for_stack_ptr].line_after_for = tokenizer_num();
		for_stack[for_stack_ptr].for_variable = for_variable;
		for_stack[for_stack_ptr].to = to;
		for_stack_ptr++;
	}else{
	}
}
コード例 #14
0
ファイル: ubasic.c プロジェクト: mizuki-tohru/stm32f4-console
//static void jump_linenum(int linenum)
void jump_linenum(int linenum)
{
	ptr = BASICBUF;
	nextptr = ptr;

	tokenizer_init(ptr);
	while(tokenizer_num() != linenum) {
		do {
			do {
				tokenizer_next();
			} while(tokenizer_token() != TOKENIZER_CR &&
					tokenizer_token() != TOKENIZER_ENDOFINPUT);
			if(tokenizer_token() == TOKENIZER_CR) {
				tokenizer_next();
			}
			if(tokenizer_token() == TOKENIZER_ENDOFINPUT){
				ended = 1;
				return;
			}
		} while(tokenizer_token() != TOKENIZER_NUMBER);
	}
}
コード例 #15
0
static int factor (void)
{
  int r;
  switch (tokenizer_token())
  {
    case T_NUMBER:
      r = tokenizer_num();
      accept(T_NUMBER);
      break;
    case T_LEFT_PAREN:
      accept(T_LEFT_PAREN);
      r = expression();
      accept(T_RIGHT_PAREN);
      break;
    default:
      r = get_variable(
        tokenizer_variable_num());
      accept(T_LETTER);
      break;
  }
  return r;
}
コード例 #16
0
ファイル: ubasic.c プロジェクト: CobooGuo/ubasic
/*---------------------------------------------------------------------------*/
static int
factor(void)
{
  int r;

  DEBUG_PRINTF("factor: token %d\n", tokenizer_token());
  switch(tokenizer_token()) {
  case TOKENIZER_NUMBER:
    r = tokenizer_num();
    DEBUG_PRINTF("factor: number %d\n", r);
    accept(TOKENIZER_NUMBER);
    break;
  case TOKENIZER_LEFTPAREN:
    accept(TOKENIZER_LEFTPAREN);
    r = expr();
    accept(TOKENIZER_RIGHTPAREN);
    break;
  default:
    r = varfactor();
    break;
  }
  return r;
}
コード例 #17
0
ファイル: ubasic.c プロジェクト: EtchedPixels/ubasic
/*---------------------------------------------------------------------------*/
static void factor(struct typevalue *v)
{
  uint8_t t = current_token;
  int len;
  struct typevalue arg[3];

  DEBUG_PRINTF("factor: token %d\n", current_token);
  switch(t) {
  case TOKENIZER_STRING:
    v->type = TYPE_STRING;
    len = tokenizer_string_len();
    v->d.p = string_temp(len);
    memcpy(v->d.p + 1, tokenizer_string(), len);
    DEBUG_PRINTF("factor: string %p\n", v->d.p);
    accept_tok(TOKENIZER_STRING);
    break;
  case TOKENIZER_NUMBER:
    v->d.i = tokenizer_num();
    v->type = TYPE_INTEGER;
    DEBUG_PRINTF("factor: number %d\n", v->d.i);
    accept_tok(TOKENIZER_NUMBER);
    break;
  case TOKENIZER_LEFTPAREN:
    accept_tok(TOKENIZER_LEFTPAREN);
    expr(v);
    accept_tok(TOKENIZER_RIGHTPAREN);
    break;
  case TOKENIZER_INTVAR:
  case TOKENIZER_STRINGVAR:
    varfactor(v);
    break;
  default:
    if (TOKENIZER_NUMEXP(t)) {
      accept_tok(t);
      switch(t) {
      case TOKENIZER_PEEK:
        funcexpr(arg,"I");
        v->d.i = peek_function(arg[0].d.i);
        break;
      case TOKENIZER_ABS:
        funcexpr(arg,"I");
        v->d.i = arg[0].d.i;
        if (v->d.i < 0)
          v->d.i = -v->d.i;
        break;
      case TOKENIZER_INT:
        funcexpr(arg,"I");
        v->d.i = arg[0].d.i;
        break;
      case TOKENIZER_SGN:
        funcexpr(arg,"I");
        v->d.i = arg[0].d.i;
        if (v->d.i > 1 ) v->d.i = 1;
        if (v->d.i < 0) v->d.i = -1;
        break;
      case TOKENIZER_LEN:
        funcexpr(arg,"S");
        v->d.i = *arg[0].d.p;
        break;
      case TOKENIZER_CODE:
        funcexpr(arg,"S");
        if (*arg[0].d.p)
          v->d.i = arg[0].d.p[1];
        else
          v->d.i = 0;
        break;
      case TOKENIZER_VAL:
        funcexpr(arg,"S");
        v->d.i = string_val(&arg[0]);
        break;
      default:
        syntax_error();
      }
      v->type = TYPE_INTEGER;
    }
    else if (TOKENIZER_STRINGEXP(t)) {
      accept_tok(t);
      switch(t) {
      case TOKENIZER_LEFTSTR:
        funcexpr(arg, "SI");
        string_cut(v, &arg[0], 1, arg[1].d.i);
        break;
      case TOKENIZER_RIGHTSTR:
        funcexpr(arg, "SI");
        string_cut_r(v, &arg[0], arg[1].d.i);
        break;
      case TOKENIZER_MIDSTR:
        funcexpr(arg, "SII");
        string_cut(v, &arg[0], arg[1].d.i, arg[2].d.i);
        break;
      case TOKENIZER_CHRSTR:
        funcexpr(arg, "I");
        v->d.p = string_temp(2);
        v->d.p[1] = arg[0].d.i;
        v->type = TYPE_STRING;
        break;
      default:
        syntax_error();
      }
    }
    else
      syntax_error();
  }
}
コード例 #18
0
ファイル: ubasic.c プロジェクト: mizuki-tohru/stm32f4-console
//static void goto_statement(void)
void goto_statement(void)
{
	accept(TOKENIZER_GOTO);
	jump_linenum(tokenizer_num());
}