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

昨天干了一晚上的调试工作,这嵌套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. int n;
  67. cons>>n;
  68. return n;
  69. }
  70. char *p;
  71. char op;
  72. for(p=(char*)s;*p!='+'&&*p!='-'&&*p!='*'&&*p!='/'&&*p!='\0'&&*p!='>'&&*p!='<'&&*p!='=';p++);//找到运算符
  73. if(*p=='\0')return getnum_sub(s);//只有一个数的情况
  74. op=*p;*p='\0';//第一个数字到运算符结束
  75. char s1[100],s2[100];
  76. int n1,n2;
  77. strcpy(s1,s);strcpy(s2,p+1);
  78. n1=getnum_sub(s1);n2=getnum_sub(s2);
  79. if(op=='+')return n1+n2;
  80. else 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. }
  87. int get_nowif(){
  88. nowif=1;
  89. for(int i=0;i<=ifstack.top;i++){
  90. if(ifstack.num[i]==0)nowif=0;
  91. }
  92. return nowif;
  93. }
  94. int main(int argc,char** argv){
  95. if(argc!=2){//有一个要解释的文件参数
  96. cout<<"Cannot find source file.\n";
  97. return 0;
  98. }
  99. freopen(argv[1],"r",stdin);
  100. init_stack(64,&ifstack);
  101. ifstack.num[0]=1;
  102. nowif=1;
  103. for(;;){
  104. get_word(s);
  105. get_nowif();
  106. if(nowif==0){
  107. if(strcmp(s,"if")==0){
  108. char sa[255];
  109. get_word(sa);
  110. int a=getnum(sa);//cout<<a<<endl;
  111. push_stack(&ifstack,a);
  112. get_nowif();
  113. }
  114. else if(strcmp(s,"endif")==0){
  115. pop_stack(&ifstack);
  116. get_nowif();
  117. }
  118. goto end;
  119. }
  120. if(strcmp(s,"/*")==0){//是注释
  121. while(strcmp(s,"*/")!=0)get_word(s);//直到注释的末尾标记
  122. }
  123. else if(strcmp(s,"print")==0){//调用print输出
  124. get_string(s);
  125. if(isnumber(s))cout<<s;
  126. else if(s[0]=='\"' && s[strlen(s)-1]=='\"'){
  127. for(int i=1;i<strlen(s)-1;i++){
  128. if(s[i]=='\\' && s[i+1]=='n'){
  129. printf("\n");i++;
  130. }
  131. else printf("%c",s[i]);
  132. }
  133. }
  134. else if(isvalue(s)){
  135. put_value(s);
  136. }
  137. else error();
  138. }
  139. else if(strcmp(s,"exit")==0){//退出程序
  140. return 0;
  141. }
  142. else if(strcmp(s,"dim")==0){//声明变量
  143. char sa[255],sb[255],sc[255];
  144. get_word(sa);get_word(sb);get_word(sc);
  145. if(strcmp(sb,"as")!=0)error();
  146. strcpy(value[value_ptr].name,sa);
  147. if(strcmp(sc,"int")==0)value[value_ptr].type=0;
  148. else if(strcmp(sc,"string")==0)value[value_ptr].type=1;
  149. else error();
  150. value_ptr++;
  151. }
  152. else if(isvalue(s)){//变量的赋值语句
  153. char sa[255],sb[255];
  154. get_word(sa);
  155. if(value[getpos(s)].type==1)get_string(sb);
  156. else get_word(sb);
  157. if(strcmp(sa,"=")!=0)error();
  158. if(value[getpos(s)].type==0)value[getpos(s)].vnum=getnum(sb);
  159. else {
  160. sb[strlen(sb)-1]='\0';//去掉最后的双引号
  161. strcpy(value[getpos(s)].vstring,sb+1);//复制的时候去掉前面的双引号
  162. }
  163. }
  164. else if(strcmp(s,"if")==0){
  165. endifs++;
  166. char sa[255];
  167. get_word(sa);
  168. int a=getnum(sa);//cout<<a<<endl;
  169. push_stack(&ifstack,a);
  170. get_nowif();
  171. }
  172. else if(strcmp(s,"endif")==0){
  173. pop_stack(&ifstack);get_nowif();
  174. }
  175. else{
  176. error();
  177. }
  178. end:
  179. continue;
  180. }
  181. }
(0)

相关推荐

  • VS2019的调试功能学习(烫烫烫)

    我编写了个大数减法的程序但是会出现很奇怪的报错,然后我就一路百度... 现在我们尝试对以下代码用VS2019进行调试修改bug: //源文件main.cpp #include<stdio.h&g ...

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

    今天我们继续if语句的制作.在开始之前,我们先来分析一下. 我们可以用一个变量存放当前if的值.如果当前if为0,我们不执行任何东西,直到endif使得当前if为1.事实上,如果是嵌套的if,我们同样 ...

  • 【原创】自制编程语言-7 注释&if语句初步

    这次我们尝试制作注释的功能.注释是几乎所有编程语言都有的功能.不同语言的注释符号也不尽相同.汇编语言的注释符号为":".C++的注释符号为"//".PYTHON ...

  • 【原创】自制编程语言-6 输入语句

    现在我们的编程语言功能越来越多了,干劲也更足了,趁着这势头,我们继续写下去吧.这次我们来尝试编写输入语句.有了一个功能,加上运算符,我们就可以实现A+B问题了,真不错.输入语句的样式用很多,例如: C ...

  • 【原创】自制编程语言-8 if语句

    隔了几天,我们继续.上次说的get_string的问题,暂时放在一边,我们到时候会专门开一章做修改的. 今天我们的目标是if语句,这还是有点难度的,尤其是嵌套if语句,现在笔者已经不知道怎么去做了.算 ...

  • 【原创】自制编程语言-1 最小编程语言

    一开始,不要想的太难,从最简单的开始,一点一点添加功能,到最后,你就会发现,结果就很像是一个完整的编程语言了. 首先,我们先抛开一切问题,先说说如何对这个编程语言进行编译或是解释.用编译型的语言实在是 ...

  • 【原创】自制编程语言-2 添加新功能

    现在我们可以添加一些新功能了.首先,我们现在的print无法输出换行,所以,我们需要增加一个转义字符\n来进行换行. else if(s[0]=='\"' && s[strl ...

  • 【原创】自制编程语言-3 变量定义

    这一次,我们来尝试制作变量.变量是基本上所有编程语言都有的功能.为了编辑起来方便,这里我制作的编程语言就必须先声明再使用,否则在赋值语句的时候可能会很麻烦. 定义变量的语句,每一个编程语言都是有不同的 ...

  • 【原创】自制编程语言-4 变量的输出

    这次我们来输出变量.输出变量需要两个函数,判断字符串是否为变量名,以及根据type来输出变量. int isvalue(const char *s){ for(int i=0;i<value_p ...

  • 【原创】自制编程语言-5 变量的赋值(1)

    首先我们先看这个函数: void put_value(const char *name){ for(int i=0;i<value_ptr;i++){ if(strcmp(value[i].na ...