#ifndef __NASAL_FUNCTIONAL_CPP__ #define __NASAL_FUNCTIONAL_CPP__ #include "nasal_functional.h" #include "nasal_var_stack.h" #include "nasal_func_stack.h" bool is_float(std::string &str) { for(int i=0;i<(int)str.length();++i) if(str[i]=='.') return true; return false; } long long int int_str2num(std::string &str) { for(int i=0;i<(int)str.length();++i) if(!(('0'<=str[i]) && (str[i]<='9') || (str[i]=='.'))) { std::cout<<"[Error] Non-numeric string."<=0;--i) { num+=acc*((long long int)(str[i]-'0')); acc*=10; } return num; } double double_str2num(std::string &str) { for(int i=0;i<(int)str.length();++i) if(!(('0'<=str[i]) && (str[i]<='9') || (str[i]=='.'))) { std::cout<<"[Error] Non-numeric string."<=0;--i) { num+=acc*((double)(str[i]-'0')); acc*=10; } return num; } func::func() { statement_head=new token_unit; statement_head->line=0; statement_head->type=FUNC_BEGIN; statement_head->content="__func_begin"; statement_head->next=NULL; parameter_head=new parameter; parameter_head->param_var.type=VAR_NONE; parameter_head->param_var.data=NULL; parameter_head->var_name="__null_var"; parameter_head->next=NULL; } func::func(const func& temp) { token_unit *statement_temp=statement_head; token_unit *temp_state=temp.statement_head; parameter *parameter_temp=parameter_head; parameter *temp_param=temp.parameter_head; while(temp_state->next) { temp_state=temp_state->next; statement_temp->next=new token_unit; statement_temp=statement_temp->next; statement_temp->line=temp_state->line; statement_temp->content=temp_state->content; statement_temp->type=temp_state->type; statement_temp->next=NULL; } while(temp_param->next) { temp_param=temp_param->next; parameter_temp->next=new parameter; parameter_temp=parameter_temp->next; parameter_temp->param_var=temp_param->param_var; parameter_temp->var_name=temp_param->var_name; parameter_temp->next=NULL; } } func::~func() { token_unit *statement_temp=statement_head; token_unit *statement_last_unit=NULL; parameter *parameter_temp=parameter_head; parameter *parameter_last_unit=NULL; while(statement_temp->next) { statement_last_unit=statement_temp; statement_temp=statement_temp->next; delete statement_last_unit; } delete statement_temp; while(parameter_temp->next) { parameter_last_unit=parameter_temp; parameter_temp=parameter_temp->next; delete parameter_last_unit; } delete parameter_temp; } func& func::operator=(const func& temp) { token_unit *statement_temp=statement_head->next; token_unit *temp_state=temp.statement_head; parameter *parameter_temp=parameter_head->next; parameter *temp_param=temp.parameter_head; token_unit *statement_last=NULL; parameter *parameter_last=NULL; if(statement_temp) { while(statement_temp->next) { statement_last=statement_temp; statement_temp=statement_temp->next; delete statement_last; } delete statement_temp; } if(parameter_temp) { while(parameter_temp->next) { parameter_last=parameter_temp; parameter_temp=parameter_temp->next; delete parameter_last; } delete parameter_temp; } statement_head->next=NULL; parameter_head->next=NULL; statement_temp=statement_head; parameter_temp=parameter_head; while(temp_state->next) { temp_state=temp_state->next; statement_temp->next=new token_unit; statement_temp=statement_temp->next; statement_temp->line=temp_state->line; statement_temp->content=temp_state->content; statement_temp->type=temp_state->type; statement_temp->next=NULL; } while(temp_param->next) { temp_param=temp_param->next; parameter_temp->next=new parameter; parameter_temp=parameter_temp->next; parameter_temp->param_var=temp_param->param_var; parameter_temp->var_name=temp_param->var_name; parameter_temp->next=NULL; } return *this; } void func::append_var(std::string& varia_name,var& p) { parameter *parameter_temp=parameter_head; while(parameter_temp->next) { parameter_temp=parameter_temp->next; if(parameter_temp->var_name==varia_name) { std::cout<<"[Error] Redefinition of var \""<next=new parameter; parameter_temp=parameter_temp->next; parameter_temp->param_var=p; parameter_temp->var_name=varia_name; parameter_temp->next=NULL; return; } void func::append_token(const int _line,const int _type,std::string &_content) { token_unit *statement_temp=statement_head; while(statement_temp->next) statement_temp=statement_temp->next; statement_temp->next=new token_unit; statement_temp=statement_temp->next; statement_temp->line=_line; statement_temp->type=_type; statement_temp->content=_content; statement_temp->next=NULL; return; } void func::print_info() { parameter *para_temp=parameter_head; token_unit *token_temp=statement_head; std::cout<<"\n\t[parameter] :"; while(para_temp->next) { para_temp=para_temp->next; std::cout<var_name<<" "; } std::cout<<"\n\t[statement] :"; while(token_temp->next) { token_temp=token_temp->next; std::cout<content<<" "; } std::cout<type=FUNC_BEGIN; head->content="__process_begin"; head->line=0; head->next=NULL; } token_list::~token_list() { token_unit *temp=head; token_unit *this_node=NULL; while(temp->next) { this_node=temp; temp=temp->next; delete this_node; } delete temp; } token_unit* token_list::get_head() { return head; } int token_list::get_list_range() { return list_range; } void token_list::print_line_token(const int _line) { std::cout<<"line "<<_line<<": "; token_unit *temp=head; while(temp->next) { temp=temp->next; if(temp->line==_line) std::cout<content<<" "; else if(temp->line>_line) break; } std::cout<next) return; token_unit *temp=head; token_unit *this_node=NULL; temp=temp->next; head->next=NULL; while(temp->next) { this_node=temp; temp=temp->next; delete this_node; } delete temp; return; } void token_list::append(const int _line,const int _type,std::string &_content) { token_unit *temp=head; while(temp->next) temp=temp->next; ++list_range; temp->next=new token_unit; temp=temp->next; temp->next=NULL; temp->type=_type; temp->line=_line; temp->content=_content; return; } void token_list::print() { token_unit *temp=head; std::cout<<"line "<line<<": "<<"( ProcessBegin | "<content<<" )"<next) return; while(temp->next) { temp=temp->next; std::cout<<"line "<line<<": "; if(temp->type==OPERATOR) std::cout<<"( Operator | "; else if(temp->type==IDENTIFIER) std::cout<<"( Identifier | "; else if(temp->type==NUMBER) std::cout<<"( Number | "; else if(temp->type==RESERVEWORD) std::cout<<"( ReserveWord | "; else if(temp->type==STRING) std::cout<<"( String | "; std::cout<content<<" )"<0) std::cout<<"[Error] Missing \")\" ."<0) std::cout<<"[Error] Missing \"]\" ."<0) std::cout<<"[Error] Missing \"}\" ."<0? '}':'{')<<"\" ."<0? '}':'{')<<"\" ."<next) { temp=temp->next; ++len;//begin from 1 content_array[len].type=temp->type; content_array[len].line=temp->line; content_array[len].content=temp->content; } brace_check(); for(int i=1;i<=len;++i) { if(content_array[i].type==RESERVEWORD && content_array[i].content=="var") { int in_brace=0; bool is_func=false; if(content_array[i+3].content=="func") is_func=true; statement_set_empty(); for(int j=i;j<=len;++j) { statement[j-i]=content_array[j]; if(content_array[j].type==OPERATOR && content_array[j].content=="{") ++in_brace; if(content_array[j].type==OPERATOR && content_array[j].content=="}") --in_brace; if(content_array[j].type==OPERATOR && content_array[j].content==";" && !in_brace && !is_func) { i=j; break; } if(content_array[j].content=="}" && is_func && !in_brace) { i=j; break; } } definition(); } else if(content_array[i].type==IDENTIFIER) { int in_brace=0; statement_set_empty(); for(int j=i;j<=len;++j) { statement[j-i]=content_array[j]; if(content_array[j].type==OPERATOR && content_array[j].content==";" && in_brace==0) { i=j; break; } if(content_array[j].type==OPERATOR && content_array[j].content=="{") ++in_brace; if(content_array[j].type==OPERATOR && content_array[j].content=="}") --in_brace; } assignment(); } } nasal_var_stack.print_var(); nasal_func_stack.print_function(); return; } #endif