From 6f6534dcc236ac2c62cec65e7b14dd7393e25029 Mon Sep 17 00:00:00 2001 From: Valk Richard Li <48872266+ValKmjolnir@users.noreply.github.com> Date: Wed, 7 Aug 2019 22:04:13 +0800 Subject: [PATCH] bug fix --- lab.cpp | 39 ++++++ nasal_functional.h | 302 ++++++++++++++++++++++++++++----------------- 2 files changed, 226 insertions(+), 115 deletions(-) create mode 100644 lab.cpp diff --git a/lab.cpp b/lab.cpp new file mode 100644 index 0000000..417489e --- /dev/null +++ b/lab.cpp @@ -0,0 +1,39 @@ +#include +#include +#include +#include +#include +#include "nasal.h" + +using namespace nasal; + +int main() +{ + std::cout<<">> input \"help\" to find help."<> "; + std::cin>>Command; + if(Command=="help") + { + std::cout<<">> 1.input file name to run the nasal script."<> 2.command cls to clear the screen."<> 3.command exit to shut down the program."<next) + { + temp=temp->next; + if(temp->line==_line) + std::cout<content<<" "; + else if(temp->line>_line) + break; + } + std::cout<next) @@ -165,10 +180,12 @@ class token_list } void run() { + nasal_var_stack.delete_all(); + nasal_func_stack.delete_all(); token_unit *temp=head; if(!head->next) { - std::cout<<"Running complete."<> Running complete."<type=="Number") { - ; + print_line_token(temp->line); + std::cout<<"line "<line<<": "<<"[Error] Number without any tokens."<type=="ReserveWord") { if(temp->content=="var") { if(temp->next) - { temp=temp->next; - std::string name_of_var; - if(temp->type=="Identifier") - name_of_var=temp->content; - else - { - std::cout<<"line "<line<<": "<<"[Error] Missing identifier after \"var\"."<next) - { - temp=temp->next; - if(temp->content=="=") - { - if(temp->next) - { - temp=temp->next; - if(temp->type=="Number") - { - temp_var.isGlobal=true; - if(isFloat(temp->content)) - { - temp_var.Type="double"; - temp_var.data=new double; - *((double *)temp_var.data)=double_Str2Num(temp->content); - nasal_var_stack.append_var(name_of_var,temp_var); - delete (double *)temp_var.data; - temp_var.data=NULL; - } - else - { - temp_var.Type="long long int"; - temp_var.data=new long long int; - *((long long int *)temp_var.data)=int_Str2Num(temp->content); - nasal_var_stack.append_var(name_of_var,temp_var); - delete (long long int *)temp_var.data; - temp_var.data=NULL; - } - } - else if(temp->type=="String") - { - temp_var.isGlobal=true; - temp_var.Type="string"; - temp_var.data=new std::string; - std::string temp_string=""; - for(int i=1;i<(int)temp->content.length()-1;++i) - temp_string+=temp->content[i]; - *((std::string *)temp_var.data)=temp_string; - nasal_var_stack.append_var(name_of_var,temp_var); - delete (std::string *)temp_var.data; - temp_var.data=NULL; - } - else if(temp->type=="Operator" && temp->content=="{") - { - bool make_pair=false; - int cnt=1; - while(temp->next) - { - temp=temp->next; - if(temp->type=="Operator" && temp->content=="}") - { - --cnt; - if(!cnt) - { - make_pair=true; - break; - } - } - else if(temp->type=="Operator" && temp->content=="{") - ++cnt; - } - if(!make_pair) - { - std::cout<<"line "<line<<": "<<"[Error] Expect a \"}\"."<next && temp->next->content==";")) - { - std::cout<<"line "<line<<": "<<"[Error] Expect a \";\" at the end of the statement."<next; - } - else - { - std::cout<<"line "<line<<": "<<"[Error] Missing value after operator = ."<line<<": "<<"[Error] Missing \"=\" after identifier."<line<<": "<<"[Error] Missing elements after identifier."<line); + std::cout<<"line "<line<<": "<<"[Error] Missing elements after \"var\"."<type=="Identifier") + name_of_var=temp->content; + else + { + print_line_token(temp->line); std::cout<<"line "<line<<": "<<"[Error] Missing identifier after \"var\"."<next) + temp=temp->next; + else + { + print_line_token(temp->line); + std::cout<<"line "<line<<": "<<"[Error] Missing operator \"=\" after identifier."<content!="=") + { + print_line_token(temp->line); + std::cout<<"line "<line<<": "<<"[Error] Missing operator \"=\" after identifier."<next) + temp=temp->next; + else + { + print_line_token(temp->line); + std::cout<<"line "<line<<": "<<"[Error] Missing value after operator \"=\" ."<type=="Number") + { + temp_var.isGlobal=true; + if(isFloat(temp->content)) + { + temp_var.Type="double"; + temp_var.data=new double; + *((double *)temp_var.data)=double_Str2Num(temp->content); + nasal_var_stack.append_var(name_of_var,temp_var); + delete (double *)temp_var.data; + temp_var.data=NULL; + } + else + { + temp_var.Type="long long int"; + temp_var.data=new long long int; + *((long long int *)temp_var.data)=int_Str2Num(temp->content); + nasal_var_stack.append_var(name_of_var,temp_var); + delete (long long int *)temp_var.data; + temp_var.data=NULL; + } + } + else if(temp->type=="String") + { + temp_var.isGlobal=true; + temp_var.Type="string"; + temp_var.data=new std::string; + std::string temp_string=""; + for(int i=1;i<(int)temp->content.length()-1;++i) + temp_string+=temp->content[i]; + *((std::string *)temp_var.data)=temp_string; + nasal_var_stack.append_var(name_of_var,temp_var); + delete (std::string *)temp_var.data; + temp_var.data=NULL; + } + else if(temp->type=="Operator" && temp->content=="{") + { + bool make_pair=false; + int cnt=1; + while(temp->next) + { + temp=temp->next; + if(temp->type=="Operator" && temp->content=="}") + { + --cnt; + if(!cnt) + { + make_pair=true; + break; + } + } + else if(temp->type=="Operator" && temp->content=="{") + ++cnt; + } + if(!make_pair) + { + print_line_token(temp->line); + std::cout<<"line "<line<<": "<<"[Error] Expect a \"}\"."<type=="Operator" && temp->content=="[") + { + bool make_pair=false; + int cnt=1; + while(temp->next) + { + temp=temp->next; + if(temp->type=="Operator" && temp->content=="]") + { + --cnt; + if(!cnt) + { + make_pair=true; + break; + } + } + else if(temp->type=="Operator" && temp->content=="[") + ++cnt; + } + if(!make_pair) + { + print_line_token(temp->line); + std::cout<<"line "<line<<": "<<"[Error] Expect a \"]\"."<line); + std::cout<<"line "<line<<": "<<"[Error] Missing value after operator \"=\" ."<next && temp->next->content==";")) + { + print_line_token(temp->line); + std::cout<<"line "<line<<": "<<"[Error] Expect a \";\" at the end of the statement."<next; //end var } else if(temp->content=="print") @@ -325,25 +372,50 @@ class token_list } else if(temp->type=="Identifier") PrintVar(nasal_var_stack.SearchVar(temp->content)); + else if(temp->type=="Operator" && temp->content==")") + { + if(!temp->next) + { + print_line_token(temp->line); + std::cout<<"line "<line<<": "<<"[Error] Expect a \";\" at the end of the statement."<type=="Operator" && temp->content==";") + { + print_line_token(temp->line); + std::cout<<"line "<line<<": "<<"[Error] Expect a \")\" at the end of print."<line<<": "<<"[Error] Expect \"(\" after function print."<line); + std::cout<<"line "<line<<": "<<"[Error] Expect a \"(\" after function print."<next && temp->next->content==";")) + { + print_line_token(temp->line); + std::cout<<"line "<line<<": "<<"[Error] Expect a \";\" at the end of the statement."<type=="String") { - ; + print_line_token(temp->line); + std::cout<<"line "<line<<": "<<"[Error] String without any tokens."<> Running complete."<