【原创】自制编程语言-9 嵌套if语句(2)
昨天干了一晚上的调试工作,这嵌套if可是真的烦。
首先先报告一些昨天的错误。(貌似昨天做的栈整个全部是错的)不运行不知道,一运行吓一跳。
这才是真正正确的代码。结构体指针的引用不可以用“.“,用的是箭头运算符”->“。并且,malloc分配的数据不会自动清零,不想再加memset了,直接calloc不就好了。
我们先加两个变量。
然后是get_nowif函数。这个函数用来判断现在if状态,到底是否执行接下来的代码。(if不成立就不执行)
如果之前有一个条件不成立,接下来的东西就不执行,是“且”的关系。
同样,如果nowif为0,我们需要在main里面特殊判断。
我们首先需要把栈初始化,然后往栈里面放入1,nowif也是1,表示如果没有特殊情况就是执行。然后,我们按照之前说过的方法,对栈进行操作。当然,不执行里面的代码,直接跳转到结束位置,这是因为nowif是0,说明条件不成立。
end是在循环最后的地方。
然后,如果nowif不为0,应该往下执行到这里。同样,我们对栈进行操作。每次操作后,需要get_nowif()一下。
完。(话说这段代码看上去很容易,实际调试我用了差不多一个小时。)
附上完整代码:
- #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;//类型,0表示int,1表示string
- int vnum;//int类型的数值
- char vstring[255];//string类型
- };
- 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';//结束掉字符串
- }
- 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;//不是数字字符
- 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;//下标
- }
- 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;//是数字
- }
- 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++);//找到运算符
- if(*p=='\0')return getnum_sub(s);//只有一个数的情况
- op=*p;*p='\0';//第一个数字到运算符结束
- 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){//有一个要解释的文件参数
- 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);//直到注释的末尾标记
- }
- else if(strcmp(s,"print")==0){//调用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)){//变量的赋值语句
- 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';//去掉最后的双引号
- strcpy(value[getpos(s)].vstring,sb+1);//复制的时候去掉前面的双引号
- }
- }
- 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;
- }
- }
赞 (0)