分享

【原创】自制编程语言-9 嵌套if语句(2)

 计算机知识杂谈 2021-07-01
昨天干了一晚上的调试工作,这嵌套if可是真的烦。
首先先报告一些昨天的错误。(貌似昨天做的栈整个全部是错的)不运行不知道,一运行吓一跳。
这才是真正正确的代码。结构体指针的引用不可以用“.“,用的是箭头运算符”->“。并且,malloc分配的数据不会自动清零,不想再加memset了,直接calloc不就好了。
我们先加两个变量。
然后是get_nowif函数。这个函数用来判断现在if状态,到底是否执行接下来的代码。(if不成立就不执行)
如果之前有一个条件不成立,接下来的东西就不执行,是“且”的关系。
同样,如果nowif为0,我们需要在main里面特殊判断。
我们首先需要把栈初始化,然后往栈里面放入1,nowif也是1,表示如果没有特殊情况就是执行。然后,我们按照之前说过的方法,对栈进行操作。当然,不执行里面的代码,直接跳转到结束位置,这是因为nowif是0,说明条件不成立。
end是在循环最后的地方。
然后,如果nowif不为0,应该往下执行到这里。同样,我们对栈进行操作。每次操作后,需要get_nowif()一下。
完。(话说这段代码看上去很容易,实际调试我用了差不多一个小时。)
附上完整代码:
  1. #include<bits/stdc++.h>    
  2. #include"stack.h"  
  3. using namespace std;    
  4. char s[100];    
  5. int endifs=0;  
  6. ifstream cons("CON");   
  7. struct STACK ifstack;   
  8. int nowif;  
  9. struct VALUE{    
  10.     char name[30];//变量名    
  11.     int type;//类型,0表示int,1表示string    
  12.     int vnum;//int类型的数值    
  13.     char vstring[255];//string类型    
  14. };    
  15. int value_ptr=0;    
  16. struct VALUE value[1000];    
  17. void get_word(char *s){//读入单词    
  18.     scanf("%s",s);    
  19. }    
  20. void get_string(char *s){    
  21.     int i=0,flag=0;    
  22.     for(i=0;i<100;i++){    
  23. next:    
  24.         s[i]=getchar();    
  25.         if(flag==0 && s[i]==' ')goto next;    
  26.         else flag=1;    
  27.         if(s[i]=='\n')break;    
  28.     }    
  29.     s[i]='\0';//结束掉字符串    
  30. }    
  31. void error(){    
  32.     cout<<"Error in program.\n";    
  33.     exit(0);//退出程序    
  34. }    
  35. int isnumber(const char *s){    
  36.     for(int i=0;i<strlen(s);i++)    
  37.         if(s[i]<='0' || s[i]>='9')return 0;//不是数字字符    
  38.     return 1;    
  39. }    
  40. int isvalue(const char *s){    
  41.     for(int i=0;i<value_ptr;i++){    
  42.         if(strcmp(value[i].name,s)==0)return 1;    
  43.     }    
  44.     return 0;    
  45. }    
  46. int getpos(const char *vname){    
  47.     for(int i=0;i<value_ptr;i++){    
  48.         if(strcmp(value[i].name,vname)==0)return i;//下标    
  49.     }    
  50.     return -1;//未找到    
  51. }    
  52. void put_value(const char *name){    
  53.     int i=getpos(name);    
  54.     if(i==-1)error();    
  55.     if(value[i].type==0)printf("%d",value[i].vnum);    
  56.     else printf("%s",value[i].vstring);    
  57. }    
  58. int getnum_sub(const char *s){    
  59.     if(isvalue(s))return value[getpos(s)].vnum;//是变量    
  60.     int i;    
  61.     sscanf(s,"%d",&i);    
  62.     return i;//是数字    
  63. }    
  64. int getnum(const char *s){    
  65.     if(strcmp(s,"input()")==0){    
  66.             
  67.         int n;    
  68.         cons>>n;    
  69.         return n;    
  70.     }    
  71.     char *p;    
  72.     char op;    
  73.     for(p=(char*)s;*p!='+'&&*p!='-'&&*p!='*'&&*p!='/'&&*p!='\0'&&*p!='>'&&*p!='<'&&*p!='=';p++);//找到运算符    
  74.     if(*p=='\0')return getnum_sub(s);//只有一个数的情况     
  75.     op=*p;*p='\0';//第一个数字到运算符结束    
  76.     char s1[100],s2[100];    
  77.     int n1,n2;    
  78.     strcpy(s1,s);strcpy(s2,p+1);    
  79.     n1=getnum_sub(s1);n2=getnum_sub(s2);    
  80.     if(op=='+')return n1+n2;    
  81.     else if(op=='-')return n1-n2;    
  82.     else if(op=='*')return n1*n2;    
  83.     else if(op=='/')return n1/n2;    
  84.     else if(op=='>')return n1>n2;  
  85.     else if(op=='<')return n1<n2;  
  86.     else if(op=='=')return n1==n2;  
  87. }    
  88. int get_nowif(){  
  89.     nowif=1;  
  90.     for(int i=0;i<=ifstack.top;i++){  
  91.         if(ifstack.num[i]==0)nowif=0;  
  92.     }  
  93.     return nowif;  
  94. }  
  95. int main(int argc,char** argv){    
  96.     if(argc!=2){//有一个要解释的文件参数    
  97.         cout<<"Cannot find source file.\n";    
  98.         return 0;    
  99.     }    
  100.     freopen(argv[1],"r",stdin);    
  101.     init_stack(64,&ifstack);  
  102.     ifstack.num[0]=1;  
  103.     nowif=1;  
  104.     for(;;){    
  105.         get_word(s);  
  106.         get_nowif();  
  107.         if(nowif==0){  
  108.             if(strcmp(s,"if")==0){  
  109.                 char sa[255];  
  110.                 get_word(sa);  
  111.                 int a=getnum(sa);//cout<<a<<endl;  
  112.                 push_stack(&ifstack,a);  
  113.                 get_nowif();  
  114.             }  
  115.             else if(strcmp(s,"endif")==0){  
  116.                 pop_stack(&ifstack);  
  117.                 get_nowif();  
  118.             }  
  119.             goto end;  
  120.         }  
  121.         if(strcmp(s,"/*")==0){//是注释  
  122.             while(strcmp(s,"*/")!=0)get_word(s);//直到注释的末尾标记  
  123.         }  
  124.         else if(strcmp(s,"print")==0){//调用print输出    
  125.             get_string(s);    
  126.             if(isnumber(s))cout<<s;    
  127.             else if(s[0]=='\"' && s[strlen(s)-1]=='\"'){    
  128.                 for(int i=1;i<strlen(s)-1;i++){    
  129.                     if(s[i]=='\\' && s[i+1]=='n'){    
  130.                         printf("\n");i++;    
  131.                     }    
  132.                     else printf("%c",s[i]);    
  133.                 }    
  134.             }    
  135.             else if(isvalue(s)){    
  136.                 put_value(s);    
  137.             }    
  138.             else error();    
  139.         }    
  140.         else if(strcmp(s,"exit")==0){//退出程序    
  141.             return 0;    
  142.         }    
  143.         else if(strcmp(s,"dim")==0){//声明变量    
  144.             char sa[255],sb[255],sc[255];    
  145.             get_word(sa);get_word(sb);get_word(sc);    
  146.             if(strcmp(sb,"as")!=0)error();    
  147.             strcpy(value[value_ptr].name,sa);    
  148.             if(strcmp(sc,"int")==0)value[value_ptr].type=0;    
  149.             else if(strcmp(sc,"string")==0)value[value_ptr].type=1;    
  150.             else error();    
  151.             value_ptr++;    
  152.         }    
  153.         else if(isvalue(s)){//变量的赋值语句    
  154.             char sa[255],sb[255];    
  155.             get_word(sa);  
  156.             if(value[getpos(s)].type==1)get_string(sb);    
  157.             else get_word(sb);  
  158.             if(strcmp(sa,"=")!=0)error();    
  159.             if(value[getpos(s)].type==0)value[getpos(s)].vnum=getnum(sb);    
  160.             else {    
  161.                 sb[strlen(sb)-1]='\0';//去掉最后的双引号    
  162.                 strcpy(value[getpos(s)].vstring,sb+1);//复制的时候去掉前面的双引号    
  163.             }    
  164.         }    
  165.         else if(strcmp(s,"if")==0){  
  166.             endifs++;  
  167.             char sa[255];  
  168.             get_word(sa);  
  169.             int a=getnum(sa);//cout<<a<<endl;  
  170.             push_stack(&ifstack,a);  
  171.             get_nowif();  
  172.         }  
  173.         else if(strcmp(s,"endif")==0){  
  174.             pop_stack(&ifstack);get_nowif();  
  175.         }  
  176.         else{    
  177.             error();    
  178.         }    
  179. end:  
  180.         continue;  
  181.     }    
  182. }  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约