昨天干了一晚上的調(diào)試工作,這嵌套if可是真的煩。 首先先報(bào)告一些昨天的錯(cuò)誤。(貌似昨天做的棧整個(gè)全部是錯(cuò)的)不運(yùn)行不知道,一運(yùn)行嚇一跳。 這才是真正正確的代碼。結(jié)構(gòu)體指針的引用不可以用“.“,用的是箭頭運(yùn)算符”->“。并且,malloc分配的數(shù)據(jù)不會(huì)自動(dòng)清零,不想再加memset了,直接calloc不就好了。 我們先加兩個(gè)變量。 然后是get_nowif函數(shù)。這個(gè)函數(shù)用來(lái)判斷現(xiàn)在if狀態(tài),到底是否執(zhí)行接下來(lái)的代碼。(if不成立就不執(zhí)行) 如果之前有一個(gè)條件不成立,接下來(lái)的東西就不執(zhí)行,是“且”的關(guān)系。 同樣,如果nowif為0,我們需要在main里面特殊判斷。 我們首先需要把棧初始化,然后往棧里面放入1,nowif也是1,表示如果沒(méi)有特殊情況就是執(zhí)行。然后,我們按照之前說(shuō)過(guò)的方法,對(duì)棧進(jìn)行操作。當(dāng)然,不執(zhí)行里面的代碼,直接跳轉(zhuǎn)到結(jié)束位置,這是因?yàn)閚owif是0,說(shuō)明條件不成立。 end是在循環(huán)最后的地方。 然后,如果nowif不為0,應(yīng)該往下執(zhí)行到這里。同樣,我們對(duì)棧進(jìn)行操作。每次操作后,需要get_nowif()一下。 完。(話說(shuō)這段代碼看上去很容易,實(shí)際調(diào)試我用了差不多一個(gè)小時(shí)。) 附上完整代碼: - #include<bits/stdc++.h>
- #include"stack.h"
- using namespace std;
- char s[100];
- int endifs=0;
- ifstream cons("CON");
- struct STACK ifstack;
- int nowif;
- struct VALUE{
- char name[30];//變量名
- int type;//類(lèi)型,0表示int,1表示string
- int vnum;//int類(lèi)型的數(shù)值
- char vstring[255];//string類(lèi)型
- };
- int value_ptr=0;
- struct VALUE value[1000];
- void get_word(char *s){//讀入單詞
- scanf("%s",s);
- }
- void get_string(char *s){
- int i=0,flag=0;
- for(i=0;i<100;i++){
- next:
- s[i]=getchar();
- if(flag==0 && s[i]==' ')goto next;
- else flag=1;
- if(s[i]=='\n')break;
- }
- s[i]='\0';//結(jié)束掉字符串
- }
- void error(){
- cout<<"Error in program.\n";
- exit(0);//退出程序
- }
- int isnumber(const char *s){
- for(int i=0;i<strlen(s);i++)
- if(s[i]<='0' || s[i]>='9')return 0;//不是數(shù)字字符
- return 1;
- }
- int isvalue(const char *s){
- for(int i=0;i<value_ptr;i++){
- if(strcmp(value[i].name,s)==0)return 1;
- }
- return 0;
- }
- int getpos(const char *vname){
- for(int i=0;i<value_ptr;i++){
- if(strcmp(value[i].name,vname)==0)return i;//下標(biāo)
- }
- return -1;//未找到
- }
- void put_value(const char *name){
- int i=getpos(name);
- if(i==-1)error();
- if(value[i].type==0)printf("%d",value[i].vnum);
- else printf("%s",value[i].vstring);
- }
- int getnum_sub(const char *s){
- if(isvalue(s))return value[getpos(s)].vnum;//是變量
- int i;
- sscanf(s,"%d",&i);
- return i;//是數(shù)字
- }
- int getnum(const char *s){
- if(strcmp(s,"input()")==0){
-
- int n;
- cons>>n;
- return n;
- }
- char *p;
- char op;
- for(p=(char*)s;*p!='+'&&*p!='-'&&*p!='*'&&*p!='/'&&*p!='\0'&&*p!='>'&&*p!='<'&&*p!='=';p++);//找到運(yùn)算符
- if(*p=='\0')return getnum_sub(s);//只有一個(gè)數(shù)的情況
- op=*p;*p='\0';//第一個(gè)數(shù)字到運(yùn)算符結(jié)束
- char s1[100],s2[100];
- int n1,n2;
- strcpy(s1,s);strcpy(s2,p+1);
- n1=getnum_sub(s1);n2=getnum_sub(s2);
- if(op=='+')return n1+n2;
- else if(op=='-')return n1-n2;
- else if(op=='*')return n1*n2;
- else if(op=='/')return n1/n2;
- else if(op=='>')return n1>n2;
- else if(op=='<')return n1<n2;
- else if(op=='=')return n1==n2;
- }
- int get_nowif(){
- nowif=1;
- for(int i=0;i<=ifstack.top;i++){
- if(ifstack.num[i]==0)nowif=0;
- }
- return nowif;
- }
- int main(int argc,char** argv){
- if(argc!=2){//有一個(gè)要解釋的文件參數(shù)
- cout<<"Cannot find source file.\n";
- return 0;
- }
- freopen(argv[1],"r",stdin);
- init_stack(64,&ifstack);
- ifstack.num[0]=1;
- nowif=1;
- for(;;){
- get_word(s);
- get_nowif();
- if(nowif==0){
- if(strcmp(s,"if")==0){
- char sa[255];
- get_word(sa);
- int a=getnum(sa);//cout<<a<<endl;
- push_stack(&ifstack,a);
- get_nowif();
- }
- else if(strcmp(s,"endif")==0){
- pop_stack(&ifstack);
- get_nowif();
- }
- goto end;
- }
- if(strcmp(s,"/*")==0){//是注釋
- while(strcmp(s,"*/")!=0)get_word(s);//直到注釋的末尾標(biāo)記
- }
- else if(strcmp(s,"print")==0){//調(diào)用print輸出
- get_string(s);
- if(isnumber(s))cout<<s;
- else if(s[0]=='\"' && s[strlen(s)-1]=='\"'){
- for(int i=1;i<strlen(s)-1;i++){
- if(s[i]=='\\' && s[i+1]=='n'){
- printf("\n");i++;
- }
- else printf("%c",s[i]);
- }
- }
- else if(isvalue(s)){
- put_value(s);
- }
- else error();
- }
- else if(strcmp(s,"exit")==0){//退出程序
- return 0;
- }
- else if(strcmp(s,"dim")==0){//聲明變量
- char sa[255],sb[255],sc[255];
- get_word(sa);get_word(sb);get_word(sc);
- if(strcmp(sb,"as")!=0)error();
- strcpy(value[value_ptr].name,sa);
- if(strcmp(sc,"int")==0)value[value_ptr].type=0;
- else if(strcmp(sc,"string")==0)value[value_ptr].type=1;
- else error();
- value_ptr++;
- }
- else if(isvalue(s)){//變量的賦值語(yǔ)句
- char sa[255],sb[255];
- get_word(sa);
- if(value[getpos(s)].type==1)get_string(sb);
- else get_word(sb);
- if(strcmp(sa,"=")!=0)error();
- if(value[getpos(s)].type==0)value[getpos(s)].vnum=getnum(sb);
- else {
- sb[strlen(sb)-1]='\0';//去掉最后的雙引號(hào)
- strcpy(value[getpos(s)].vstring,sb+1);//復(fù)制的時(shí)候去掉前面的雙引號(hào)
- }
- }
- else if(strcmp(s,"if")==0){
- endifs++;
- char sa[255];
- get_word(sa);
- int a=getnum(sa);//cout<<a<<endl;
- push_stack(&ifstack,a);
- get_nowif();
- }
- else if(strcmp(s,"endif")==0){
- pop_stack(&ifstack);get_nowif();
- }
- else{
- error();
- }
- end:
- continue;
- }
- }
|