前言
引入一个关键字,解释到该关键字的时候就暂停终端,只有输入了回车才能继续,大概是这样。
assert
除了卡出解释完,还有从中间退出的,如果遇到断言时输入的是exit就直接退出解释,如果输入其他的,就往下继续执行!
//Cmd.h
//断言语句控制器(终结符
class AssertCmd : public Cmd {
public:
virtual SuatinCmdClassType GetClassType() { return SuatinCmdClassType_AssertCmd; }
virtual void interpret();
};
//Cmd.cpp
void AssertCmd::interpret() { //卡住解释
std::string s;
do {
std::cout << ">";
s = "";
std::cin >> s;
if (s=="exit") {
exit(0);
}
} while (s.length()==0);
}
//Resolver.cpp
//遇到assert关键字后,将停止语义树的解释,只有回车才能继续 to be continue
void Resolver::Deal_k_assert(int& _t) { //for debug
++start;//assert关键字不属于语句,是特殊的断言
if (uncompleted_tree == NULL) {//没有待处理的语义树-----------------
semantic_tree->Push(new AssertCmd()); //将断言加入语义树
return;
}
//有待处理的语义树-----------------
//检查栈大小
if (CheckStack_UnCompletedBlock())return;
BlockCmd* node_tmp = dynamic_cast<BlockCmd*>(v_UnCompletedBlock.top());//拿到最近的没有结束的语句块
AssertCmd* node_new = new AssertCmd(); //创建新的断言
node_tmp->Push(node_new); //将断言加入最近的未结束语句块
}
项目演示
//main.suatin
assert
sum = 0;
for(i=0;i<5;i=i+1)
sum = sum +1;
assert
end
初始化语言环境 time consumed 4 ms
词法分析 time consumed 354 ms
普通语句>sum=0;
for括号内语句>i=0;
for括号内语句>i<5;
for括号内语句>i=i+1
普通语句>sum=sum+i;
语法分析·创建语法树 time consumed 155 ms
>ass
[result]0
[result]0
[result]true
[result]0
>apple
[result]1
[result]true
[result]1
>jk
[result]2
[result]true
[result]3
>love
[result]3
[result]true
[result]6
>unity
[result]4
[result]true
[result]10
>assert
[result]5
[result]false
语法分析·解释语法树 time consumed 23377 ms
suatin environment>
name isconst type funcPtr flag num str
NIL true nil 00000000 false 0
FALSE true bool 00000000 false 0
TRUE true bool 00000000 true 0
i false number 00000000 true 5
sum false number 00000000 true 10
显示环境信息 time consumed 113 ms
释放环境 time consumed 0 ms
program time consumed 24169 ms
项目代码地址CSDN
https://download.csdn.net/download/weixin_41374099/12256625
项目代码地址BDWP
链接:https://pan.baidu.com/s/1Lu0HyKYRM08R2kvnyKcMmA
提取码:uen0
复制这段内容后打开百度网盘手机App,操作更方便哦