diff --git a/version0.2/nasal.h b/version0.2/nasal.h new file mode 100644 index 0000000..fbfa420 --- /dev/null +++ b/version0.2/nasal.h @@ -0,0 +1,30 @@ +#ifndef __NASAL_H__ +#define __NASAL_H__ + +#include +#include +#include +#include +#include +#include +#include + +namespace nasal +{ + +#include "nasal_var.h" +#include "nasal_list.h" +#include "nasal_hash.h" +#include "nasal_functional.h" + +#include "nasal_var.cpp" +#include "nasal_list.cpp" +#include "nasal_hash.cpp" +//#include "nasal_print.h" +//#include "nasal_var_stack.h" +//#include "nasal_func_stack.h" +#include "nasal_functional.cpp" + +} + +#endif diff --git a/version0.2/nasal_func_stack.h b/version0.2/nasal_func_stack.h new file mode 100644 index 0000000..a48d2a8 --- /dev/null +++ b/version0.2/nasal_func_stack.h @@ -0,0 +1,124 @@ +#ifndef __NASAL_FUNC_STACK_H__ +#define __NASAL_FUNC_STACK_H__ + +#include "nasal_func.h" + + +namespace nasal +{ + +struct func_stack_unit +{ + std::string func_name; + func func_statement; + func_stack_unit *next; +}; + +class func_stack +{ + private: + func_stack_unit *head; + public: + func_stack() + { + head=new func_stack_unit; + head->func_name="null"; + head->next=NULL; + } + ~func_stack() + { + func_stack_unit *temp=head; + func_stack_unit *this_node=NULL; + if(head->next) + { + while(temp->next) + { + this_node=temp; + temp=temp->next; + delete this_node; + } + delete temp; + } + else + delete head; + } + void append_function(std::string &function_name,func &temp_func) + { + func_stack_unit *temp=head; + while(temp->next) + { + temp=temp->next; + if(temp->func_name==function_name) + { + std::cout<<"[Error] Redeclaration of function \""<next=new func_stack_unit; + temp=temp->next; + temp->next=NULL; + temp->func_statement=temp_func; + return; + } + void run_function(std::string &function_name) + { + func_stack_unit *temp=head; + while(temp->next) + { + temp=temp->next; + if(temp->func_name==function_name) + { + temp->func_statement.run(); + return; + } + } + std::cout<<"[Error] Could not find this function."<next) + { + temp=temp->next; + std::cout<<"function: "<func_name<func_name<next) + return; + while(temp->next) + { + end_temp=temp; + temp=temp->next; + } + end_temp->next=NULL; + delete temp; + } + void delete_all() + { + func_stack_unit *temp=head->next; + func_stack_unit *this_node=NULL; + head->next=NULL; + if(!temp) + return; + while(temp->next) + { + this_node=temp; + temp=temp->next; + delete this_node; + } + delete temp; + return; + } +}; + +} + + +#endif diff --git a/version0.2/nasal_functional.cpp b/version0.2/nasal_functional.cpp new file mode 100644 index 0000000..3be7cac --- /dev/null +++ b/version0.2/nasal_functional.cpp @@ -0,0 +1,4 @@ +#ifndef __NASAL_FUNCTIONAL_CPP__ +#define __NASAL_FUNCTIONAL_CPP__ + +#endif diff --git a/version0.2/nasal_functional.h b/version0.2/nasal_functional.h new file mode 100644 index 0000000..0372be3 --- /dev/null +++ b/version0.2/nasal_functional.h @@ -0,0 +1,365 @@ +#ifndef __NASAL_FUNCTIONAL_H__ +#define __NASAL_FUNCTIONAL_H__ + +#define FUNC_BEGIN 0 +#define FUNC_OPERATOR 1 +#define FUNC_IDENTIFIER 2 +#define FUNC_NUMBER 3 +#define FUNC_RESERVEWORD 4 +#define FUNC_STRING 5 + +struct token_unit +{ + int type; + std::string content; + int line; + token_unit *next; +}; + +class func +{ + private: + token_unit *head; + public: + func(); + ~func(); +}; + +class token_list +{ + private: + token_unit *head; + public: + token_list() + { + head=new token_unit; + head->type=FUNC_BEGIN; + head->content="__process_begin"; + head->line=0; + head->next=NULL; + } + ~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; + } + void 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 append(const int _type,std::string &_content,const int _line) + { + token_unit *temp=head; + while(temp->next) + temp=temp->next; + temp->next=new token_unit; + temp=temp->next; + temp->next=NULL; + temp->type=_type; + temp->line=_line; + temp->content=_content; + return; + } + void 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==FUNC_OPERATOR) + std::cout<<"( Operator | "; + else if(temp->type==FUNC_IDENTIFIER) + std::cout<<"( Identifier | "; + else if(temp->type==FUNC_NUMBER) + std::cout<<"( Number | "; + else if(temp->type==FUNC_RESERVEWORD) + std::cout<<"( ReserveWord | "; + else if(temp->type==FUNC_STRING) + std::cout<<"( String | "; + std::cout<content<<" )"<next) + { + std::cout<<">> Running complete."<next) + { + temp=temp->next; + if(temp->type=="Operator") + { + ; + } + else if(temp->type=="Identifier") + { + ; + } + else if(temp->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; + else + { + print_line_token(temp->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") + { + if(temp->next && temp->next->content=="(") + { + temp=temp->next; + while(temp->next) + { + temp=temp->next; + if(temp->type=="String") + { + std::string temp_string=""; + for(int i=1;i<(int)temp->content.length()-1;++i) + temp_string+=temp->content[i]; + PrintString(temp_string); + } + 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); + 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."< +#include +#include "nasal.h" + +int main() +{ + + return 0; +} diff --git a/version0.2/nasal_lexer.h b/version0.2/nasal_lexer.h new file mode 100644 index 0000000..ce7875a --- /dev/null +++ b/version0.2/nasal_lexer.h @@ -0,0 +1,279 @@ +#ifndef __NASAL_LEXER_H__ +#define __NASAL_LEXER_H__ + + +#include +#include +#include +#include "nasal_functional.h" + + +namespace nasal +{ + +#define IDENTIFIER -1 //自定义标识符 +#define OPERATOR -2 //界符 or 运算符 +#define NUMBER -3 //数字 +#define RESERVEWORD -4 //关键字 +#define STRING -5 //字符串类型 +#define FAIL -6 //失败 +#define SCANEND -7 //扫描完成 +#define ERRORFOUND -8 //异常错误 + +std::string ReserveWord[26]= +{ + "for","foreach","forindex","while", + "var","func","break","continue","return", + "if","else","elsif","nil","and","or", + "print","cmp","append","setsize","subvec","pop", + "sort","contains","delete","keys","typeof" +}; + +std::string OperatorOrDelimiter[40]= +{ + "+","-","*","/","=","+=","-=","*=","/=", + "\n","\t","\r","\\","\'","\"",".", + "<","<=",">",">=","==","!=","~=","!","~", + ",",";","(",")","[","]","{","}","#","?",":", + "&","|","%","^" +}; + +std::string IdentifierTable[1000]={""}; +char ResourcePrograme[16777216]; + +int isReserveWord(std::string &p) +{ + for(int i=0;i<26;++i) + if(ReserveWord[i]==p) + return i+1; + return FAIL; +} + +int isOperatorOrDelimiter(std::string &p) +{ + for(int i=0;i<40;++i) + if(OperatorOrDelimiter[i]==p) + return i+1; + return FAIL; +} + +bool isLetter(char t) +{ + return (('a'<=t) && (t<='z') || ('A'<=t) && (t<='Z')); +} + +bool isNumber(char t) +{ + return (('0'<=t) && (t<='9')); +} + +void InputFile(std::string &FileName) +{ + std::ifstream fin(FileName); + if(fin.fail()) + { + std::cout<<"[Error] Failed to load file: "<127) + { + ++ptr; + if(temp=='\n') + ++line; + temp=Source[ptr]; + } + + token=""; + if(isLetter(temp) || temp=='_') + { + token+=temp; + ++ptr; + temp=Source[ptr]; + while(isLetter(temp) || isNumber(temp) || temp=='_') + { + token+=temp; + ++ptr; + temp=Source[ptr]; + } + Syn=isReserveWord(token); + if(Syn==FAIL) + Syn=IDENTIFIER; + else + Syn=RESERVEWORD; + } + else if(isNumber(temp)) + { + int PointCnt=0; + while(isNumber(temp)) + { + token+=temp; + ++ptr; + temp=Source[ptr]; + if(temp=='.' && !PointCnt) + { + ++PointCnt; + token+=temp; + ++ptr; + temp=Source[ptr]; + } + } + Syn=NUMBER; + } + else if(temp=='(' || temp==')' || temp=='[' || temp==']' || temp=='{' || + temp=='}' || temp==',' || temp==';' || temp=='|' || temp==':' || + temp=='?' || temp=='.' || temp=='`' || temp=='\'' || temp=='&'|| + temp=='%' || temp=='$' || temp=='^') + { + token+=temp; + ++ptr; + Syn=OPERATOR; + } + else if(temp=='=' || temp=='+' || temp=='-' || temp=='*' || temp=='!' || temp=='/' || temp=='<' || temp=='>' || temp=='~') + { + Syn=OPERATOR; + token+=temp; + ++ptr; + temp=Source[ptr]; + if(temp=='=') + { + token+=temp; + ++ptr; + } + } + else if(temp=='\\') + { + Syn=OPERATOR; + token+=temp; + ++ptr; + temp=Source[ptr]; + if(temp=='=' || temp=='n' || temp=='t' || temp=='r' || temp=='\\' || temp=='\'' || temp=='\"') + { + token+=temp; + ++ptr; + } + } + else if(temp=='\"') + { + Syn=STRING; + token+=temp; + ++ptr; + temp=Source[ptr]; + while(temp!='\"') + { + if(temp=='\\') + { + token+=temp; + + ++ptr; + temp=Source[ptr]; + token+=temp; + + ++ptr; + temp=Source[ptr]; + } + else + { + token+=temp; + ++ptr; + temp=Source[ptr]; + } + if(temp=='@' || temp=='\n') + break; + } + //add the last char \" + if(temp=='\"') + { + token+=temp; + ++ptr; + } + else + token+=" __missing_end_of_string"; + } + else if(temp=='@') + { + Syn=SCANEND; + return; + } + else + { + Syn=FAIL; + std::cout<<"[Error] Unexpected error occurred: "<> Complete scanning \""< +#include +#include "nasal_hash.cpp" +#include "nasal_list.cpp" + +namespace nasal +{ + +void PrintString(std::string &PrintInfo) +{ + for(int i=0;i<(int)PrintInfo.length();++i) + { + if(PrintInfo[i]=='\\' && i+1<(int)PrintInfo.length()) + { + switch(PrintInfo[i+1]) + { + case 'n': + std::cout<<"\n"; + ++i; + break; + case 't': + std::cout<<"\t"; + ++i; + break; + case 'r': + std::cout<<"\r"; + ++i; + break; + case '\\': + std::cout<<"\\"; + ++i; + break; + case '\'': + std::cout<<"\'"; + ++i; + break; + case '\"': + std::cout<<"\""; + ++i; + break; + default: + //error occurred + std::cout<<"[Error]: Incorrect escape character \'"<=(int)PrintInfo.length()) + { + //error occurred + std::cout<<"[Error]: Missing character after \'\\\'"; + } + else + std::cout<PrintList(); + else if(Var.Type=="hash") + ((NasalHash *)Var.data)->PrintHash(); + else + std::cout<<"null"; +} + +} + +#endif diff --git a/version0.2/nasal_var.cpp b/version0.2/nasal_var.cpp new file mode 100644 index 0000000..76e1b38 --- /dev/null +++ b/version0.2/nasal_var.cpp @@ -0,0 +1,126 @@ +#ifndef __NASAL_VAR_CPP__ +#define __NASAL_VAR_CPP__ + +var::var() +{ + type=VAR_NONE; + data=NULL; +} +var::var(const var &temp) +{ + type=temp.type; + switch(type) + { + case VAR_NONE: + data=NULL; + break; + case VAR_LLINT: + data=new long long int; + *((long long int *)data)=*((long long int *)temp.data); + break; + case VAR_DOUBLE: + data=new double; + *((double *)data)=*((double *)temp.data); + break; + case VAR_CHAR: + data=new char; + *((char *)data)=*((char *)temp.data); + break; + case VAR_STRING: + data=new std::string; + *((std::string *)data)=*((std::string *)temp.data); + break; + case VAR_LIST: + data=new nasal_list; + *((nasal_list *)data)=*((nasal_list *)temp.data); + break; + case VAR_HASH: + data=new nasal_hash; + *((nasal_hash *)data)=*((nasal_hash *)temp.data); + break; + } +} +var::~var() +{ + if(data) + switch(type) + { + case VAR_LLINT: + delete (long long int *)data; + break; + case VAR_DOUBLE: + delete (double *)data; + break; + case VAR_CHAR: + delete (char *)data; + break; + case VAR_STRING: + delete (std::string *)data; + break; + case VAR_LIST: + delete (nasal_list *)data; + break; + case VAR_HASH: + delete (nasal_hash *)data; + break; + } +} +var& var::operator=(const var &temp) +{ + if(data) + switch(type) + { + case VAR_LLINT: + delete (long long int *)data; + break; + case VAR_DOUBLE: + delete (double *)data; + break; + case VAR_CHAR: + delete (char *)data; + break; + case VAR_STRING: + delete (std::string *)data; + break; + case VAR_LIST: + delete (nasal_list *)data; + break; + case VAR_HASH: + delete (nasal_hash *)data; + break; + } + type=temp.type; + switch(type) + { + case VAR_NONE: + data=NULL; + break; + case VAR_LLINT: + data=new long long int; + *((long long int *)data)=*((long long int *)temp.data); + break; + case VAR_DOUBLE: + data=new double; + *((double *)data)=*((double *)temp.data); + break; + case VAR_CHAR: + data=new char; + *((char *)data)=*((char *)temp.data); + break; + case VAR_STRING: + data=new std::string; + *((std::string *)data)=*((std::string *)temp.data); + break; + case VAR_LIST: + data=new nasal_list; + *((nasal_list *)data)=*((nasal_list *)temp.data); + break; + case VAR_HASH: + data=new nasal_hash; + *((nasal_hash *)data)=*((nasal_hash *)temp.data); + break; + } + return *this; +} + +#endif diff --git a/version0.2/nasal_var.h b/version0.2/nasal_var.h new file mode 100644 index 0000000..21822cb --- /dev/null +++ b/version0.2/nasal_var.h @@ -0,0 +1,23 @@ +#ifndef __NASAL_VAR_H__ +#define __NASAL_VAR_H__ + +#define VAR_NONE 0 +#define VAR_LLINT 1 +#define VAR_DOUBLE 2 +#define VAR_CHAR 3 +#define VAR_STRING 4 +#define VAR_LIST 5 +#define VAR_HASH 6 + +class var +{ + public: + int type; + void *data; + var(); + var(const var&); + ~var(); + var& operator=(const var&); +}; + +#endif diff --git a/version0.2/nasal_var_stack.h b/version0.2/nasal_var_stack.h new file mode 100644 index 0000000..b884e9b --- /dev/null +++ b/version0.2/nasal_var_stack.h @@ -0,0 +1,119 @@ +#ifndef __NASAL_VAR_STACK_H__ +#define __NASAL_VAR_STACK_H__ + +#include "nasal_print.h" + +namespace nasal +{ + +struct var_stack_unit +{ + std::string var_name; + var var_detail; + var_stack_unit *next; +}; + +class var_stack +{ + private: + var_stack_unit *head; + public: + var_stack() + { + head=new var_stack_unit; + head->var_name="null"; + head->next=NULL; + } + ~var_stack() + { + var_stack_unit *temp=head; + var_stack_unit *this_node=NULL; + if(head->next) + { + while(temp->next) + { + this_node=temp; + temp=temp->next; + delete this_node; + } + delete temp; + } + else + delete head; + } + void append_var(std::string &varia_name,var &temp_var) + { + var_stack_unit *temp=head; + while(temp->next) + temp=temp->next; + temp->next=new var_stack_unit; + temp=temp->next; + temp->var_name=varia_name; + temp->var_detail=temp_var; + temp->next=NULL; + } + void print_var() + { + var_stack_unit *temp=head; + while(temp->next) + { + temp=temp->next; + std::cout<<"["<var_detail.Type<<"]: "<var_name<<" : "; + if(temp->var_detail.Type!="string") + PrintVar(temp->var_detail); + else + std::cout<<*((std::string *)temp->var_detail.data); + std::cout<next) + { + temp=temp->next; + if(temp->var_name==varia_name) + temp_var=temp->var_detail; + } + return temp_var; + } + void pop_var() + { + var_stack_unit *temp=head; + var_stack_unit *end_temp; + if(!head->next) + return; + while(temp->next) + { + end_temp=temp; + temp=temp->next; + } + end_temp->next=NULL; + delete temp; + } + void delete_all() + { + var_stack_unit *temp=head->next; + var_stack_unit *this_node=NULL; + head->next=NULL; + if(!temp) + return; + while(temp->next) + { + this_node=temp; + temp=temp->next; + delete this_node; + } + delete temp; + return; + } +}; + +} + +#endif