00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00020 #ifndef SHPARSER_HPP
00021 #define SHPARSER_HPP
00022
00023 #include <stack>
00024 #include "ShDllExport.hpp"
00025 #include "ShCtrlGraph.hpp"
00026 #include "ShToken.hpp"
00027
00028 namespace SH {
00029
00034 class
00035 SH_DLLEXPORT ShParser {
00036 public:
00038 static ShParser* instance();
00039
00042 void parse(ShCtrlGraphNodePtr& head, ShCtrlGraphNodePtr& tail, ShBlockListPtr blocks);
00043
00044 private:
00045
00046 ShParser() {}
00047
00048 void parseBlock(ShCtrlGraphNodePtr& head, ShCtrlGraphNodePtr& tail, ShBasicBlockPtr block);
00049 void parseStmts(ShCtrlGraphNodePtr& head, ShCtrlGraphNodePtr& tail, ShBlockListPtr blocks);
00050 void parseIf(ShCtrlGraphNodePtr& head, ShCtrlGraphNodePtr& tail, ShBlockListPtr blocks);
00051 void parseFor(ShCtrlGraphNodePtr& head, ShCtrlGraphNodePtr& tail, ShBlockListPtr blocks);
00052 void parseWhile(ShCtrlGraphNodePtr& head, ShCtrlGraphNodePtr& tail, ShBlockListPtr blocks);
00053 void parseDo(ShCtrlGraphNodePtr& head, ShCtrlGraphNodePtr& tail, ShBlockListPtr blocks);
00054 void parseSection(ShCtrlGraphNodePtr& head, ShCtrlGraphNodePtr& tail, ShBlockListPtr blocks);
00055 void parse_break(ShCtrlGraphNodePtr& head, ShCtrlGraphNodePtr& tail, ShBlockListPtr blocks);
00056 void parse_continue(ShCtrlGraphNodePtr& head, ShCtrlGraphNodePtr& tail, ShBlockListPtr blocks);
00057
00059 ShTokenPtr popToken(ShBlockListPtr blocks);
00061 ShTokenPtr popToken(ShBlockListPtr blocks, ShTokenType expectedType, unsigned int expectedArgs=0);
00062
00064 void push_scope(ShCtrlGraphNodePtr& break_node, ShCtrlGraphNodePtr& continue_node);
00066 void pop_scope();
00067
00068
00069 std::stack<ShCtrlGraphNodePtr> m_break_node;
00070 std::stack<ShCtrlGraphNodePtr> m_continue_node;
00071
00072
00073 ShParser(const ShParser&);
00074 };
00075
00076 }
00077
00078 #endif