From 8fa5b40b4d4aa24490c9a9cfc594658769e7ee1b Mon Sep 17 00:00:00 2001 From: Nathan R Date: Wed, 21 Jul 2021 17:36:38 +0200 Subject: [PATCH] First Version of printing the AST --- ccmeta.leg | 384 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 382 insertions(+), 2 deletions(-) diff --git a/ccmeta.leg b/ccmeta.leg index 7912538..81af256 100644 --- a/ccmeta.leg +++ b/ccmeta.leg @@ -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;