From f8c6b4fe4bae71a71f1f5dd59c4d6837d3cb8674 Mon Sep 17 00:00:00 2001 From: Valk Richard Li <48872266+ValKmjolnir@users.noreply.github.com> Date: Wed, 10 Jun 2020 14:17:12 +0800 Subject: [PATCH] Delete nasal_LR_demo.cpp --- version0.9/nasal_LR_demo.cpp | 548 ----------------------------------- 1 file changed, 548 deletions(-) delete mode 100644 version0.9/nasal_LR_demo.cpp diff --git a/version0.9/nasal_LR_demo.cpp b/version0.9/nasal_LR_demo.cpp deleted file mode 100644 index e62841d..0000000 --- a/version0.9/nasal_LR_demo.cpp +++ /dev/null @@ -1,548 +0,0 @@ - -#include -#include -#include -#include - -#include "nasal_lexer.h" - -enum token_type -{ - __stack_end=1, - __equal,// = - __cmp_equal,// == - __cmp_not_equal,// != - __cmp_less,__cmp_less_or_equal,// < <= - __cmp_more,__cmp_more_or_equal,// > >= - __and_operator,__or_operator,__nor_operator,// and or ! - __add_operator,__sub_operator,__mul_operator,__div_operator,__link_operator,// + - * / ~ - __add_equal,__sub_equal,__mul_equal,__div_equal,__link_equal,// += -= *= /= ~= - __left_brace,__right_brace,// {} - __left_bracket,__right_bracket,// [] - __left_curve,__right_curve,// () - __semi,// ; - __comma,// , - __colon,// : - __dot,// . - __var, - __func, - __id, - __return, - __if,__elsif,__else, - __continue,__break,__for,__forindex,__foreach,__while, - - __scalar, - __number,__string,__char, - __list, - __hash, - __hash_member, - __statement, - __function, - __call_function, - __definition, - __assignment, - __calculation, - __loop, - __choose, - __program -}; - -const int max_len=10; -struct cmp_seq -{ - int tokens[max_len]; - int res; -}; -// must put in a reverse way -cmp_seq par[]= -{ - {{__statement,__program}, __program}, - {{__statement}, __program}, - {{__semi,__number,__equal,__id,__var},__definition}, - {{__definition}, __statement} -}; -int num_of_par=sizeof(par)/sizeof(cmp_seq); - -void print_token(int type) -{ - std::string context=""; - switch(type) - { - case __stack_end: - context="#"; - break; - case __equal: - context="="; - break; - case __cmp_equal: - context="=="; - break; - case __cmp_not_equal: - context="!="; - break; - case __cmp_less: - context="<"; - break; - case __cmp_less_or_equal: - context="<="; - break; - case __cmp_more: - context=">"; - break; - case __cmp_more_or_equal: - context=">="; - break; - case __and_operator: - context="and"; - break; - case __or_operator: - context="or"; - break; - case __nor_operator: - context="!"; - break; - case __add_operator: - context="+"; - break; - case __sub_operator: - context="-"; - break; - case __mul_operator: - context="*"; - break; - case __div_operator: - context="/"; - break; - case __link_operator: - context="~"; - break; - case __add_equal: - context="+="; - break; - case __sub_equal: - context="-="; - break; - case __mul_equal: - context="*="; - break; - case __div_equal: - context="/="; - break; - case __link_equal: - context="~="; - break; - case __left_brace: - context="{"; - break; - case __right_brace: - context="}"; - break; - case __left_bracket: - context="["; - break; - case __right_bracket: - context="]"; - break; - case __left_curve: - context="("; - break; - case __right_curve: - context=")"; - break; - case __semi: - context=";"; - break; - case __comma: - context=","; - break; - case __colon: - context=":"; - break; - case __dot: - context="."; - break; - case __var: - context="var"; - break; - case __func: - context="func"; - break; - case __id: - context="id"; - break; - case __number: - context="number"; - break; - case __string: - context="string"; - break; - case __char: - context="char"; - break; - case __continue: - context="continue"; - break; - case __break: - context="break"; - break; - case __for: - context="for"; - break; - case __forindex: - context="forindex"; - break; - case __foreach: - context="foreach"; - break; - case __while: - context="while"; - break; - case __if: - context="if"; - break; - case __elsif: - context="elsif"; - break; - case __else: - context="else"; - break; - case __return: - context="return"; - break; - case __scalar: - context="scalar"; - break; - case __list: - context="list"; - break; - case __hash: - context="hash"; - break; - case __hash_member: - context="hash_member"; - break; - case __statement: - context="statement"; - break; - case __function: - context="function"; - break; - case __call_function: - context="call_func"; - break; - case __definition: - context="definition"; - break; - case __assignment: - context="assignment"; - break; - case __calculation: - context="calc"; - break; - case __loop: - context="loop"; - break; - case __choose: - context="choose"; - break; - case __program: - context="program"; - break; - } - std::cout< main_stack; - std::stack comp_stack; - public: - void set_stack_empty() - { - while(!main_stack.empty()) - main_stack.pop(); - while(!comp_stack.empty()) - comp_stack.pop(); - main_stack.push(__stack_end); - comp_stack.push(__stack_end); - } - void stack_input(std::stack& temp) - { - set_stack_empty(); - while(!temp.empty()) - { - main_stack.push(temp.top().type); - temp.pop(); - } - return; - } - void print_stack(std::stack& temp) - { - std::stack t; - while(!temp.empty()) - { - t.push(temp.top()); - print_token(t.top()); - std::cout<<" "; - temp.pop(); - } - while(!t.empty()) - { - temp.push(t.top()); - t.pop(); - } - return; - } - void print_main_and_comp() - { - std::cout<<">>[Main stack] "; - print_stack(main_stack); - std::cout<>[Comp stack] "; - print_stack(comp_stack); - std::cout< temp; - for(int i=0;i=0;--j) - { - if(!par[i].tokens[j]) - continue; - // if par[i].tokens[j] is 0 then continue until the tokens[j] is not 0 - temp.push(comp_stack.top()); - comp_stack.pop(); - if((par[i].tokens[j]!=temp.top()) || (comp_stack.empty() && par[i].tokens[j])) - { - while(!temp.empty()) - { - comp_stack.push(temp.top()); - temp.pop(); - } - break; - } - if((par[i].tokens[j]==temp.top()) && (j==0)) - { - comp_stack.push(par[i].res); - return true; - } - } - } - return false; - } - void main_comp_progress() - { - print_main_and_comp(); - while(main_stack.top()!=__stack_end) - { - comp_stack.push(main_stack.top()); - main_stack.pop(); - print_main_and_comp(); - while(1) - { - if(!reducable()) - break; - print_main_and_comp(); - } - } - if(comp_stack.top()==__program) - { - comp_stack.pop(); - if(comp_stack.top()==__stack_end) - std::cout<<">>[Parse] 0 error(s)."<>[Parse] Error:"<>[Parse] Error:"<>[Parse] Complete checking."< parser; - public: - void parse_process(std::list& lexer) - { - while(!parser.empty()) - parser.pop(); - for(std::list::iterator i=lexer.begin();i!=lexer.end();++i) - { - parse_unit temp_parse; - temp_parse.line=(*i).line; - if(((*i).content=="var") || ((*i).content=="func") || ((*i).content=="return") || ((*i).content=="nil") || ((*i).content=="continue") || ((*i).content=="break") || ((*i).content=="and") || ((*i).content=="or")) - { - if((*i).content=="var") - temp_parse.type=__var; - else if((*i).content=="func") - temp_parse.type=__func; - else if((*i).content=="return") - temp_parse.type=__return; - else if((*i).content=="nil") - temp_parse.type=__number; - else if((*i).content=="continue") - temp_parse.type=__continue; - else if((*i).content=="break") - temp_parse.type=__break; - else if((*i).content=="and") - temp_parse.type=__and_operator; - else if((*i).content=="or") - temp_parse.type=__or_operator; - } - else if((*i).type==IDENTIFIER) - { - temp_parse.type=__id; - } - else if(((*i).content=="for") || ((*i).content=="foreach") || ((*i).content=="while") || ((*i).content=="forindex")) - { - if((*i).content=="for") - temp_parse.type=__for; - else if((*i).content=="forindex") - temp_parse.type=__forindex; - else if((*i).content=="foreach") - temp_parse.type=__foreach; - else if((*i).content=="while") - temp_parse.type=__while; - } - else if(((*i).content=="if") || ((*i).content=="else") || ((*i).content=="elsif")) - { - if((*i).content=="if") - temp_parse.type=__if; - else if((*i).content=="else") - temp_parse.type=__else; - else if((*i).content=="elsif") - temp_parse.type=__elsif; - } - else if(((*i).content=="==") || ((*i).content=="!=") || ((*i).content==">") || ((*i).content==">=") || ((*i).content=="<") || ((*i).content=="<=")) - { - if((*i).content=="==") - temp_parse.type=__cmp_equal; - else if((*i).content=="!=") - temp_parse.type=__cmp_not_equal; - else if((*i).content==">") - temp_parse.type=__cmp_more; - else if((*i).content==">=") - temp_parse.type=__cmp_more_or_equal; - else if((*i).content=="<") - temp_parse.type=__cmp_less; - else if((*i).content=="<=") - temp_parse.type=__cmp_less_or_equal; - } - else if(((*i).content==";") || ((*i).content==",") || ((*i).content=="=") || ((*i).content==":") || ((*i).content==".")) - { - if((*i).content==";") - temp_parse.type=__semi; - else if((*i).content==",") - temp_parse.type=__comma; - else if((*i).content=="=") - temp_parse.type=__equal; - else if((*i).content==":") - temp_parse.type=__colon; - else if((*i).content==".") - temp_parse.type=__dot; - } - else if(((*i).type==NUMBER) || ((*i).type==STRING) || ((*i).type==CHAR)) - { - if((*i).type==NUMBER) - temp_parse.type=__number; - else if((*i).type==STRING) - temp_parse.type=__string; - else if((*i).type==CHAR) - temp_parse.type=__char; - } - else if(((*i).content=="+") || ((*i).content=="-") || ((*i).content=="*") || ((*i).content=="/") || ((*i).content=="~") || ((*i).content=="!")) - { - if((*i).content=="+") - temp_parse.type=__add_operator; - else if((*i).content=="-") - temp_parse.type=__sub_operator; - else if((*i).content=="*") - temp_parse.type=__mul_operator; - else if((*i).content=="/") - temp_parse.type=__div_operator; - else if((*i).content=="~") - temp_parse.type=__link_operator; - else if((*i).content=="!") - temp_parse.type=__nor_operator; - } - else if(((*i).content=="+=") || ((*i).content=="-=") || ((*i).content=="*=") || ((*i).content=="/=") || ((*i).content=="~=")) - { - if((*i).content=="+=") - temp_parse.type=__add_equal; - else if((*i).content=="-=") - temp_parse.type=__sub_equal; - else if((*i).content=="*=") - temp_parse.type=__mul_equal; - else if((*i).content=="/=") - temp_parse.type=__div_equal; - else if((*i).content=="~=") - temp_parse.type=__link_equal; - } - else if(((*i).content=="(") || ((*i).content==")") || ((*i).content=="[") || ((*i).content=="]") || ((*i).content=="{") || ((*i).content=="}")) - { - char c=(*i).content[0]; - switch(c) - { - case '(': - temp_parse.type=__left_curve; - break; - case ')': - temp_parse.type=__right_curve; - break; - case '[': - temp_parse.type=__left_bracket; - break; - case ']': - temp_parse.type=__right_bracket; - break; - case '{': - temp_parse.type=__left_brace; - break; - case '}': - temp_parse.type=__right_brace; - break; - } - } - parser.push(temp_parse);//push this into stack - } - std::stack temp; - while(!parser.empty()) - { - temp.push(parser.top()); - parser.pop(); - } - PDA automata; - automata.stack_input(temp); - automata.main_comp_progress(); - return; - } -}; - -int main() -{ - std::string filename; - resource_programme_process prog; - nasal_lexer lex; - nasal_parser pas; - while(1) - { - std::cin>>filename; - prog.input_file(filename); - lex.lexer_process(prog.use_file()); - pas.parse_process(lex.return_list()); - } - return 0; -}