📄 basic2.c
字号:
}
if(*prog =='"')
{
if (token!=temp) serror(0);
prog++;
while(*prog!='"'&&*prog!=0&&(*prog!=0x0D||*(prog+1)!='"'))
{
*temp++ = *prog++;
if ((UInt16)(temp - token) > 100) serror(1); /***限定字符串长不可超过100***/
}
if (*prog==0) serror(31);
prog++;
*temp = 0;
return(token_type = QUOTE);
}
if (*prog>47&&*prog<58) /***是否数字***/
{
while(*prog == '0'&&*(prog + 1) == '0') prog++;
if (*prog == '0'&& isdigit(*(prog + 1))) prog++;
buf_count = 0;
dot_count = 0;
while(!isdelim(*prog))
{
if (*prog == '.' && (++dot_count)>1) serror(0);
if (!isdigit(*prog)&&*prog!='.') serror(0);
*temp++ = *prog++;
if (++buf_count>160) serror(1);
if (*(prog-1)==')')
{
prog--;
temp--;
break;
}
}
if (*(temp-1)=='.') *(temp - 1) = 0;
else *temp = 0;
return(token_type = NUMBER);
}
if(isalpha(*prog))
{
buf_count = 0;
while(!isdelim(*prog)) {
*temp++ = *prog++;
if (++buf_count>160) serror(1);
}
token_type=STRING;
}
*temp = 0;
if(token_type==STRING)
{
tag = look_up(token);
if(tag==0)
{
if (!sl_flag) IsArray();
token_type = VARIABLE;
}
else
{
temp = prog;
while (*temp==0x20||*temp==0x09) temp++;
if (*temp == '=' && (tflag == 0 || tag != INKEY && tag != KBHIT && tag != GETKEY ))
serror(42); /*判定命令字是否用成了变量名*/
if (tag > 20 && tag < 36) token_type = OPERATION2;
else if (tag>35&&tag<60) token_type = OPERATION1;
else {
token_type = COMMAND;
if (*token == '+') signflag = 0x2B;
else if (*token == '-') signflag = 0x2D;
else signflag = 0;
if (tflag==2) /*if 语句 向后查找时,不需要执行下面语句*/
{
tok = tag ;
return token_type;
}
switch (tag)
{
case FN : if (tflag)
{
exec_fn();
token_type = NUMBER;
}
break;
case INKEY :
if (tflag)
{
exec_inkey();
token_type = QUOTE;
}
break;
case KBHIT :
if (tflag)
{
exec_kbhit();
token_type = BOOL_TYPE;
}
break;
case GETKEY:
if (tflag)
{
exec_getkey();
token_type = NUMBER;
}
break;
case LEFT :
exec_left();
token_type = QUOTE;
break;
case RIGHT:
exec_right();
token_type = QUOTE;
break;
case MID :
exec_mid();
token_type = QUOTE;
break;
default :
break;
}
if ( (token_type == QUOTE ||token_type == BOOL_TYPE) && signflag ) serror(0);
else if (signflag) add_type(token,signflag);
}
}
tok = tag;
return token_type; /*取字符串时,可能取出来是零,去掉此句,则下面语句将会出现错误判断,如mid(s,l,l)*/
}
if (*token==0) serror(0); /*为避免在取值时,如果什么都没取出来,则会出现死循环,如If语句中的get_token(2), 遇到 a% = a% + %i */
return token_type;
}
FAR void brealloc(char *s, char *p)
{
if ((s = (char *)MemAlloc(Strlen(p)+1))==(char *)Null) serror(1);
else
{
Strcpy(s,p);
*(s+Strlen(p)) = 0;
}
}
FAR char *get_token_last()
{
int l;
l = Strlen(token);
if ((*(token+l-1)!='$')&&(*(token+l-1)!='%')) return (char *)Null;
else return token+l-1;
}
FAR int isalpha(char c)
{
if (c>64&&c<91||c>96&&c<123) return 1;
else return 0;
}
FAR int isdigit(char c)
{
if (c>47&&c<58) return 1;
else return 0;
}
FAR char tolower(char c)
{
if (c>64&&c<91) return c+32;
else return c;
}
FAR void ckvar(char *s)
{
if (!isalpha(*s))
{
if (InputFlag) InputError = 1;
serror(42); /***变量名定义错误***/
}
while (*(++s)!=0)
{
if (isalpha(*s)||isdigit(*s)||(*s=='_')) continue;
if (*s=='('&&Strchr(s,')')) return;
if (Strchr("%$",*s)) {
if (*(s+1)=='('||*(s+1)==0) return;
else
{
if (InputFlag) InputError = 1;
serror(42);
}
}
if (InputFlag) InputError = 1;
serror(42);
}
}
FAR int isdelim(char c)
{
if(Strchr(";,+-<> */^=():",c)|| c==9 || c==0x0D || c==0||c==' ') return 1;
return 0;
}
FAR void skip_white()
{
while (*prog==' '||*prog=='\t') prog++;
}
FAR int iswhite(char c)
{
if(c==' '||c=='\t') return 1;
else return 0;
}
FAR char look_up(char *s)
{
int f, e, m, c, tag;
char *p;
tag = 0;
f = Strlen(s);
if (*(s + f - 1)=='$')
{
*(s + f - 1) = 0;
tag = 1;
}
if (*s == '-'||*s == '+') p = s + 1;
else p = s;
f = 0;
e = COMMANDNUMBER;
while (f<=e)
{
m = (f + e)/2;
if ((c = Stricmp(table[m],p)) == 0) return comtok[m];
if (c > 0) e = m - 1;
else f = m + 1;
}
if (tag) *(s + Strlen(s)) = '$';
return 0;
}
FAR void exec_put()
{
char *p, *value;
int filenum, i;
fsnode *q;
/* char *flag; */
q = fl;
get_next();
if (*token!='#') serror(47);
p = token+1;
while (*p != 0)
{
if (!isdigit(*p)) serror(47);
p++;
}
filenum = atoi(token+1);
while (q) {
if (q->filenum != filenum) q = q->next;
else break;
}
if (q == (fsnode*)Null||*(prog-1)!=',') serror(47);
do {
value = GetAllocBuf();
get_exp(value);
FileSeek(q->handle,0,FILESEEK_END);
switch (*value) {
case STRING_TYPE :
if (FileWrite(q->handle,_Far(value+1),Strlen(value+1)+1) != Strlen(value+1)+1)
{
PrjShowFileOperateError();
serror(52);
}
break;
case REAL_TYPE:
case INTEGER_TYPE:
i=atoi(value+1);
if (FileWrite(q->handle,_Far(&i),2) != 2)
{
PrjShowFileOperateError();
serror(52);
}
break;
/*************************************
case REAL_TYPE : double j=atof(value+1);
fwrite(&j,8,1,q->handle); break;
******************************************/
default : serror(47);
}
MemFree(value);
get_token(0);
if (*token==',') continue;
else if (tok!=EOL) serror(47);
} while (tok!=EOL);
}
FAR void exec_get()
{
bitnode *varptr;
char *p, *value, *flag, *value_tmp;
int filenum, readout1;
/* double readout2;*/
fsnode *q;
varptr = (bitnode*)Null;
q = fl;
get_next();
if (*token!='#') serror(48);
p = token + 1;
while (*p!=0)
{
if (!isdigit(*p)) serror(48);
p++;
}
filenum = atoi(token + 1);
while (q)
{
if (q->filenum!=filenum) q = q->next;
else break;
}
if (q == (fsnode*)Null||*(prog-1)!=',') serror(48);
do {
value_tmp = GetAllocBuf();
get_token(0);
flag = get_token_last();
/* if (flag!=(char *)Null) *flag = 0; */
varptr = (bitnode *)search_vartree(token);
if (varptr == (bitnode *)Null) serror(48);
switch (*varptr->value_addr)
{
case REAL_TYPE:
case INTEGER_TYPE :
FileRead(q->handle, _Far(&readout1), 2);
itoa(readout1, value_tmp, 10);
add_type(value_tmp, INTEGER_TYPE);
if ((value = (char *)MemAlloc(Strlen(value_tmp)+1))==(char*)Null) serror(1);
else
{
Strcpy(value,value_tmp);
*(value + Strlen(value)) = 0;
}
MemFree(varptr->value_addr);
varptr->value_addr = value;
break;
/**********************************
case REAL_TYPE: fread(&readout2,8,1,q->handle);
gcvt(readout2,10,value);
add_type(value,REAL_TYPE);
free(varptr->value_addr);
varptr->value_addr=value;
break;
***********************************/
case STRING_TYPE:
*value_tmp = STRING_TYPE;
p = value_tmp + 1;
FileRead(q->handle,_Far(p),1);
while (*p!=-1&&*p!=0)
{
p++;
FileRead(q->handle,_Far(p),1);
}
*p = 0;
if ((value = (char *)MemAlloc(Strlen(value_tmp)+1)) == (char*)Null) serror(1);
else {
Strcpy(value,value_tmp);
*(value + Strlen(value)) = 0;
}
MemFree(varptr->value_addr);
varptr->value_addr=value;
break;
default :
serror(48);
}
get_token(0);
if (*token == ',') continue;
else {
if (tok != EOL) serror(48);
}
} while (tok != EOL);
}
FAR void exec_swap()
{
bitnode *p1,*p2;
char *p;
*token = 0;
p1 = (bitnode *)Null;
p2 = (bitnode *)Null;
while (*prog==32) prog++;
if (*prog=='(') prog++;
get_token(0);
if (token_type!=VARIABLE) serror(11); /***表达式不可以参与swap操作***/
p1 = search_vartree(token);
if (p1==(bitnode *)Null) serror(10); /***变量没有定义或初使化***/
while (*prog==0x20) prog++;
if (*prog++ != ',') serror(11); /***swap语句出现语法错误***/
while (*prog==0x20) prog++;
get_token(0);
if (token_type!=VARIABLE) serror(11); /***表达式不可以参与swap操作***/
while (*prog!=0x0D&&*prog!=':') {
if (*prog++!=0x20) serror(11);
}
p2 = search_vartree(token);
if (p2==(bitnode *)Null) serror(10); /***变量没有定义或初使化***/
if (*p1->value_addr-*p2->value_addr>1||*p2->value_addr-*p1->value_addr>1) serror(12); /***swap语句交换的二变量的数据类型不一致***/
p = p1->value_addr;
p1->value_addr = p2->value_addr;
p2->value_addr = p;
find_eol();
}
FAR void exec_def()
{
char *varbuf, *expbuf, *tbuf, *varbuf_tmp, *key_tmp, *expbuf_tmp;
pfnode *p, *q;
while (*prog==32) prog++;
if (*prog!='f'&&*prog!='F'||*(prog+1)!='n'&&*(prog+1)!='N') serror(9); /***自定义函数定义过程中出现语法错误***/
prog += 2;
if (*prog!=32) serror(9);
while (*prog==32) prog++;
varbuf_tmp = GetAllocBuf(); /***varbuf_tmp存自定义函数的函数名***/
tbuf = varbuf_tmp;
while (*prog!='('&&*prog!=0x0d&&*prog!=0) *tbuf++ = *prog++;
if (*prog!='(') serror(9);
*tbuf = 0;
key_tmp = GetAllocBuf(); /***key_tmp存自定义函数的变量名***/
tbuf = key_tmp;
prog++;
while (*prog!=')'&&*prog!=0x0D) *tbuf++ = *prog++;
if (*prog++ != ')') serror(49);
*tbuf++ = 0;
if (Strchr(key_tmp,',')) serror(49);
ckvar(key_tmp);
while (*prog!='=') { /***自定义函数非法定义判定***/
if (*prog!=0x20) serror(49);
prog++;
}
expbuf_tmp = GetAllocBuf(); /***expbuf_tmp存自定义函数的具体内容***/
tbuf = expbuf_tmp;
prog++;
while (*prog!=0x0D&&*prog!=':') {
if ((*prog=='f'||*prog=='F')&&(*(prog+1)=='n'||*(prog+1)=='N')&&*(prog+2)==0x20&&
Strncmp(prog+3,varbuf_tmp,Strlen(varbuf_tmp))==0&&*(prog+3+Strlen(varbuf_tmp))=='(')
serror(49);
else if (*prog!=*key_tmp) *tbuf++ = *prog++;
else if (Strncmp(prog, key_tmp, Strlen(key_tmp))!=0) *tbuf++ = *prog++;
else if (isdigit(*(prog+Strlen(key_tmp)))||isalpha(*(prog+Strlen(key_tmp)))) *tbuf++ = *prog++;
else {
*tbuf++ = ',';
prog += Strlen(key_tmp);
}
}
*tbuf = 0;
if ((p=(pfnode *)MemAlloc(sizeof(pfnode)))==(pfnode *)Null) serror(1); /***内存溢出***/
if ((varbuf = (Int8*)MemAlloc(Strlen(varbuf_tmp)+1))==(Int8*)Null) { /***内存溢出***/
MemFree((Int8*)p);
serror(1); /***内存溢出***/
}
if ((expbuf = (Int8*)MemAlloc(Strlen(expbuf_tmp)+1))==(Int8*)Null) {
MemFree((Int8*)p);
MemFree(varbuf);
serror(1); /***内存溢出***/
}
Strcpy(varbuf,varbuf_tmp);
*(varbuf+Strlen(varbuf_tmp)) = 0;
Strcpy(expbuf,expbuf_tmp);
*(expbuf+Strlen(expbuf_tmp)) = 0;
p->var = varbuf;
p->exp = expbuf;
p->next = (pfnode *)Null;
if (pf==(pfnode *)Null) pf = p;
else {
q = pf;
if (Stricmp(q->var,p->var)==0) {
MemFree(p->var);
MemFree(p->exp);
MemFree((Int8*)p);
serror(50);
}
while (q->next!=(pfnode *)Null) {
if (Stricmp(q->var,p->var)==0) {
MemFree(p->var);
MemFree(p->exp);
MemFree((Int8*)p);
serror(50);
}
q = q->next;
}
q->next = p;
}
}
FAR char get_priority(char *s)
{
int c, f, e, m;
f = 0;
e = 37;
while (f<=e)
{
m = (f + e)/2;
if ((c = Stricmp(opsign[m],s))==0)
{
*s = opcod[m];
return opprior[m];
}
if (c > 0) e = m - 1;
else f = m + 1;
}
serror(43);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -