From 33bd8b0eab143c6ab7cf228f8ad429daa3cba060 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Tue, 9 Jun 2015 23:44:50 +0300 Subject: Add flag for each node parser for parse child nodes or not. This solve recursion issue. --- src/nodes/base/node.h | 2 ++ src/parsers/blocknode.cpp | 3 +++ src/parsers/decl/function_decl.cpp | 3 +++ src/parsers/decl/parm_decl.cpp | 4 ++++ src/parsers/decl/result_decl.cpp | 3 +++ src/parsers/decl/type_decl.cpp | 5 +++++ src/parsers/decl/var_decl.cpp | 8 +++++--- src/parsers/expr/addr_expr.cpp | 3 +++ src/parsers/expr/bind_expr.cpp | 3 +++ src/parsers/expr/call_expr.cpp | 4 ++++ src/parsers/expr/cleanuppoint_expr.cpp | 3 +++ src/parsers/expr/cond_expr.cpp | 3 +++ src/parsers/expr/convert_expr.cpp | 3 +++ src/parsers/expr/decl_expr.cpp | 3 +++ src/parsers/expr/eq_expr.cpp | 3 +++ src/parsers/expr/ge_expr.cpp | 3 +++ src/parsers/expr/gt_expr.cpp | 3 +++ src/parsers/expr/indirect_ref.cpp | 3 +++ src/parsers/expr/init_expr.cpp | 3 +++ src/parsers/expr/le_expr.cpp | 3 +++ src/parsers/expr/loop_expr.cpp | 3 +++ src/parsers/expr/lt_expr.cpp | 3 +++ src/parsers/expr/minus_expr.cpp | 3 +++ src/parsers/expr/modify_expr.cpp | 3 +++ src/parsers/expr/mult_expr.cpp | 3 +++ src/parsers/expr/ne_expr.cpp | 3 +++ src/parsers/expr/nop_expr.cpp | 3 +++ src/parsers/expr/plus_expr.cpp | 3 +++ src/parsers/expr/pointerplus_expr.cpp | 3 +++ src/parsers/expr/return_expr.cpp | 3 +++ src/parsers/generic.cpp | 10 +++++++--- src/parsers/generic.h | 6 ++++-- src/parsers/list/statement_list.cpp | 3 +++ src/parsers/list/tree_list.cpp | 3 +++ src/parsers/stmt/expr_stmt.cpp | 3 +++ src/parsers/stmt/if_stmt.cpp | 3 +++ src/parsers/stmt/while_stmt.cpp | 3 +++ src/parsers/type/function_type.cpp | 3 +++ src/parsers/type/integer_type.cpp | 3 +++ src/parsers/type/pointer_type.cpp | 3 +++ src/parsers/type/void_type.cpp | 3 +++ 41 files changed, 133 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/nodes/base/node.h b/src/nodes/base/node.h index ad8fe10..1331467 100644 --- a/src/nodes/base/node.h +++ b/src/nodes/base/node.h @@ -42,6 +42,7 @@ struct Node column(-1), treeNumber(0), indent(0), + parseChilds(true), noLabel(false) { allocations ++; @@ -73,6 +74,7 @@ struct Node int column; int treeNumber; int indent; + bool parseChilds; bool noLabel; }; diff --git a/src/parsers/blocknode.cpp b/src/parsers/blocknode.cpp index b83cf81..a3b15cb 100644 --- a/src/parsers/blocknode.cpp +++ b/src/parsers/blocknode.cpp @@ -39,6 +39,9 @@ void parseBlockNode(BlockNode *node) } Log::dump(node); + if (!node->parseChilds) + return; + FOR_CHAIN(node->gccNode, it, BLOCK_VARS, DECL_CHAIN) { node->vars.push_back(static_cast(createParseNode( diff --git a/src/parsers/decl/function_decl.cpp b/src/parsers/decl/function_decl.cpp index fd3a931..76f9f00 100644 --- a/src/parsers/decl/function_decl.cpp +++ b/src/parsers/decl/function_decl.cpp @@ -46,6 +46,9 @@ void parseFunctionDeclNode(FunctionDeclNode *node) setPrintField(node, DECL_EXTERNAL, isExternal); setPrintField(node, TREE_PUBLIC, isPublic); + if (!node->parseChilds) + return; + fillDeclAttributes(node); node->functionType = static_cast(createParseNode( node, diff --git a/src/parsers/decl/parm_decl.cpp b/src/parsers/decl/parm_decl.cpp index 5f52d05..89b3bcb 100644 --- a/src/parsers/decl/parm_decl.cpp +++ b/src/parsers/decl/parm_decl.cpp @@ -39,6 +39,10 @@ void parseParmDeclNode(ParmDeclNode *node) Log::dump(node); fillDeclAutoGenerated(node); + + if (!node->parseChilds) + return; + fillDeclAttributes(node); node->declType = static_cast(createParseNode( diff --git a/src/parsers/decl/result_decl.cpp b/src/parsers/decl/result_decl.cpp index d4decb3..a3f4015 100644 --- a/src/parsers/decl/result_decl.cpp +++ b/src/parsers/decl/result_decl.cpp @@ -39,6 +39,9 @@ void parseResultDeclNode(ResultDeclNode *node) fillDeclAutoGenerated(node); + if (!node->parseChilds) + return; + fillDeclAttributes(node); node->resultType = static_cast(createParseNode( node, diff --git a/src/parsers/decl/type_decl.cpp b/src/parsers/decl/type_decl.cpp index a87f4a0..c266a96 100644 --- a/src/parsers/decl/type_decl.cpp +++ b/src/parsers/decl/type_decl.cpp @@ -36,9 +36,14 @@ void parseTypeDeclNode(TypeDeclNode *node) Log::dump(node); fillDeclAutoGenerated(node); + + if (!node->parseChilds) + return; + fillDeclAttributes(node); // going to parent +// probably need use parseChilds == false? // createParseNode( // node, // TREE_TYPE(node->gccNode), diff --git a/src/parsers/decl/var_decl.cpp b/src/parsers/decl/var_decl.cpp index 661f421..f99dc6a 100644 --- a/src/parsers/decl/var_decl.cpp +++ b/src/parsers/decl/var_decl.cpp @@ -41,6 +41,9 @@ void parseVarDeclNode(VarDeclNode *node) setPrintField(node, TREE_USED, isUsed); fillDeclAutoGenerated(node); + if (!node->parseChilds) + return; + fillDeclAttributes(node); node->declSize = static_cast(createParseNode( @@ -55,12 +58,11 @@ void parseVarDeclNode(VarDeclNode *node) "var type")); // not loading because it reference self recursivly -/* node->initial = createParseNode( node, DECL_INITIAL(node->gccNode), - "initial"); -*/ + "initial", + false); } } diff --git a/src/parsers/expr/addr_expr.cpp b/src/parsers/expr/addr_expr.cpp index f831e4e..459ed2d 100644 --- a/src/parsers/expr/addr_expr.cpp +++ b/src/parsers/expr/addr_expr.cpp @@ -34,6 +34,9 @@ void parseAddrExprNode(AddrExprNode *node) fillExprLocation(node); Log::dump(node); + if (!node->parseChilds) + return; + fillExprOperands(node); } diff --git a/src/parsers/expr/bind_expr.cpp b/src/parsers/expr/bind_expr.cpp index 1157163..174b9c3 100644 --- a/src/parsers/expr/bind_expr.cpp +++ b/src/parsers/expr/bind_expr.cpp @@ -34,6 +34,9 @@ void parseBindExprNode(BindExprNode *node) fillExprLocation(node); Log::dump(node); + if (!node->parseChilds) + return; + fillExprOperands(node); // args 0 - BIND_EXPR_VARS diff --git a/src/parsers/expr/call_expr.cpp b/src/parsers/expr/call_expr.cpp index f3072bf..b30136e 100644 --- a/src/parsers/expr/call_expr.cpp +++ b/src/parsers/expr/call_expr.cpp @@ -41,6 +41,10 @@ void parseCallExprNode(CallExprNode *node) node->functionName = internal_fn_name(CALL_EXPR_IFN (node->gccNode)); Log::dump(node, "- function: %s", node->functionName.c_str()); + + if (!node->parseChilds) + return; + const int argsCount = call_expr_nargs(node->gccNode); for (int f = 0; f < argsCount; f ++) { diff --git a/src/parsers/expr/cleanuppoint_expr.cpp b/src/parsers/expr/cleanuppoint_expr.cpp index b08b9e1..017d5aa 100644 --- a/src/parsers/expr/cleanuppoint_expr.cpp +++ b/src/parsers/expr/cleanuppoint_expr.cpp @@ -34,6 +34,9 @@ void parseCleanupPointExprNode(CleanupPointExprNode *node) fillExprLocation(node); Log::dump(node); + if (!node->parseChilds) + return; + fillExprOperands(node); } diff --git a/src/parsers/expr/cond_expr.cpp b/src/parsers/expr/cond_expr.cpp index 2129059..de207e4 100644 --- a/src/parsers/expr/cond_expr.cpp +++ b/src/parsers/expr/cond_expr.cpp @@ -34,6 +34,9 @@ void parseCondExprNode(CondExprNode *node) fillExprLocation(node); Log::dump(node); + if (!node->parseChilds) + return; + fillExprOperands(node); } diff --git a/src/parsers/expr/convert_expr.cpp b/src/parsers/expr/convert_expr.cpp index bb74e24..b489b25 100644 --- a/src/parsers/expr/convert_expr.cpp +++ b/src/parsers/expr/convert_expr.cpp @@ -34,6 +34,9 @@ void parseConvertExprNode(ConvertExprNode *node) fillExprLocation(node); Log::dump(node); + if (!node->parseChilds) + return; + fillExprOperands(node); } diff --git a/src/parsers/expr/decl_expr.cpp b/src/parsers/expr/decl_expr.cpp index 7a333f3..d572433 100644 --- a/src/parsers/expr/decl_expr.cpp +++ b/src/parsers/expr/decl_expr.cpp @@ -34,6 +34,9 @@ void parseDeclExprNode(DeclExprNode *node) fillExprLocation(node); Log::dump(node); + if (!node->parseChilds) + return; + fillExprOperands(node); // args 0 - DECL_EXPR_DECL diff --git a/src/parsers/expr/eq_expr.cpp b/src/parsers/expr/eq_expr.cpp index 7cf458c..58e18d6 100644 --- a/src/parsers/expr/eq_expr.cpp +++ b/src/parsers/expr/eq_expr.cpp @@ -34,6 +34,9 @@ void parseEqExprNode(EqExprNode *node) fillExprLocation(node); Log::dump(node); + if (!node->parseChilds) + return; + fillExprOperands(node); } diff --git a/src/parsers/expr/ge_expr.cpp b/src/parsers/expr/ge_expr.cpp index 96d536e..7145bd3 100644 --- a/src/parsers/expr/ge_expr.cpp +++ b/src/parsers/expr/ge_expr.cpp @@ -34,6 +34,9 @@ void parseGeExprNode(GeExprNode *node) fillExprLocation(node); Log::dump(node); + if (!node->parseChilds) + return; + fillExprOperands(node); } diff --git a/src/parsers/expr/gt_expr.cpp b/src/parsers/expr/gt_expr.cpp index d0ef3bf..d622832 100644 --- a/src/parsers/expr/gt_expr.cpp +++ b/src/parsers/expr/gt_expr.cpp @@ -34,6 +34,9 @@ void parseGtExprNode(GtExprNode *node) fillExprLocation(node); Log::dump(node); + if (!node->parseChilds) + return; + fillExprOperands(node); } diff --git a/src/parsers/expr/indirect_ref.cpp b/src/parsers/expr/indirect_ref.cpp index 961050b..43b030a 100644 --- a/src/parsers/expr/indirect_ref.cpp +++ b/src/parsers/expr/indirect_ref.cpp @@ -34,6 +34,9 @@ void parseIndirectRefNode(IndirectRefNode *node) fillExprLocation(node); Log::dump(node); + if (!node->parseChilds) + return; + fillExprOperands(node); } diff --git a/src/parsers/expr/init_expr.cpp b/src/parsers/expr/init_expr.cpp index 44baf51..db9673e 100644 --- a/src/parsers/expr/init_expr.cpp +++ b/src/parsers/expr/init_expr.cpp @@ -34,6 +34,9 @@ void parseInitExprNode(InitExprNode *node) fillExprLocation(node); Log::dump(node); + if (!node->parseChilds) + return; + fillExprOperands(node); // args 0 - left side diff --git a/src/parsers/expr/le_expr.cpp b/src/parsers/expr/le_expr.cpp index 15e90a8..e60227e 100644 --- a/src/parsers/expr/le_expr.cpp +++ b/src/parsers/expr/le_expr.cpp @@ -34,6 +34,9 @@ void parseLeExprNode(LeExprNode *node) fillExprLocation(node); Log::dump(node); + if (!node->parseChilds) + return; + fillExprOperands(node); } diff --git a/src/parsers/expr/loop_expr.cpp b/src/parsers/expr/loop_expr.cpp index 78846f0..5b38eb4 100644 --- a/src/parsers/expr/loop_expr.cpp +++ b/src/parsers/expr/loop_expr.cpp @@ -34,6 +34,9 @@ void parseLoopExprNode(LoopExprNode *node) fillExprLocation(node); Log::dump(node); + if (!node->parseChilds) + return; + // fillExprOperands(node); node->body = createParseNode( diff --git a/src/parsers/expr/lt_expr.cpp b/src/parsers/expr/lt_expr.cpp index bf3f330..bca5b08 100644 --- a/src/parsers/expr/lt_expr.cpp +++ b/src/parsers/expr/lt_expr.cpp @@ -34,6 +34,9 @@ void parseLtExprNode(LtExprNode *node) fillExprLocation(node); Log::dump(node); + if (!node->parseChilds) + return; + fillExprOperands(node); } diff --git a/src/parsers/expr/minus_expr.cpp b/src/parsers/expr/minus_expr.cpp index 9922b8e..b3217ba 100644 --- a/src/parsers/expr/minus_expr.cpp +++ b/src/parsers/expr/minus_expr.cpp @@ -34,6 +34,9 @@ void parseMinusExprNode(MinusExprNode *node) fillExprLocation(node); Log::dump(node); + if (!node->parseChilds) + return; + fillExprOperands(node); } diff --git a/src/parsers/expr/modify_expr.cpp b/src/parsers/expr/modify_expr.cpp index af225e7..759e40d 100644 --- a/src/parsers/expr/modify_expr.cpp +++ b/src/parsers/expr/modify_expr.cpp @@ -34,6 +34,9 @@ void parseModifyExprNode(ModifyExprNode *node) fillExprLocation(node); Log::dump(node); + if (!node->parseChilds) + return; + fillExprOperands(node); } diff --git a/src/parsers/expr/mult_expr.cpp b/src/parsers/expr/mult_expr.cpp index e67b40c..419c9f2 100644 --- a/src/parsers/expr/mult_expr.cpp +++ b/src/parsers/expr/mult_expr.cpp @@ -34,6 +34,9 @@ void parseMultExprNode(MultExprNode *node) fillExprLocation(node); Log::dump(node); + if (!node->parseChilds) + return; + fillExprOperands(node); } diff --git a/src/parsers/expr/ne_expr.cpp b/src/parsers/expr/ne_expr.cpp index ba20614..a6a155d 100644 --- a/src/parsers/expr/ne_expr.cpp +++ b/src/parsers/expr/ne_expr.cpp @@ -34,6 +34,9 @@ void parseNeExprNode(NeExprNode *node) fillExprLocation(node); Log::dump(node); + if (!node->parseChilds) + return; + fillExprOperands(node); } diff --git a/src/parsers/expr/nop_expr.cpp b/src/parsers/expr/nop_expr.cpp index 1efecc5..cfdae94 100644 --- a/src/parsers/expr/nop_expr.cpp +++ b/src/parsers/expr/nop_expr.cpp @@ -34,6 +34,9 @@ void parseNopExprNode(NopExprNode *node) fillExprLocation(node); Log::dump(node); + if (!node->parseChilds) + return; + fillExprOperands(node); } diff --git a/src/parsers/expr/plus_expr.cpp b/src/parsers/expr/plus_expr.cpp index 41dceaa..0fcb300 100644 --- a/src/parsers/expr/plus_expr.cpp +++ b/src/parsers/expr/plus_expr.cpp @@ -34,6 +34,9 @@ void parsePlusExprNode(PlusExprNode *node) fillExprLocation(node); Log::dump(node); + if (!node->parseChilds) + return; + fillExprOperands(node); } diff --git a/src/parsers/expr/pointerplus_expr.cpp b/src/parsers/expr/pointerplus_expr.cpp index 13963d7..64c445e 100644 --- a/src/parsers/expr/pointerplus_expr.cpp +++ b/src/parsers/expr/pointerplus_expr.cpp @@ -34,6 +34,9 @@ void parsePointerPlusExprNode(PointerPlusExprNode *node) fillExprLocation(node); Log::dump(node); + if (!node->parseChilds) + return; + fillExprOperands(node); } diff --git a/src/parsers/expr/return_expr.cpp b/src/parsers/expr/return_expr.cpp index b36993a..7c2e5fc 100644 --- a/src/parsers/expr/return_expr.cpp +++ b/src/parsers/expr/return_expr.cpp @@ -34,6 +34,9 @@ void parseReturnExprNode(ReturnExprNode *node) fillExprLocation(node); Log::dump(node); + if (!node->parseChilds) + return; + fillExprOperands(node); } diff --git a/src/parsers/generic.cpp b/src/parsers/generic.cpp index f1a13e8..12b3a06 100644 --- a/src/parsers/generic.cpp +++ b/src/parsers/generic.cpp @@ -34,18 +34,21 @@ namespace Generic Node *createParseNode(Node *parent, tree gccNode, - std::string tag) + std::string tag, + bool parseChilds) { return createParseNode(parent, gccNode, ERROR_MARK, - tag); + tag, + parseChilds); } Node *createParseNode(Node *parent, tree gccNode, tree_code wantType, - std::string tag) + std::string tag, + bool parseChilds) { if (gccNode == NULL_TREE) { @@ -80,6 +83,7 @@ Node *createParseNode(Node *parent, { node->parent = parent; node->gccNode = gccNode; + node->parseChilds = parseChilds; if (parent) { node->indent = parent->indent + 1; diff --git a/src/parsers/generic.h b/src/parsers/generic.h index 32aadc2..246f119 100644 --- a/src/parsers/generic.h +++ b/src/parsers/generic.h @@ -42,12 +42,14 @@ namespace Generic Node *createParseNode(Node *parent, tree gccNode, - std::string tag = ""); + std::string tag = "", + bool parseChilds = true); Node *createParseNode(Node *parent, tree gccNode, tree_code wantType, - std::string tag = ""); + std::string tag = "", + bool parseChilds = true); } #endif // PARSERS_GENERIC_H diff --git a/src/parsers/list/statement_list.cpp b/src/parsers/list/statement_list.cpp index 4b4ca9e..78e599b 100644 --- a/src/parsers/list/statement_list.cpp +++ b/src/parsers/list/statement_list.cpp @@ -33,6 +33,9 @@ void parseStatementListNode(StatementListNode *node) fillType(node); Log::dump(node); + if (!node->parseChilds) + return; + for (tree_stmt_iterator it = tsi_start (node->gccNode); !tsi_end_p (it); tsi_next (&it)) diff --git a/src/parsers/list/tree_list.cpp b/src/parsers/list/tree_list.cpp index b264a66..6ee383f 100644 --- a/src/parsers/list/tree_list.cpp +++ b/src/parsers/list/tree_list.cpp @@ -31,6 +31,9 @@ void parseTreeListNode(TreeListNode *node) fillType(node); Log::dump(node); + if (!node->parseChilds) + return; + node->purpose = createParseNode( node, TREE_PURPOSE(node->gccNode), diff --git a/src/parsers/stmt/expr_stmt.cpp b/src/parsers/stmt/expr_stmt.cpp index 46afdf5..3cadbff 100644 --- a/src/parsers/stmt/expr_stmt.cpp +++ b/src/parsers/stmt/expr_stmt.cpp @@ -35,6 +35,9 @@ void parseExprStmtNode(ExprStmtNode *node) fillType(node); Log::dump(node); + if (!node->parseChilds) + return; + node->expression = static_cast(createParseNode( node, EXPR_STMT_EXPR(node->gccNode), diff --git a/src/parsers/stmt/if_stmt.cpp b/src/parsers/stmt/if_stmt.cpp index 6a5c8b5..9800f07 100644 --- a/src/parsers/stmt/if_stmt.cpp +++ b/src/parsers/stmt/if_stmt.cpp @@ -33,6 +33,9 @@ void parseIfStmtNode(IfStmtNode *node) fillType(node); Log::dump(node); + if (!node->parseChilds) + return; + node->condition = createParseNode( node, IF_COND(node->gccNode), diff --git a/src/parsers/stmt/while_stmt.cpp b/src/parsers/stmt/while_stmt.cpp index 5814462..1c82aba 100644 --- a/src/parsers/stmt/while_stmt.cpp +++ b/src/parsers/stmt/while_stmt.cpp @@ -33,6 +33,9 @@ void parseWhileStmtNode(WhileStmtNode *node) fillType(node); Log::dump(node); + if (!node->parseChilds) + return; + node->condition = createParseNode( node, WHILE_COND(node->gccNode), diff --git a/src/parsers/type/function_type.cpp b/src/parsers/type/function_type.cpp index ae55bf6..9740cf7 100644 --- a/src/parsers/type/function_type.cpp +++ b/src/parsers/type/function_type.cpp @@ -33,6 +33,9 @@ void parseFunctionTypeNode(FunctionTypeNode *node) fillType(node); Log::dump(node); + if (!node->parseChilds) + return; + fillTypeName(node); node->returnType = static_cast(createParseNode( node, diff --git a/src/parsers/type/integer_type.cpp b/src/parsers/type/integer_type.cpp index 4633a4e..0da88e1 100644 --- a/src/parsers/type/integer_type.cpp +++ b/src/parsers/type/integer_type.cpp @@ -41,6 +41,9 @@ void parseIntegerTypeNode(IntegerTypeNode *node) else Log::dumpRaw(node, "- signed"); + if (!node->parseChilds) + return; + fillTypeName(node); fillTypeAttributes(node); node->typeSize = static_cast(createParseNode( diff --git a/src/parsers/type/pointer_type.cpp b/src/parsers/type/pointer_type.cpp index df64497..9b2a197 100644 --- a/src/parsers/type/pointer_type.cpp +++ b/src/parsers/type/pointer_type.cpp @@ -33,6 +33,9 @@ void parsePointerTypeNode(PointerTypeNode *node) fillType(node); Log::dump(node); + if (!node->parseChilds) + return; + fillTypeName(node); fillTypeAttributes(node); node->nestedType = static_cast(createParseNode( diff --git a/src/parsers/type/void_type.cpp b/src/parsers/type/void_type.cpp index cea3e6f..748142d 100644 --- a/src/parsers/type/void_type.cpp +++ b/src/parsers/type/void_type.cpp @@ -33,6 +33,9 @@ void parseVoidTypeNode(VoidTypeNode *node) fillType(node); Log::dump(node); + if (!node->parseChilds) + return; + fillTypeName(node); fillTypeAttributes(node); } -- cgit v1.2.3-70-g09d2