From a22bc8d20a1ad9158a28f29f6f866b0008b11e3e Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Mon, 23 Nov 2015 21:45:10 -0700 Subject: [PATCH] more detailed AST inspection --- src/parser.cpp | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/src/parser.cpp b/src/parser.cpp index 0b887ba0c6..ae375f0173 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -73,6 +73,54 @@ void ast_print(AstNode *node, int indent) { break; } + case NodeTypeBlock: + { + fprintf(stderr, "%s\n", node_type_str(node->type)); + for (int i = 0; i < node->data.block.statements.length; i += 1) { + AstNode *child = node->data.block.statements.at(i); + ast_print(child, indent + 2); + } + break; + } + case NodeTypeParamDecl: + { + Buf *name_buf = &node->data.param_decl.name; + fprintf(stderr, "%s '%s'\n", node_type_str(node->type), buf_ptr(name_buf)); + + ast_print(node->data.param_decl.type, indent + 2); + + break; + } + case NodeTypeType: + switch (node->data.type.type) { + case AstNodeTypeTypePrimitive: + { + Buf *name_buf = &node->data.type.primitive_name; + fprintf(stderr, "%s '%s'\n", node_type_str(node->type), buf_ptr(name_buf)); + break; + } + case AstNodeTypeTypePointer: + { + const char *const_or_mut_str = node->data.type.is_const ? "const" : "mut"; + fprintf(stderr, "'%s' PointerType\n", const_or_mut_str); + + ast_print(node->data.type.child_type, indent + 2); + break; + } + } + break; + case NodeTypeStatement: + switch (node->data.statement.type) { + case AstNodeStatementTypeReturn: + fprintf(stderr, "ReturnStatement\n"); + ast_print(node->data.statement.data.retrn.expression, indent + 2); + break; + case AstNodeStatementTypeExpression: + fprintf(stderr, "ExpressionStatement\n"); + ast_print(node->data.statement.data.expr.expression, indent + 2); + break; + } + break; default: fprintf(stderr, "%s\n", node_type_str(node->type)); break; @@ -124,6 +172,7 @@ static AstNode *ast_parse_type(ParseContext *pc, int token_index, int *new_token node->data.type.type = AstNodeTypeTypePrimitive; ast_buf_from_token(pc, token, &node->data.type.primitive_name); } else if (token->id == TokenIdStar) { + node->data.type.type = AstNodeTypeTypePointer; Token *const_or_mut = &pc->tokens->at(token_index); token_index += 1; if (const_or_mut->id == TokenIdKeywordMut) {