📄 impubasicview.cpp
字号:
int t;
for(t=0;t<NUM_LAB;++t)
label_table[t].name[0]='\0';
}
int CIMPUBasicView::find_label(CString s)//查找标号位置
{
int t;
for(t=0;t<NUM_LAB;++t)
{
int i=s.CompareNoCase(CString(label_table[t].name));
if(i==0)
{
return t;
break;
}
}
return -1;
}
int CIMPUBasicView::get_next_label(char *s)//取得标号位置
{
int t;
for(t=0;t<NUM_LAB;++t)
{
if(label_table[t].name[0]==0)
return t;
if(!strcmp(label_table[t].name,s))
return -2;
}
return -1;
}
void CIMPUBasicView::scan_labels()//建立标号表
{
int addr;
char*temp;
label_init();
temp=prog;
get_token();
if(token_type==NUMBER){
strcpy(label_table[0].name,token);
label_table[0].p=prog;
}
find_eol();
do{
get_token();
if(token_type==NUMBER){
addr=get_next_label(token);
if(addr==-1||addr==-2){
(addr==-1)?Error(5):Error(6);
}
strcpy(label_table[addr].name,token);
label_table[addr].p=prog;
}
if(tok!=EOL)find_eol();
}while(tok!=FINISHED);
prog=temp;
}
void CIMPUBasicView::gosub()//关键字gosub
{
int i;
get_token();
i=find_label(CString(token));
if(i<0)
Error(7);
else
{
gpush(prog);
prog=label_table[i].p;
}
}
void CIMPUBasicView::greturn()//关键字return
{
prog=gpop();
}
void CIMPUBasicView::gpush(char *s)//转子入栈
{
gstack1.AddTail(s);
}
char * CIMPUBasicView::gpop()//转子弹栈
{
if(gstack1.IsEmpty())
{
Error(12);
return "";
}
else
{
char *q=(char *)gstack1.RemoveTail();
return q;
}
}
void CIMPUBasicView::input()//输入函数
{
int i=0,var;
do
{
get_token();
if(token_type==QUOTE)
{
val_Edit1 += CString(token);
get_token();
if(*token!=',')
Error(1);
get_token();
}
else
{
val_Edit1 += "数据输入:?";
}
val_Edit1 += CString(token);
val_Edit1 += "\t";
var=toupper(*token)-'A';
CInputDlg dlg(val_Edit1);
if(dlg.DoModal()==IDOK)
i=dlg.GetData();
variables[var]=i;
char m_buf[40];
int m=sprintf(m_buf,"%d",i);
val_Edit1 += CString(m_buf);
val_Edit1 += "\r\n";
get_token();
}while(*token==';'||*token==',');
}
void CIMPUBasicView::exec_while()//关键字while
{
char *p,*q;
p=prog;
putback();
q=prog;
wpush(q);
prog=p;
int x,y,cond;
get_exp(&x);
get_token();
CString str1,str2;
str1=CString(token);
get_exp(&y);
cond=get_rel(x,str1,y);
if(!cond)
{
find_wend();
}
}
void CIMPUBasicView::wend()//关键字wend
{
prog=wpop();
}
void CIMPUBasicView::find_wend()//查找关键字wend
{
CString str,str1;
str1 = "wend";
int i=1;
do
{
get_token();
if(token_type==COMMAND)
{
if(tok==FINISHED)
{
Error(11);
break;
}
else
{
str = CString(token);
i=str.CompareNoCase(str1);
}
}
}while(i!=0);
wpop();
}
void CIMPUBasicView::wpush(char *s)//while循环入栈
{
wstack1.AddTail(s);
}
char * CIMPUBasicView::wpop()//while出栈
{
if(wstack1.IsEmpty())
{
Error(12);
return "";}
else
{
char *q=(char *)wstack1.RemoveTail();
return q;
}
}
void CIMPUBasicView::exec_else()//关键字else
{
CString str1 = "TRUE";
CString str2 = "MTRUE";
CString str = ifgettop();
int i=str.CompareNoCase(str1);
int j=str.CompareNoCase(str2);
if(i==0)
findendifelse();
else if(j==0)
findeolelse();
}
void CIMPUBasicView::exec_endif()//关键字endif
{
ifpop();
}
void CIMPUBasicView::findendifelse()//查找关键字else or endif
{
CString str,str1,str2;
str1 = "endif";
str2 = "else";
int i=1,j=1;
do
{
get_token();
if(token_type==COMMAND)
{
if(tok==FINISHED)
{
Error(15);
break;
}
else
{
str = CString(token);
i=str.CompareNoCase(str1);
j=str.CollateNoCase(str2);
}
}
}while((i!=0)&&(j!=0));
putback();
}
void CIMPUBasicView::ifpush(CString s)//if入栈
{
ifstack1.AddTail(s);
}
void CIMPUBasicView::ifpop()//if出栈
{
if(ifstack1.IsEmpty())
{
Error(14);
}
else
{
CString str = (CString)ifstack1.RemoveTail();
}
}
CString CIMPUBasicView::ifgettop()//取if栈顶元素
{
if(ifstack1.IsEmpty())
{
Error(13);
return "FALSE";
}
else
{
CString str = (CString)ifstack1.GetTail();
return str;
}
}
void CIMPUBasicView::rem()//注释函数
{
find_eol();
}
void CIMPUBasicView::exec_do()//关键字do
{
char *p,*q;
p=prog;
putback();
q=prog;
dpush(q);
prog=p;
get_token();
if(token_type==COMMAND)
{
CString str1 = "while";
CString str2 = "until";
CString str = CString(token);
int i=str.CompareNoCase(str1);
int j=str.CompareNoCase(str2);
if(i==0)//dowhile-loop
{
int x,y,cond;
get_exp(&x);
get_token();
CString str1,str2;
str1=CString(token);
get_exp(&y);
cond=get_rel(x,str1,y);
if(!cond)
{
exitdo();
}
}
if(j==0)//dountil-loop
{
int x,y,cond;
get_exp(&x);
get_token();
CString str1,str2;
str1=CString(token);
get_exp(&y);
cond=get_rel(x,str1,y);
if(cond)
{
exitdo();
}
}
}
else
putback();
}
void CIMPUBasicView::exec_loop()//关键字loop
{
get_token();
if(token_type==COMMAND)
{
CString str1 = "while";
CString str2 = "until";
CString str = CString(token);
int i=str.CompareNoCase(str1);
int j=str.CompareNoCase(str2);
if(i==0)//do-loopwhile
{
int x,y,cond;
get_exp(&x);
get_token();
CString str1,str2;
str1=CString(token);
get_exp(&y);
cond=get_rel(x,str1,y);
if(!cond)
{
dpop();
find_eol();
}
else
prog=dpop();
}
if(j==0)//do-loopuntil
{
int x,y,cond;
get_exp(&x);
get_token();
CString str1,str2;
str1=CString(token);
get_exp(&y);
cond=get_rel(x,str1,y);
if(cond)
{
dpop();
find_eol();
}
else
prog=dpop();
}
}
else
{
putback();
prog=dpop();
}
}
void CIMPUBasicView::exitdo()//关键字exitdo
{
findloop();
find_eol();
}
void CIMPUBasicView::dpush(char *s)//do入栈
{
dstack1.AddTail(s);
}
char * CIMPUBasicView::dpop()//do出栈
{
if(dstack1.IsEmpty())
{
Error(16);
return "";}
else
{
char *q=(char *)dstack1.RemoveTail();
return q;
}
}
void CIMPUBasicView::findloop()//查找loop
{
CString str,str1;
str1 = "loop";
int i=1;
do
{
get_token();
if(token_type==COMMAND)
{
if(tok==FINISHED)
{
Error(17);
break;
}
else
{
str = CString(token);
i=str.CompareNoCase(str1);
}
}
}while(i!=0);
dpop();
}
void CIMPUBasicView::exec_select()//关键字select
{
get_token();
CString str1 = "case",str2 = "endselect",str3 = "TRUE";
CString str = CString(token);
int i = str.CompareNoCase(str1);
if(i!=0)
{
Error(0);
return;
}
get_token();
if(token_type!=VARIABLE)
{
Error(0);
return;
}
else
{
putback();
int x;
get_exp(&x);
casenode *p = new casenode;
p->n=x;
spush(p);
cpush(str3);
gonextcase();
}
}
void CIMPUBasicView::exec_case()//关键字case
{
int p,cond;
CString str = getctop();
CString str1 = "TRUE";
int i=str.CompareNoCase(str1);
if(i==0)
{
int x;
get_token();
if(token_type==COMMAND)
{
int j=CString(token).CompareNoCase("else");
int m=CString(token).CompareNoCase("is");
if(m==0)
{
get_token();
CString str3 = CString(token);
get_exp(&x);
cond=get_rel(getstop(),str3,x);
if(cond==1)
{
cpop();
CString str2 = "FALSE";
cpush(str2);
}
else
gonextcase();
}
else
{
if(j!=0)
Error(0);
else
return;
}
}
else
{
putback();
get_exp(&x);
get_token();
if(tok==TO)
{
int z;
get_exp(&z);
if((getstop()>=x)&&(getstop()<=z))
{
cpop();
CString str2 = "FALSE";
cpush(str2);
}
else
gonextcase();
}
else
{
putback();
p=getstop();
if(x!=p)
gonextcase();
else
{
cpop();
CString str2 = "FALSE";
cpush(str2);
}
}
}
}
else
gonextcase();
}
void CIMPUBasicView::gonextcase()//寻找下一个case or endselect
{
int i=1,j=1;
CString str1 = "case",str2 = "endselect";
do
{
get_token();
CString str = CString(token);
i = str.CompareNoCase(str1);
j = str.CompareNoCase(str2);
}while(i!=0&&j!=0);
putback();
}
void CIMPUBasicView::endselect()//关键字caseselect
{
spop();
cpop();
}
void CIMPUBasicView::spush(casenode *s)//select入栈
{
slestack1.AddTail(s);
}
void CIMPUBasicView::spop()//select出栈
{
if(slestack1.IsEmpty())
{
Error(18);
}
else
{
casenode *str = (casenode *)slestack1.RemoveTail();
}
}
int CIMPUBasicView::getstop()//取select栈顶元素
{
if(slestack1.IsEmpty())
{
Error(18);
return 0;
}
else
{
casenode *str = (casenode *)slestack1.GetTail();
return str->n;
}
}
void CIMPUBasicView::cpush(CString s)//case入栈
{
casestack1.AddTail(s);
}
void CIMPUBasicView::cpop()//case出栈
{
if(casestack1.IsEmpty())
{
Error(18);
}
else
{
CString str = (CString)casestack1.RemoveTail();
}
}
CString CIMPUBasicView::getctop()//取case栈顶元素
{
if(casestack1.IsEmpty())
{
Error(18);
return "FALSE";
}
else
{
CString str = (CString)casestack1.GetTail();
return str;
}
}
void CIMPUBasicView::findeolelse()//寻找小if的else或结尾
{
CString str,str1;
str1 = "else";
int i=1,j=1;
do
{
get_token();
if(tok==FINISHED)
{
Error(15);
break;
}
else
{
if(token_type==COMMAND)
{
str = CString(token);
i=str.CompareNoCase(str1);
}
}
}while((i!=0)&&*token!='\r');
putback();
}
int CIMPUBasicView::get_rel(int x, CString op, int y)//关系运算
{
int cond=0,oper=0;
int i1=op.CompareNoCase("<");
int i2=op.CompareNoCase(">");
int i3=op.CompareNoCase("=");
int i4=op.CompareNoCase(">=");
int i5=op.CompareNoCase("<=");
int i6=op.CompareNoCase("<>");
if(i1==0)
oper=1;
else if(i2==0)
oper=2;
else if(i3==0)
oper=3;
else if(i4==0)
oper=4;
else if(i5==0)
oper=5;
else if(i6==0)
oper=6;
else
{
oper=0;
Error(0);
}
switch(oper)
{
case 1:
if(x<y)cond=1; break;
case 2:
if(x>y)cond=1; break;
case 3:
if(x==y)cond=1; break;
case 4:
if(x>=y)cond=1; break;
case 5:
if(x<=y)cond=1; break;
case 6:
if(x!=y)cond=1; break;
default: cond=0;
}
return cond;
}
void CIMPUBasicView::exec_stop()//关键字stop
{
CStopDlg dlg(val_Edit1);
dlg.DoModal();
}
void CIMPUBasicView::exec_on()//关键字on-goto/gosub
{
int x,i,j,p,m=1;
CString str = "goto";
CString str1 = "gosub";
get_exp(&x);
if(x<1)
find_eol();
else
{
get_token();
j=CString(token).CompareNoCase(str);
p=CString(token).CompareNoCase(str1);
if(j==0)//on-goto
{
for(i=0;(i<2*x-1);i++)
{
get_token();
if(tok==FINISHED||*token=='\r')
{
m=0;
break;
}
}
if(m!=0)
{
putback();
exec_goto();
}
}
else if(p==0)//on-gosub
{
for(i=0;(i<2*x-1);i++)
{
get_token();
if(tok==FINISHED||*token=='\r')
{
m=0;
break;
}
}
if(m!=0)
{
putback();
gosub();
}
}
else
return;
}
}
int CIMPUBasicView::get_logic(int x, CString op, int y)
{
int cond=0,oper=0;
int i1=op.CompareNoCase("and");
int i2=op.CompareNoCase("or");
int i3=op.CompareNoCase("not");
if(i1==0)
oper=1;
else if(i2==0)
oper=2;
else if(i3==0)
oper=3;
else
{
oper=0;
Error(0);
}
switch(oper)
{
case 1:
if((x!=0)&&(y!=0))cond=1; break;
case 2:
if((x!=0)||(y!=0))cond=1; break;
case 3:
if(y==0)cond=1; break;
default: cond=0;
}
return cond;
}
int CIMPUBasicView::get_logic1(CString op, int y)
{
int cond=0,oper=0;
int i=op.CompareNoCase("not");
if(i==0)
if(y==0)
cond=1;
return cond;
}
void CIMPUBasicView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
int i=80;
CMainFrame *pm=(CMainFrame *)AfxGetMainWnd();
CStatusBar *psb = &pm->m_wndStatusBar;
CString str,str1;
if(psb)
{
str.Format("行:%d",point.y/20+1);
str += "\t";
str1.Format("列:%d",point.x/6+1);
str += str1;
psb->SetPaneText(psb->CommandToIndex(ID_INDICSTOR_ROW),str);
}
CEditView::OnMouseMove(nFlags, point);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -