最简单的解析器.

#include <常用>
枚 类型{整数,加减,乘除,尾巴};

构 令牌{//有个尾巴类型
    类型 a;整 b=0;符 c;
    令牌(){a=尾巴;}
    显 令牌(符 d){
        静 串无符 加符{"+-"},乘符{"*/"};
        c=d;(加符.(d)){a=加减;;}(乘符.(d)){a=乘除;;}
        打印("不支持",d);
    }
    显 令牌(整 d){b=d;a=整数;}
};
//+-/*,等为操作符
//不符号规定就退出,
构 造流{//用入啊,全局好用些
    向量<令牌>;符 c;
    串无符 呀{"+-*/"},{"0123456789"};
    空 取数(){//不支持超过9位的数
        整 i=0;整 j=0;(1){
            c=();(j>9||!.(c));
            i=i*10+c-'0';j++;();
        }(,令牌{i});
    }
    空 造令(&a){
        清理();.切换串(a);(1){(.);c=();(是空格(c)){();;}(.(c)){(,令牌{c});();;}(.(c)){取数();;}
            打印("错误符",c);
        }(,令牌{});//压个空尾巴
    }//加个尾巴,免得不知道到尾巴了.
};

构 消费流{//
    令牌流<令牌>;
    整 切换(向量<令牌>&a){.切换(a);中 解析();}
    整 取值(){令牌 t=.();中 t.b;}
    整 解析乘除(){//优先级高的在下层.
        整 i=取值();整 j=0;令牌 t;
        打印("解析乘除开始",i,j);(1){
            t=.偷看();(t.a==尾巴);(t.a!=乘除);.针加();
            j=取值();(t.c=='*')i*=j;
            异 如(t.c=='/')i/=j;
        }
        打印("解析乘除结束",i,j,"哈");
        中 i;
    }//消解乘除影响
    整 解析(){
        打印("解析开始");
        整 i=解析乘除();整 j=0;令牌 t;(1){
            t=.偷看();(t.a==尾巴);(t.a!=加减);.针加();
            j=解析乘除();(t.c=='+')i+=j;
            异 如(t.c=='-')i-=j;
        }
        打印("解析结束",i,"哈");
        中 i;
    }//只剩下加减.
};
整 组合(&a){
    静 造流 b;静 消费流 c;
    b.造令(a);中 c.切换(b.);
}


空 主(){
    串 b{"34+456*5-4534/3"};
    串 c{"23*45/2+45/3*34/2-34"};
    串 d{"2+34+34*2/3+45/3*34/2-34"};
    打印(组合(b));打印(组合(c));
    打印(组合(d));
    //不能并列,要冲突.
}
发布了440 篇原创文章 · 获赞 29 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/fqbqrr/article/details/104720733
今日推荐