diff options
Diffstat (limited to 'src/compiler')
-rw-r--r-- | src/compiler/ast-tree.c | 31 | ||||
-rw-r--r-- | src/compiler/parser.c | 6 |
2 files changed, 31 insertions, 6 deletions
diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c index 0563086..e9d6430 100644 --- a/src/compiler/ast-tree.c +++ b/src/compiler/ast-tree.c @@ -8,6 +8,7 @@ #include "utils/string.h" #include "utils/time.h" #include "utils/type.h" +#include <stdio.h> #include <stdlib.h> #include <string.h> @@ -691,12 +692,13 @@ void astTreePrint(const AstTree *tree, int indent) { printf("]"); } goto RETURN_SUCCESS; - case AST_TREE_TOKEN_NONE: case AST_TREE_TOKEN_VALUE_NAMESPACE: case AST_TREE_TOKEN_VALUE_SHAPE_SHIFTER: case AST_TREE_TOKEN_SHAPE_SHIFTER_ELEMENT: case AST_TREE_TOKEN_VALUE_C_LIBRARY: case AST_TREE_TOKEN_VALUE_C_FUNCTION: + goto RETURN_SUCCESS; + case AST_TREE_TOKEN_NONE: } UNREACHABLE; @@ -2968,7 +2970,7 @@ AstTree *astTreeParseIntValue(const ParserNode *parserNode) { case PARSER_NODE_INT_TYPE_U8: { u8 *metadata = a404m_malloc(sizeof(*metadata)); *metadata = node_metadata->value; - return newAstTree(AST_TREE_TOKEN_RAW_VALUE, metadata, &AST_TREE_I8_TYPE, + return newAstTree(AST_TREE_TOKEN_RAW_VALUE, metadata, &AST_TREE_U8_TYPE, parserNode->str_begin, parserNode->str_end); } case PARSER_NODE_INT_TYPE_I16: { @@ -2980,7 +2982,7 @@ AstTree *astTreeParseIntValue(const ParserNode *parserNode) { case PARSER_NODE_INT_TYPE_U16: { u16 *metadata = a404m_malloc(sizeof(*metadata)); *metadata = node_metadata->value; - return newAstTree(AST_TREE_TOKEN_RAW_VALUE, metadata, &AST_TREE_I16_TYPE, + return newAstTree(AST_TREE_TOKEN_RAW_VALUE, metadata, &AST_TREE_U16_TYPE, parserNode->str_begin, parserNode->str_end); } case PARSER_NODE_INT_TYPE_I32: { @@ -2992,7 +2994,7 @@ AstTree *astTreeParseIntValue(const ParserNode *parserNode) { case PARSER_NODE_INT_TYPE_U32: { u32 *metadata = a404m_malloc(sizeof(*metadata)); *metadata = node_metadata->value; - return newAstTree(AST_TREE_TOKEN_RAW_VALUE, metadata, &AST_TREE_I32_TYPE, + return newAstTree(AST_TREE_TOKEN_RAW_VALUE, metadata, &AST_TREE_U32_TYPE, parserNode->str_begin, parserNode->str_end); } case PARSER_NODE_INT_TYPE_I64: { @@ -3004,7 +3006,7 @@ AstTree *astTreeParseIntValue(const ParserNode *parserNode) { case PARSER_NODE_INT_TYPE_U64: { u64 *metadata = a404m_malloc(sizeof(*metadata)); *metadata = node_metadata->value; - return newAstTree(AST_TREE_TOKEN_RAW_VALUE, metadata, &AST_TREE_I64_TYPE, + return newAstTree(AST_TREE_TOKEN_RAW_VALUE, metadata, &AST_TREE_U64_TYPE, parserNode->str_begin, parserNode->str_end); } } @@ -6411,10 +6413,21 @@ bool setTypesOperatorAccess(AstTree *tree, AstTreeSetTypesHelper helper) { static const char LENGTH_STR[] = "length"; static const size_t LENGTH_STR_SIZE = sizeof(LENGTH_STR) / sizeof(*LENGTH_STR) - sizeof(*LENGTH_STR); + static const char PTR_STR[] = "ptr"; + static const size_t PTR_STR_SIZE = + sizeof(PTR_STR) / sizeof(*PTR_STR) - sizeof(*PTR_STR); + if (LENGTH_STR_SIZE == size && strnEquals(LENGTH_STR, str, size)) { - metadata->member.index = 0; + metadata->member.index = 1; tree->type = copyAstTree(&AST_TREE_U64_TYPE); return true; + } else if (PTR_STR_SIZE == size && strnEquals(PTR_STR, str, size)) { + metadata->member.index = 0; + AstTreeBracket *arrayType = metadata->object->type->metadata; + tree->type = newAstTree(AST_TREE_TOKEN_OPERATOR_POINTER, + copyAstTree(arrayType->operand), + &AST_TREE_TYPE_TYPE, NULL, NULL); + return true; } printError(metadata->member.name.begin, metadata->member.name.end, @@ -7516,8 +7529,14 @@ bool setTypesTypeArray(AstTree *tree, AstTreeSetTypesHelper helper) { printError(metadata->operand->str_begin, metadata->operand->str_end, "Expected type"); return false; + } else if (!isConst(metadata->operand)) { + printError(metadata->operand->str_begin, metadata->operand->str_end, + "Epxected const"); + return false; } + metadata->operand = getValue(metadata->operand, false); + if (metadata->parameters.size == 0) { // left empty } else if (metadata->parameters.size == 1) { diff --git a/src/compiler/parser.c b/src/compiler/parser.c index 903a8af..97edae4 100644 --- a/src/compiler/parser.c +++ b/src/compiler/parser.c @@ -1307,6 +1307,11 @@ ParserNode *parserNumber(LexerNode *node, ParserNode *parent) { parserNode = newParserNode(PARSER_TOKEN_VALUE_INT, node->str_begin, node->str_end, metadata, parent); break; + case 'i': + case 'I': + case 'u': + case 'U': + goto DEFAULT; default: NOT_IMPLEMENTED; } @@ -1314,6 +1319,7 @@ ParserNode *parserNumber(LexerNode *node, ParserNode *parent) { } // fall through default: { + DEFAULT: ParserNodeIntType type = getIntType(node->str_begin, node->str_end); u64 value = decimalToU64(node->str_begin, node->str_end - getIntTypeSize(type), &success); |