|
|
@ -3059,7 +3059,6 @@ void outputNode(oop node) |
|
|
|
outputNode(map_get(node, name_symbol)); |
|
|
|
outputNode(map_get(node, semicolon_symbol)); |
|
|
|
break; |
|
|
|
|
|
|
|
case t_C_initializer: |
|
|
|
outputNode(map_get(node, leftCurly_symbol)); |
|
|
|
outputNode(map_get(node, initList_symbol)); |
|
|
@ -3312,6 +3311,386 @@ void outputNode(oop node) |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void outputValue(oop node) { |
|
|
|
if (!node) return; |
|
|
|
switch (getType(node)) { |
|
|
|
case Undefined: |
|
|
|
return; |
|
|
|
case String: |
|
|
|
printf("%s\n", (get(node, String, value))); |
|
|
|
return; |
|
|
|
case Map: |
|
|
|
break; |
|
|
|
case Symbol: |
|
|
|
printf("%s\n", get(node, Symbol, name)); |
|
|
|
return; |
|
|
|
default: |
|
|
|
fprintf(stderr, "\noutputNode: unknown node type %i\n", getType(node)); |
|
|
|
abort(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void printSpace(int depth) { |
|
|
|
for (int i = 0 ; i < depth ; i++) { |
|
|
|
printf(" "); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void outputTree(oop node, int depth) |
|
|
|
{ |
|
|
|
assert(is(Map, node)); |
|
|
|
oop proto= map_get(node, __proto___symbol); |
|
|
|
if (null == proto) { // assume this is just a list of nodes |
|
|
|
size_t size= map_size(node); |
|
|
|
for (size_t i= 0; i < size; ++i) { |
|
|
|
if (!map_hasIntegerKey(node, i)) break; |
|
|
|
outputTree(get(node, Map, elements)[i].value, depth); |
|
|
|
} |
|
|
|
return; |
|
|
|
} |
|
|
|
// proto_number is the enum version of the proto symbol |
|
|
|
proto_t proto_number= get(map_get(proto, __name___symbol), Symbol, prototype); |
|
|
|
printSpace(depth); |
|
|
|
switch (proto_number) { |
|
|
|
case t_Comment: |
|
|
|
break; |
|
|
|
case t_Token: |
|
|
|
printf("TOKEN : "); |
|
|
|
outputValue(map_get(node, text_symbol)); |
|
|
|
break; |
|
|
|
case t_C_int: |
|
|
|
printf("INT : "); |
|
|
|
outputValue(map_get(node, text_symbol)); |
|
|
|
break; |
|
|
|
case t_C_float: |
|
|
|
printf("FLOAT : "); |
|
|
|
outputValue(map_get(node, text_symbol)); |
|
|
|
break; |
|
|
|
case t_C_char: |
|
|
|
printf("CHAR : "); |
|
|
|
outputValue(map_get(node, value_symbol)); |
|
|
|
break; |
|
|
|
case t_C_id: |
|
|
|
printf("ID : "); |
|
|
|
outputValue(map_get(node, identifier_symbol)); |
|
|
|
break; |
|
|
|
case t_C_if: |
|
|
|
outputTree(map_get(node, if_symbol), depth); |
|
|
|
outputTree(map_get(node, lparen_symbol), depth+3); |
|
|
|
outputTree(map_get(node, condition_symbol), depth+3); |
|
|
|
outputTree(map_get(node, rparen_symbol), depth+3); |
|
|
|
outputTree(map_get(node, consequent_symbol), depth+3); |
|
|
|
outputTree(map_get(node, else_symbol), depth); // null if no else clause |
|
|
|
outputTree(map_get(node, alternate_symbol), depth+3); // null if no else clause |
|
|
|
break; |
|
|
|
case t_C_while: |
|
|
|
outputTree(map_get(node, while_symbol), depth); |
|
|
|
outputTree(map_get(node, lparen_symbol), depth+3); |
|
|
|
outputTree(map_get(node, expression_symbol), depth+3); |
|
|
|
outputTree(map_get(node, rparen_symbol), depth+3); |
|
|
|
outputTree(map_get(node, statements_symbol), depth+3); |
|
|
|
break; |
|
|
|
case t_C_do: |
|
|
|
outputTree(map_get(node, do_symbol), depth); |
|
|
|
outputTree(map_get(node, statements_symbol), depth+3); |
|
|
|
outputTree(map_get(node, while_symbol), depth); |
|
|
|
outputTree(map_get(node, lparen_symbol), depth+3); |
|
|
|
outputTree(map_get(node, expression_symbol), depth+3); |
|
|
|
outputTree(map_get(node, rparen_symbol), depth+3); |
|
|
|
outputTree(map_get(node, semicolon_symbol), depth+3); |
|
|
|
break; |
|
|
|
case t_C_for: |
|
|
|
outputTree(map_get(node, for_symbol), depth); |
|
|
|
outputTree(map_get(node, lparen_symbol), depth+3); |
|
|
|
outputTree(map_get(node, initExpr_symbol), depth+3); |
|
|
|
outputTree(map_get(node, firstSemi_symbol), depth+3); |
|
|
|
outputTree(map_get(node, condExpr_symbol), depth+3); |
|
|
|
outputTree(map_get(node, secondSemi_symbol), depth+3); |
|
|
|
outputTree(map_get(node, incrExpr_symbol), depth+3); |
|
|
|
outputTree(map_get(node, rparen_symbol), depth+3); |
|
|
|
outputTree(map_get(node, statements_symbol), depth+3); |
|
|
|
break; |
|
|
|
case t_C_goto: |
|
|
|
outputTree(map_get(node, gotoTok_symbol), depth); |
|
|
|
outputTree(map_get(node, star_symbol), depth+3); |
|
|
|
outputTree(map_get(node, name_symbol), depth+3); |
|
|
|
outputTree(map_get(node, semicolon_symbol), depth+3); |
|
|
|
break; |
|
|
|
case t_C_initializer: |
|
|
|
printf("INITIALIZER :\n"); |
|
|
|
outputTree(map_get(node, leftCurly_symbol), depth+3); |
|
|
|
outputTree(map_get(node, initList_symbol), depth+3); |
|
|
|
outputTree(map_get(node, comma_symbol), depth+3); |
|
|
|
outputTree(map_get(node, rightCurly_symbol), depth+3); |
|
|
|
break; |
|
|
|
case t_C_range: |
|
|
|
printf("RANGE :\n"); |
|
|
|
outputTree(map_get(node, constExpr1_symbol), depth+3); |
|
|
|
outputTree(map_get(node, ellipsis_symbol), depth+3); |
|
|
|
outputTree(map_get(node, constExpr2_symbol), depth+3); |
|
|
|
break; |
|
|
|
case t_C_switch: |
|
|
|
outputTree(map_get(node, switchTok_symbol), depth); |
|
|
|
outputTree(map_get(node, lparen_symbol), depth+3); |
|
|
|
outputTree(map_get(node, expression_symbol), depth+3); |
|
|
|
outputTree(map_get(node, rparen_symbol), depth+3); |
|
|
|
outputTree(map_get(node, statements_symbol), depth+3); |
|
|
|
break; |
|
|
|
case t_C_case: |
|
|
|
outputTree(map_get(node, caseTok_symbol), depth); |
|
|
|
outputTree(map_get(node, expression_symbol), depth+3); |
|
|
|
outputTree(map_get(node, colon_symbol), depth+3); |
|
|
|
outputTree(map_get(node, statements_symbol), depth+3); |
|
|
|
break; |
|
|
|
case t_C_default: |
|
|
|
outputTree(map_get(node, defaultTok_symbol), depth); |
|
|
|
outputTree(map_get(node, colon_symbol), depth+3); |
|
|
|
outputTree(map_get(node, statements_symbol), depth+3); |
|
|
|
break; |
|
|
|
case t_C_attribution: |
|
|
|
printf("ATTRIBUTION :\n"); |
|
|
|
outputTree(map_get(node, specifiers_symbol), depth+3); |
|
|
|
outputTree(map_get(node, declarators_symbol), depth+3); |
|
|
|
break; |
|
|
|
case t_C_deref: |
|
|
|
printf("DEREF :\n"); |
|
|
|
outputTree(map_get(node, star_symbol), depth+3); |
|
|
|
outputTree(map_get(node, typeQualList_symbol), depth+3); |
|
|
|
outputTree(map_get(node, declarators_symbol), depth+3); |
|
|
|
break; |
|
|
|
case t_C_functionDef: |
|
|
|
printf("FUNCTION DEF :\n"); |
|
|
|
outputTree(map_get(node, specifiers_symbol), depth+3); |
|
|
|
outputTree(map_get(node, declarators_symbol), depth+3); |
|
|
|
outputTree(map_get(node, declarationL_symbol), depth+3); |
|
|
|
outputTree(map_get(node, compoundS_symbol), depth+3); |
|
|
|
break; |
|
|
|
case t_C_sizeOf: |
|
|
|
outputTree(map_get(node, sizeOfTok_symbol), depth); |
|
|
|
outputTree(map_get(node, lparen_symbol), depth+3); |
|
|
|
outputTree(map_get(node, typeName_symbol), depth+3); |
|
|
|
outputTree(map_get(node, rparen_symbol), depth+3); |
|
|
|
break; |
|
|
|
case t_C_alignOf: |
|
|
|
outputTree(map_get(node, alignOfTok_symbol), depth); |
|
|
|
outputTree(map_get(node, lparen_symbol), depth+3); |
|
|
|
outputTree(map_get(node, typeName_symbol), depth+3); |
|
|
|
outputTree(map_get(node, rparen_symbol), depth+3); |
|
|
|
break; |
|
|
|
case t_C_prefix: |
|
|
|
printf("PREFIX :\n"); |
|
|
|
outputTree(map_get(node, operator_symbol), depth+3); |
|
|
|
outputTree(map_get(node, expression_symbol), depth+3); |
|
|
|
break; |
|
|
|
case t_C_postfix: |
|
|
|
printf("POSTFIX :\n"); |
|
|
|
outputTree(map_get(node, expression_symbol), depth+3); |
|
|
|
outputTree(map_get(node, operator_symbol), depth+3); |
|
|
|
break; |
|
|
|
case t_C_unary: |
|
|
|
printf("UNARY :\n"); |
|
|
|
outputTree(map_get(node, operator_symbol), depth+3); |
|
|
|
outputTree(map_get(node, expression_symbol), depth+3); |
|
|
|
break; |
|
|
|
case t_C_binary: |
|
|
|
printf("BINARY \n"); |
|
|
|
outputTree(map_get(node, lhs_symbol), depth+3); |
|
|
|
outputTree(map_get(node, binary_symbol), depth+3); |
|
|
|
outputTree(map_get(node, rhs_symbol), depth+3); |
|
|
|
break; |
|
|
|
case t_C_compound: |
|
|
|
printf("COMPOUND :\n"); |
|
|
|
outputTree(map_get(node, leftCurly_symbol), depth+3); |
|
|
|
outputTree(map_get(node, expression_symbol), depth+3); |
|
|
|
outputTree(map_get(node, rightCurly_symbol), depth+3); |
|
|
|
break; |
|
|
|
case t_C_subexpr: |
|
|
|
printf("SUBEXPR :\n"); |
|
|
|
outputTree(map_get(node, lparen_symbol), depth+3); |
|
|
|
outputTree(map_get(node, declarators_symbol), depth+3); |
|
|
|
outputTree(map_get(node, rparen_symbol), depth+3); |
|
|
|
break; |
|
|
|
case t_C_call: |
|
|
|
printf("CALL :\n"); |
|
|
|
outputTree(map_get(node, declarators_symbol), depth+3); |
|
|
|
outputTree(map_get(node, lparen_symbol), depth+3); |
|
|
|
outputTree(map_get(node, paramTypeL_symbol), depth+3); |
|
|
|
outputTree(map_get(node, rparen_symbol), depth+3); |
|
|
|
break; |
|
|
|
case t_C_array: |
|
|
|
printf("ARRAY :\n"); |
|
|
|
outputTree(map_get(node, declarators_symbol), depth+3); |
|
|
|
outputTree(map_get(node, leftBracket_symbol), depth+3); |
|
|
|
outputTree(map_get(node, static_symbol), depth+3); |
|
|
|
outputTree(map_get(node, typeQualList_symbol), depth+3); |
|
|
|
outputTree(map_get(node, dynamic_symbol), depth+3); |
|
|
|
outputTree(map_get(node, assignExpr_symbol), depth+3); |
|
|
|
outputTree(map_get(node, rightBracket_symbol), depth+3); |
|
|
|
break; |
|
|
|
case t_C_block: |
|
|
|
printf("BLOCK :\n"); |
|
|
|
outputTree(map_get(node, bxor_symbol), depth+3); |
|
|
|
outputTree(map_get(node, typeQualList_symbol), depth+3); |
|
|
|
outputTree(map_get(node, declarators_symbol), depth+3); |
|
|
|
break; |
|
|
|
case t_C_continue: |
|
|
|
outputTree(map_get(node, continueTok_symbol), depth); |
|
|
|
outputTree(map_get(node, semicolon_symbol), depth+3); |
|
|
|
break; |
|
|
|
case t_C_break: |
|
|
|
outputTree(map_get(node, breakTok_symbol), depth); |
|
|
|
outputTree(map_get(node, semicolon_symbol), depth+3); |
|
|
|
break; |
|
|
|
case t_C_return: |
|
|
|
outputTree(map_get(node, returnTok_symbol), depth); |
|
|
|
outputTree(map_get(node, expression_symbol), depth+3); |
|
|
|
outputTree(map_get(node, semicolon_symbol), depth+3); |
|
|
|
break; |
|
|
|
case t_C_exprStatement: |
|
|
|
printf("EXPRESSION :"); |
|
|
|
outputTree(map_get(node, expression_symbol), depth+3); |
|
|
|
outputTree(map_get(node, semicolon_symbol), depth+3); |
|
|
|
break; |
|
|
|
case t_C_asm: |
|
|
|
outputTree(map_get(node, asmTok_symbol), depth); |
|
|
|
outputTree(map_get(node, lparen_symbol), depth+3); |
|
|
|
outputTree(map_get(node, text_symbol), depth+3); |
|
|
|
outputTree(map_get(node, rparen_symbol), depth+3); |
|
|
|
break; |
|
|
|
case t_C_asmExpr: |
|
|
|
printf("ASM EXPR :"); |
|
|
|
outputTree(map_get(node, asmTok_symbol), depth+3); |
|
|
|
outputTree(map_get(node, volatileTok_symbol), depth+3); |
|
|
|
outputTree(map_get(node, gotoTok_symbol), depth+3); |
|
|
|
outputTree(map_get(node, lparen_symbol), depth+3); |
|
|
|
outputTree(map_get(node, text_symbol), depth+3); |
|
|
|
outputTree(map_get(node, element_symbol), depth+3); |
|
|
|
outputTree(map_get(node, lparen_symbol), depth+3); |
|
|
|
break; |
|
|
|
case t_C_asmExprArg: |
|
|
|
printf("ASM EXPR ARG :\n"); |
|
|
|
outputTree(map_get(node, text_symbol), depth+3); |
|
|
|
outputTree(map_get(node, lparen_symbol), depth+3); |
|
|
|
outputTree(map_get(node, expression_symbol), depth+3); |
|
|
|
outputTree(map_get(node, lparen_symbol), depth+3); |
|
|
|
break; |
|
|
|
case t_C_declaration: |
|
|
|
printf("DECLARATION :\n"); |
|
|
|
outputTree(map_get(node, specifiers_symbol), depth+3); |
|
|
|
outputTree(map_get(node, declarators_symbol), depth+3); |
|
|
|
outputTree(map_get(node, semicolon_symbol), depth+3); |
|
|
|
break; |
|
|
|
case t_C_parameter: |
|
|
|
printf("PARAMETER :\n"); |
|
|
|
outputTree(map_get(node, specifiers_symbol), depth+3); |
|
|
|
outputTree(map_get(node, declarators_symbol), depth+3); |
|
|
|
break; |
|
|
|
case t_C_conditional: |
|
|
|
printf("CONDITIONAL :\n"); |
|
|
|
outputTree(map_get(node, logicalOr_symbol), depth+3); |
|
|
|
outputTree(map_get(node, question_symbol), depth+3); |
|
|
|
outputTree(map_get(node, expression_symbol), depth+3); |
|
|
|
outputTree(map_get(node, colon_symbol), depth+3); |
|
|
|
outputTree(map_get(node, condExpr_symbol), depth+3); |
|
|
|
break; |
|
|
|
case t_C_designation: |
|
|
|
printf("DESIGNATION :\n"); |
|
|
|
outputTree(map_get(node, identifier_symbol), depth+3); |
|
|
|
outputTree(map_get(node, colon_symbol), depth+3); |
|
|
|
break; |
|
|
|
case t_C_index: |
|
|
|
printf("INDEX :\n"); |
|
|
|
outputTree(map_get(node, primaryExpr_symbol), depth+3); |
|
|
|
outputTree(map_get(node, leftBracket_symbol), depth+3); |
|
|
|
outputTree(map_get(node, expression_symbol), depth+3); |
|
|
|
outputTree(map_get(node, rightBracket_symbol), depth+3); |
|
|
|
break; |
|
|
|
case t_C_typeOf: |
|
|
|
outputTree(map_get(node, typeOfTok_symbol), depth); |
|
|
|
outputTree(map_get(node, lparen_symbol), depth+3); |
|
|
|
outputTree(map_get(node, typeName_symbol), depth+3); |
|
|
|
outputTree(map_get(node, expression_symbol), depth+3); |
|
|
|
outputTree(map_get(node, rparen_symbol), depth+3); |
|
|
|
break; |
|
|
|
case t_C_cast: |
|
|
|
printf("CAST :\n"); |
|
|
|
outputTree(map_get(node, lparen_symbol), depth+3); |
|
|
|
outputTree(map_get(node, typeName_symbol), depth+3); |
|
|
|
outputTree(map_get(node, rparen_symbol), depth+3); |
|
|
|
outputTree(map_get(node, expression_symbol), depth+3); |
|
|
|
break; |
|
|
|
case t_C_attributeSpec: |
|
|
|
printf("ATTRIBUTE SPEC :\n"); |
|
|
|
outputTree(map_get(node, attributeTok_symbol), depth+3); |
|
|
|
outputTree(map_get(node, llparen_symbol), depth+3); |
|
|
|
outputTree(map_get(node, lrparen_symbol), depth+3); |
|
|
|
outputTree(map_get(node, attributeL_symbol), depth+3); |
|
|
|
outputTree(map_get(node, rlparen_symbol), depth+3); |
|
|
|
outputTree(map_get(node, rrparen_symbol), depth+3); |
|
|
|
break; |
|
|
|
case t_C_aggregate: |
|
|
|
printf("AGGREGATE :\n"); |
|
|
|
outputTree(map_get(node, lparen_symbol), depth+3); |
|
|
|
outputTree(map_get(node, typeName_symbol), depth+3); |
|
|
|
outputTree(map_get(node, rparen_symbol), depth+3); |
|
|
|
outputTree(map_get(node, leftCurly_symbol), depth+3); |
|
|
|
outputTree(map_get(node, initList_symbol), depth+3); |
|
|
|
outputTree(map_get(node, comma_symbol), depth+3); |
|
|
|
outputTree(map_get(node, rightCurly_symbol), depth+3); |
|
|
|
break; |
|
|
|
case t_C_attribute: |
|
|
|
printf("ATTRIBUTE :\n"); |
|
|
|
outputTree(map_get(node, text_symbol), depth+3); |
|
|
|
outputTree(map_get(node, lparen_symbol), depth+3); |
|
|
|
outputTree(map_get(node, expression_symbol), depth+3); |
|
|
|
outputTree(map_get(node, rparen_symbol), depth+3); |
|
|
|
break; |
|
|
|
case t_C_label: |
|
|
|
printf("LABEL :\n"); |
|
|
|
outputTree(map_get(node, name_symbol), depth+3); |
|
|
|
outputTree(map_get(node, colon_symbol), depth+3); |
|
|
|
outputTree(map_get(node, attributeL_symbol), depth+3); |
|
|
|
outputTree(map_get(node, statements_symbol), depth+3); |
|
|
|
break; |
|
|
|
case t_C_labelDeclaration: |
|
|
|
outputTree(map_get(node, labels_symbol), depth); |
|
|
|
outputTree(map_get(node, element_symbol), depth+3); |
|
|
|
outputTree(map_get(node, semicolon_symbol), depth+3); |
|
|
|
break; |
|
|
|
case t_C_structSpec: |
|
|
|
outputTree(map_get(node, structTok_symbol), depth); |
|
|
|
outputTree(map_get(node, attribute1_symbol), depth+3); |
|
|
|
outputTree(map_get(node, name_symbol), depth+3); |
|
|
|
outputTree(map_get(node, leftCurly_symbol), depth+3); |
|
|
|
outputTree(map_get(node, declarationL_symbol), depth+3); |
|
|
|
outputTree(map_get(node, rightCurly_symbol), depth+3); |
|
|
|
outputTree(map_get(node, attribute2_symbol), depth+3); |
|
|
|
break; |
|
|
|
case t_C_structDeclarator: |
|
|
|
printf("STRUCT DECLARATOR :\n"); |
|
|
|
outputTree(map_get(node, declarators_symbol), depth+3); |
|
|
|
outputTree(map_get(node, colon_symbol), depth+3); |
|
|
|
outputTree(map_get(node, expression_symbol), depth+3); |
|
|
|
break; |
|
|
|
case t_C_enumSpec: |
|
|
|
outputTree(map_get(node, enumTok_symbol), depth); |
|
|
|
outputTree(map_get(node, name_symbol), depth+3); |
|
|
|
outputTree(map_get(node, leftCurly_symbol), depth+3); |
|
|
|
outputTree(map_get(node, enumList_symbol), depth+3); |
|
|
|
outputTree(map_get(node, rightCurly_symbol), depth+3); |
|
|
|
break; |
|
|
|
case t_C_enum: |
|
|
|
printf("ENUM :"); |
|
|
|
outputTree(map_get(node, name_symbol), depth+3); |
|
|
|
outputTree(map_get(node, attributeL_symbol), depth+3); |
|
|
|
outputTree(map_get(node, expression_symbol), depth+3); |
|
|
|
break; |
|
|
|
default: |
|
|
|
printf("I cannot print a node with proto_number %i\n", proto_number); |
|
|
|
exit(0); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
int main(int argc, char **argv) |
|
|
|
{ |
|
|
|
# if (USE_GC) |
|
|
@ -3363,7 +3742,8 @@ int main(int argc, char **argv) |
|
|
|
|
|
|
|
inputStackPush(NULL); |
|
|
|
while (yyparse()) { |
|
|
|
outputNode(yylval); |
|
|
|
//outputNode(yylval); |
|
|
|
outputTree(yylval, 0); |
|
|
|
} |
|
|
|
|
|
|
|
return 0; |
|
|
|