diff --git a/misc/lexer(useless).h b/misc/lexer(useless).h new file mode 100644 index 0000000..d5cb091 --- /dev/null +++ b/misc/lexer(useless).h @@ -0,0 +1,183 @@ +#ifndef __LEXER_H__ +#define __LEXER_H__ + + +#include +#include +#include +#include "nasal.h" +#include "process_stack.h" + +using namespace nasal; + +std::string text; +process_stack _test; +process_stack_unit _unit; + +void PrintProcess(std::string content) +{ + std::string Sentence=""; + int len=(int)content.length(); + for(int i=0;i> "; + std::getline(std::cin,text); + int len=(int)text.length(); + + int sharpDetected=0; + for(int i=len-1;i>=0;--i) + { + if(text[i]=='#') + { + //ignore sharp + len=i; + sharpDetected=i; + } + if(text[i]==';') + { + len=i+1; + //find the real end of the sentence + if(sharpDetected) + { + for(int j=sharpDetected-1;j>=len;--j) + if(text[j]!=' ') + { + len=j+1; + break; + } + } + else + { + for(int j=(int)text.length()-1;j>=len;--j) + if(text[j]!=' ') + { + len=j+1; + break; + } + } + break; + } + } + + if(text[len-1]==';') + { + for(int i=0;i=0;--j) + if(text[j]!=' ') + { + string_end=j; + break; + } + if(text[string_end]!=')') + { + std::cout< +#include +#include + +#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 //异常错误 + +// \n 换行 +// \t tab +// \r 回车 +// \\ 反斜线 +// \' 单引号 +// \" 双引号 +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; + 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: "<> exit: exit the programe."<> clear: clean the screen."<> help: find help."<> input the file name to scan."<> "; + std::cin>>FileNameOrCommand; + + if(FileNameOrCommand=="exit") + break; + else if(FileNameOrCommand=="clear") + { + system("cls"); + continue; + } + else if(FileNameOrCommand=="help") + { + help(); + continue; + } + //std::ofstream fout("Data.txt"); + InputFile(FileNameOrCommand); + while(Syn!=SCANEND && Syn!=ERRORFOUND) + { + Scanner(Syn,ResourcePrograme,token,Ptr); + if(Syn==OPERATOR) + std::cout<<"( Operator | "<> Complete scanning \""< +#include +#include "nasal.h" +namespace nasal +{ + + +struct process_stack_unit +{ + int line; //place the unit first appear + std::string name; //content of the unit or name of the var/class/function + std::string format_type; //var class function string info + var unitdata; + bool global; + process_stack_unit *next; + process_stack_unit *last; +}; + +class process_stack +{ + private: + process_stack_unit *head; + process_stack_unit *ptr; + public: + process_stack() + { + head=new process_stack_unit; + head->line=0; + head->name="InterpreterInfo"; + head->format_type="Info"; + head->global=false; + head->unitdata.Type="string"; + head->unitdata.data=new std::string; + *((std::string *)head->unitdata.data)="# Nasal language for FlightGear."; + + head->last=NULL; + head->next=NULL; + ptr=NULL; + } + ~process_stack() + { + process_stack_unit *temp=head; + while(temp->next) + { + temp=temp->next; + delete head; + head=temp; + } + delete head; + } + void stack_append(process_stack_unit &p) + { + process_stack_unit *temp=head; + process_stack_unit *last_node; + while(temp->next) + { + temp=temp->next; + } + temp->next=new process_stack_unit; + + last_node=temp; + temp=temp->next; + + temp->last=last_node; + last_node->next=temp; + temp->next=NULL; + + temp->name=p.name; + temp->line=p.line; + temp->format_type=p.format_type; + temp->global=p.global; + temp->unitdata=p.unitdata; + + return; + } + void stack_print(bool reverse_mode_used) + { + process_stack_unit *temp=head; + std::cout<<"In stack: "<next) + temp=temp->next; + while(temp->last) + { + std::cout<<"line "<line<<": |"<format_type<<"|"<name<<"|\n\t|"; + temp->unitdata.Print(); + std::cout<last; + } + std::cout<<"line "<line<<": |"<format_type<<"|"<name<<"|\n\t|"; + temp->unitdata.Print(); + std::cout<line<<": |"<format_type<<"|"<name<<"|\n\t|"; + temp->unitdata.Print(); + std::cout<next) + { + temp=temp->next; + std::cout<<"line "<line<<": |"<format_type<<"|"<name<<"|\n\t|"; + temp->unitdata.Print(); + std::cout<next) + { + last_node=temp; + temp=temp->next; + } + last_node->next=NULL; + delete temp; + return; + } + bool check_stack(std::string &ElementName) + { + process_stack_unit *temp=head; + while(temp->next) + { + temp=temp->next; + if(temp->name==ElementName) + return true; + } + return false; + } + void stack_content_print(std::string &ElementName) + { + process_stack_unit *temp=head; + while(temp->next) + { + temp=temp->next; + if(temp->name==ElementName) + { + temp->unitdata.Print(); + return; + } + } + return; + } +}; + + + + +} + +#endif diff --git a/misc/str2num.h b/misc/str2num.h new file mode 100644 index 0000000..6f86c8c --- /dev/null +++ b/misc/str2num.h @@ -0,0 +1,60 @@ +#ifndef __STR2NUM_H__ +#define __STR2NUM_H__ + +#include +#include + +namespace nasal +{ + +void 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; + } + std::cout<=0;--i) + { + num+=acc*((double)(str[i]-'0')); + acc*=10; + } + std::cout<