#ifndef __NASAL_PARSER_H__ #define __NASAL_PARSER_H__ #include "nasal_token_type.h" class nasal_parser { private: ast_tree_node root; std::stack parse; std::stack node_cache; token this_token; int error; int warning; public: nasal_parser() { error=0; warning=0; this_token.type=0; } void get_token() { if(parse.empty()) { this_token.type=0; return; } this_token=parse.top(); parse.pop(); return; } void print_parser_stack() { if(parse.empty()) return; int line=0; std::stack temp; while(!parse.empty()) { temp.push(parse.top()); if(line!=temp.top().line) { if(line+1==temp.top().line) { line=temp.top().line; if(line==1) std::cout<<"line "< "; parse.pop(); } while(!temp.empty()) { parse.push(temp.top()); temp.pop(); } std::cout<& lexer) { while(!parse.empty()) parse.pop(); std::stack temp; for(std::list::iterator i=lexer.begin();i!=lexer.end();++i) { token temp_parse; temp_parse=*i; temp.push(temp_parse);//push this into stack } if(temp.empty()) { std::cout<<">>[Parse] [-Warning] Empty lexer list."<>[Abstract-syntax-tree]"<>[Parse] "<>[Error] line "<>[Error] line "<>[Error] line "<>[Error] line "<>[Error] line "<>[Error] line "<>[Error] line "<>[Error] line "<>[Error] line "<>[Error] line "<>[Error] line "<>[Error] line "<>[Error] line "<>[Error] line "<>[Error] line "<>[Error] line "<>[Error] line "<>[Error] line "<>[Error] line "<>[Error] line "<>[Error] line "<>[Error] line "<>[Error] line "<>[Error] line "<>[Error] line "<>[Error] line "<>[Error] line "<>[Error] line "<>[Error] line "<>[Error] line "<>[Error] line "<>[Error] line "<>[Error] line "<>[Error] line "<>[Error] line "<>[Error] line "<>[Error] line "<>[Error] line "<>[Error] line "<>[Error] line "<>[Error] line "<>[Error] line "<>[Error] line "<>[Error] line "<>[Error] line "<>[Error] line "<>[Error] line "<>[Error] line "<>[Error] line "<>[Error] line "<>[Error] line "<>[Parse] complete generation."<