📄 basic2.c
字号:
#include "os.h"
#include "ptype.h"
/***self Func***/
FAR void skip_white();
FAR bitnode *search_vartree(char *s);
FAR void doingassign(char *var, char *value);
FAR void IsArray();
FAR void assign_buf();
FAR char *get_type(char *s);
FAR void get_data();
FAR void exec_swap();
FAR void exec_def();
FAR char *find_label(char *s);
FAR void get_next();
FAR char *gpop();
FAR void gpush(char *s);
FAR void fpush(for_stack_str *i);
FAR void fpop(for_stack_str *i);
FAR void find_eol();
FAR void wpop(while_stack_str *i);
FAR char *get_variables(char *s);
FAR void FreeOpMem();
FAR void putback();
FAR char get_token(char tflag);
FAR void brealloc(char *s, char *p);
FAR void serror(Int8 error);
FAR void ckvar(char *s);
FAR char *get_token_last();
FAR int isalpha(char c);
FAR int isdigit(char c);
FAR char tolower(char c);
FAR int isdelim(char c);
FAR int iswhite(char c);
FAR char look_up(char *s);
FAR char get_priority(char *s);
FAR void exec_open();
FAR void exec_close();
FAR void exec_put();
FAR void exec_get();
/***basic1.c Func***/
FAR int atoi(char *x);
FAR void itoa(int i, char *result, char flag);
FAR double atof(char *x);
FAR void gcvt(float i, char flag, char *result);
FAR void exec_mid();
FAR void exec_right();
FAR void exec_left();
FAR void exec_fn();
FAR void exec_inkey();
FAR void exec_kbhit();
FAR void exec_getkey();
FAR char get_result_type(char o, char *r, char *h);
FAR void add_type(char *result, int data_type);
FAR void get_exp(char *result);
FAR char *GetAllocBuf();
FAR UInt8 IsInteger(char *value_ptr);
FAR UInt8 agree_v(char *var, char *value);
extern bitnode *Variables;
extern pfnode *pf;
extern fsnode *fl;
extern data_str *data_buf, *cur_buf;
extern for_stack_str fstack[FOR_NEST];
extern while_stack_str wstack[WHILE_WEND];
extern label_str *label_table;
extern UInt8 GTflag;
extern Int8 InputFlag, InputError;
extern UInt8 *hBasicWnd;
extern char *prog, *pInBuf;
extern char *token;
extern char token_type;
extern char tok;
extern char notdoelse;
extern char *gstack[SUB_NEST];
extern int ftos;
extern int wtos;
extern int gtos;
extern char op_b[4];
extern Int8 sl_flag;
const char table[][10] = { {"("}, {")"}, {"*"}, {"+"}, {"-"}, {"/"}, {"<"}, {"<="},
{"<>"}, {"="}, {">"}, {">="}, {"^"}, {"abs"}, {"and"}, {"asc"},
{"atn"}, {"beep"}, {"box"}, {"chr"}, {"circle"},{"close"}, {"cls"}, {"copy"},
{"cos"}, {"cvi$"}, {"cvs$"}, {"data"}, {"def"}, {"dim"}, {"draw"}, {"ellipse"},
{"else"}, {"end"}, {"endif"}, {"eof"}, {"exp"}, {"fn"}, {"for"}, {"get"}, {"getkey"},
{"gosub"},{"gotext"},{"goto"}, {"graph"}, {"if"}, {"inkey"}, {"input"}, {"int"}, {"kbhit"},
{"left"}, {"len"}, {"let"}, {"line"}, {"locate"},{"log"}, {"lset"}, {"mid"},
{"mki$"}, {"mks$"}, {"next"}, {"not"}, {"on"}, {"open"}, {"or"}, {"play"},
{"pos"}, {"print"},{"put"}, {"read"}, {"rem"}, {"restore"},{"return"},{"right"},
{"rnd"}, {"rset"}, {"sgn"}, {"sin"}, {"spc"}, {"sqr"}, {"step"}, {"str"},
{"swap"}, {"tan"}, {"then"}, {"to"}, {"val"}, {"wend"}, {"while"}};
const char comtok[] = {
34,35,23,21,22,24,27,29,31,30,26,28,25,37,32,48,38,103,96,49,101,82,110,87,
39,55,56,18,90,80,95,108,14,13,100,58,41,91,5,85,114,11,106,8,92,3,94,2,47,113,
97,50,112,93,109,42,88,99,57,51,6,36,107,81,33,102,54,1,84,19,105,20,12,98,
46,89,43,40,111,44,15,52,104,45,4,7,53,17,16};
const char opsign[][8] = { {"("},{")"},{"*"},{"+"},{"-"},{"/"},{"<"},{"<="},{"<>"},{"="},
{">"},{">="},{"^"},{"abs"},{"and"},{"asc"},{"atn"},{"chr"},{"cos"},{"cvi$"},
{"cvs$"},{"eof"},{"exp"},{"int"},{"len"},{"log"},{"mki$"},{"mks$"},{"not"},{"or"},
{"pos"},{"rnd"},{"sgn"},{"sin"},{"sqr"},{"str"},{"tan"},{"val"}};
const char opprior[] ={
15, 3, 12, 11, 11, 12, 10, 10, 9, 9, 10, 10, 13, 14, 5, 14, 14, 14, 14, 14, 14,
14, 14, 14, 14, 14, 14, 14, 14, 4, 14, 14, 14, 14, 14, 14, 14, 14 };
const char opcod[] = {
34,35,23,21,22,24,27,29,31,30,
26,28,25,37,32,48,38,49,39,55,
56,58,41,47,50,42,57,51,36,33,
54,46,43,40,44,52,45,53};
void Ins_Node(bitnode *s)
{
bitnode *p,*q;
if (Variables==(bitnode *)Null) Variables=s;
else
{
p = Variables;
while (p!=(bitnode *)Null)
{
q = p;
if (p==(bitnode *)Null) break;
if (Stricmp(p->var_addr,s->var_addr)>0) p = p->lch;
else if (Stricmp(p->var_addr,s->var_addr)<0) p = p->rch;
else { p->value_addr = s->var_addr; return; }
}
if (Stricmp(q->var_addr,s->var_addr)>0) q->lch = s;
else q->rch = s;
}
}
FAR void doingassign(char *var, char *value)
{
bitnode *s;
if ((s =(bitnode *)MemAlloc(sizeof(bitnode)))==(bitnode *)Null)
{
MemFree(var);
MemFree(value);
serror(1); /**************内存溢出**************/
}
s->var_addr = var;
s->value_addr = value;
s->lch = (bitnode *)Null;
s->rch = (bitnode *)Null;
Ins_Node(s);
}
void check_array(char *a_n, char *a_t, int *result)
{
bitnode *p;
char *s, *n_buf1, *n_buf2;
int l1, l2;
n_buf1 = GetAllocBuf();
n_buf2 = n_buf1 + 50;
*result = 0;
p = (bitnode *)Null;
l1 = 0;
p = search_vartree(a_n);
if (p == (bitnode *)Null)
{
a_t++;
while (*a_t!=')')
{
l2 = 0;
while (*a_t==0x20||*a_t==0x09) a_t++;
while (isdigit(*a_t)) *(n_buf2 + l2++) = *a_t++;
*(n_buf2 + l2) = 0;
while (*a_t==0x20||*a_t==0x09) a_t++;
if (l2==0||*a_t!=','&&*a_t!=')')
serror(29); /***出现非法数组或与所定义的数组不一致***/
else
{
if (*a_t==',') a_t++;
}
if (atoi(n_buf2)>10) serror(30); /***未初始化的数组,下标不可以大于10***/
}
return;
}
s = p->value_addr + 1;
for (;;)
{
if (*s!=')') s++;
if (*a_t!=')') a_t++;
l1 = 0;
while (isdigit(*s)) *(n_buf1 + l1++) = *s++;
*(n_buf1 + l1) = 0;
l2 = 0;
while (isdigit(*a_t)) *(n_buf2 + l2++) = *a_t++;
*(n_buf2 + l2) = 0;
if (l1==0&&l2!=0||l1!=0&&l2==0)
serror(29); /***出现非法数组或与所定义的数组不一致***/
if (l1==0&&l2==0)
{
if (*s==')'&&*a_t==')') break;
else
serror(29);
}
if (atoi(n_buf1)< atoi(n_buf2)) serror(30); /***数组下标越界***/
}
}
FAR void IsArray()
{
char *old_prog, *var, *exp_buf, *token_buf, *exp_value, *s;
int i, result, Br_Num;
i = 0;
result = 0;
if (*prog != '(') return;
var = GetAllocBuf();
exp_buf = GetAllocBuf();
exp_value = GetAllocBuf();
token_buf = GetAllocBuf();
Strcpy(token_buf,token);
Strcat(token_buf,"()");
Br_Num = 1;
while (Br_Num)
{
i = Strlen(exp_value);
*(exp_value+i) = ',';
*(exp_value+i+1) = 0;
s = exp_buf;
i = 0;
prog++;
*(s + i++)='(';
while (*prog!=','||*prog==','&&Br_Num!=1)
{
if (*prog == '(') Br_Num++;
else if (*prog == ')'&&!(--Br_Num)) break;
else if (Strchr("!#@&|~':;.?<>=",*prog)||*prog==0x0D)
serror(29);
*(s + i++) = *prog++;
}
*(s + i) = ')';
*(s + i + 1) = 0;
old_prog = prog;
prog = s;
get_exp(var);
IsInteger(var);
Strcat(exp_value,var + 1);
prog = old_prog;
}
prog++;
*exp_value = '(';
i = Strlen(exp_value);
*(exp_value+i) = ')';
*(exp_value+i+1) = 0;
if (*token_buf=='-')
{
check_array(token_buf+1,exp_value,&result);
}
else
{
check_array(token_buf,exp_value,&result);
}
Strcpy(token,token_buf);
if (Strlen(token) + Strlen(exp_value) > 180) serror(1);
Strcat(token,exp_value);
}
FAR void get_data()
{
char *p;
p = token;
token_type = 0;
tok = 0;
while (*prog==32) prog++;
if (*prog=='"')
{
token_type = QUOTE;
prog++;
}
while (*prog!=','&&*prog!=':'&&*prog!=0x0D&&*prog!=0) *p++ = *prog++;
if (*prog==',') prog++;
else tok = EOL;
while (*(p-1)==32) p--;
if (token_type==QUOTE&&*(--p)!='"') serror(31); /***字符串表示错误,请查看双引号是否配对***/
*p = 0;
}
FAR void assign_buf() /*** alloc buffer for data area ***/
{
char *value; data_str *p, *q;
q = data_buf;
while (*prog==32) prog++;
if (Strstr(prog,"DATA")==prog||Strstr(prog,"data")==prog) prog += 4;
for (;;)
{
get_data();
if (token_type==QUOTE) add_type(token,STRING_TYPE);
else
{
if (!get_type(token)) serror(31); /***非法字符串表示***/
}
if ((value=(char *)MemAlloc(Strlen(token)+1))==(char *)Null) serror(1); /***内存溢出***/
if ((p=(data_str *)MemAlloc(sizeof(data_str)))==(data_str *)Null)
{
MemFree(value);
serror(1); /***内存溢出***/
}
Strcpy(value,token);
*(value+Strlen(token)) = 0;
p->value_addr = value;
p->next = (data_str *)Null;
if (q==(data_str *)Null) data_buf = cur_buf = q = p;
else
{
while (q->next) q = q->next;
q->next = p;
}
if (tok==EOL) break;
}
}
FAR char *find_label(char *s) /*查找标号*/
{
int fnum;
label_str *cur_lab;
cur_lab = label_table;
fnum = atoi(s);
while (cur_lab!=(label_str*)Null)
{
if (cur_lab->label_num==fnum)
return cur_lab->p;
else
cur_lab = cur_lab->next;
}
return (char*)Null;
}
FAR void wpop(while_stack_str *i)
{
if (--wtos<0) serror(17);
i->exploc=wstack[wtos].exploc;
i->endloc=wstack[wtos].endloc;
}
FAR void find_eol()/*到达行尾 */
{
while(*prog != 0x0D && *prog != 0 && *prog!= ':') prog++;
if(*prog) prog++;
}
FAR void fpop(for_stack_str *i)
{
if(--ftos<0) serror(16);
i->var = fstack[ftos].var;
i->target = fstack[ftos].target;
i->step = fstack[ftos].step;
i->loc = fstack[ftos].loc;
}
FAR void fpush(for_stack_str *i)
{
if(ftos>FOR_NEST) serror(32); /***For-Next循环嵌套层数越界***/
fstack[ftos].var = i->var;
fstack[ftos].target = i->target;
fstack[ftos].step = i->step;
fstack[ftos].loc = i->loc;
ftos++;
}
FAR void gpush(char *s)
{
if(++gtos == SUB_NEST) serror(33); /***GoSub嵌套层数越界***/
gstack[gtos] = s;
}
FAR char *gpop()
{
if(gtos == 0) serror(34); /***GoSub返回出错***/
return(gstack[gtos--]);
}
FAR void get_next()
{
char *temp;
temp = token;
while (*prog==32||*prog==']') prog++;
if (*prog=='"') {
while (*prog!='"'&&*prog!=':'&&*prog!=0x0D) prog++;
if (*prog++!='"') serror(31);
} else {
while (*prog!=32&&*prog!=':'&&*prog!=0x0D&&*prog!='='&&*prog!=','&&*prog!=0) *temp++ = *prog++;
prog++;
}
*temp = 0;
}
FAR char *get_type(char *s)
{
int l, pointnum, signnum, i;
char *temp, *p, *ptr;
if (Strcmp(s,"+")==0||Strcmp(s,"-")==0) return (char *)Null;
if (*s=='+'&&*(s+1)=='-'||*s=='-'&&*(s+1)=='+') return (char *)Null;
temp = GetAllocBuf();
p = s;
ptr = temp;
if (*p=='+') p++;
if (*p=='-') *ptr++ = *p++;
if (*p=='.') return (char *)Null;
while(*p == '0'&&*(p + 1) == '0') p++;
if (*p == '0'&&isdigit(*(p + 1))) p++;
pointnum = 0;
while(*p!=0)
{
if (*p == '.' && ++pointnum > 1) return (char*)Null;
if (!isdigit(*p)&&*p!='.') return (char*)Null;
*ptr++ = *p++;
}
if (*(ptr-1)=='.') *(ptr - 1) = 0;
else *ptr = 0;
Strcpy(s+1,temp);
*s = REAL_TYPE;
return s;
}
FAR char *get_variables(char *s)
{
struct btnode *p;
p = Variables;
while (p!=(struct btnode *)Null)
{
if (Stricmp(p->var_addr,s)>0) p = p->lch;
else if (Stricmp(p->var_addr,s)<0) p = p->rch;
else return p->value_addr;
}
if (Strchr(s,'(')&&Strchr(s,')')) serror(30); /***数组内容没有初始化***/
serror(10);
return (char*)Null; /***变量没有定义***/
}
FAR void putback()
{
char *t;
t = token;
for(;*t;t++) prog--;
}
FAR char get_token(char tflag)
{
char *temp, tag, signflag, *p;
int buf_count, dot_count;
temp = token;
*temp = tok;
tok = 0;
if(*prog == 0 )
{
*token = 0;
tok = FINISHED;
return(token_type = DELIMITER);
}
if (*prog==']')
{
if (prog==pInBuf||*(prog-1)==0x0D)
{
while(*prog==']') prog++;
}
else
serror(0);
}
while(*prog==0x20||*prog==0x09) prog++;
if (*(prog-1)=='='||*(prog-1)=='('||*temp==STEP||*temp==TO
||*temp>25&&*temp<37&&*temp!=35||token_type==COMMAND)
*temp = 1;
else
*temp = 0;
token_type = 0;
if ((*prog=='-'||*prog=='+')&&(*temp||!tflag)) *temp++ = *prog++;
if(*prog==0x0D||*prog==':')
{
if (token!=temp) serror(0);
prog++;
tok = EOL;
*token = 0x0D;
token[1] = 0 ;
return(token_type = DELIMITER);
}
if (*prog=='.') serror(0);
if(Strchr("+-*/^=()><",*prog))
{
*temp = *prog++;
if (*temp=='>'&&*prog=='=') *(++temp) = *prog++;
else if (*temp=='<'&&(*prog=='='||*prog=='>')) *(++temp) = *prog++;
else if (*temp == '(')
{
p = prog;
while (*p==0x20||*p==0x09) p++;
if (*p==')') serror(0);
}
*(++temp) = 0;
tok = look_up(token);
return(token_type = OPERATION2);
}
if(Strchr(";,#",*prog))
{
*temp++ = *prog++;
*temp = 0;
return(token_type = DELIMITER);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -