summaryrefslogtreecommitdiff
path: root/src/compiler
diff options
context:
space:
mode:
Diffstat (limited to 'src/compiler')
-rw-r--r--src/compiler/ast-tree.c34
-rw-r--r--src/compiler/ast-tree.h3
-rw-r--r--src/compiler/lexer.c16
-rw-r--r--src/compiler/lexer.h1
-rw-r--r--src/compiler/parser.c9
-rw-r--r--src/compiler/parser.h1
6 files changed, 53 insertions, 11 deletions
diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c
index 17c2630..6b68a75 100644
--- a/src/compiler/ast-tree.c
+++ b/src/compiler/ast-tree.c
@@ -119,6 +119,7 @@ const char *AST_TREE_TOKEN_STRINGS[] = {
"AST_TREE_TOKEN_BUILTIN_CAST",
"AST_TREE_TOKEN_BUILTIN_TYPE_OF",
"AST_TREE_TOKEN_BUILTIN_IMPORT",
+ "AST_TREE_TOKEN_BUILTIN_IS_COMPTIME",
"AST_TREE_TOKEN_KEYWORD_PUTC",
"AST_TREE_TOKEN_KEYWORD_RETURN",
@@ -232,11 +233,10 @@ void astTreePrint(const AstTree *tree, int indent) {
printf("]");
}
goto RETURN_SUCCESS;
- case AST_TREE_TOKEN_BUILTIN: {
- AstTreeBuiltin *metadata = tree->metadata;
- printf(",token = %s", AST_TREE_BUILTIN_TOKEN_STRINGS[metadata->token]);
- }
- goto RETURN_SUCCESS;
+ case AST_TREE_TOKEN_BUILTIN_CAST:
+ case AST_TREE_TOKEN_BUILTIN_TYPE_OF:
+ case AST_TREE_TOKEN_BUILTIN_IMPORT:
+ case AST_TREE_TOKEN_BUILTIN_IS_COMPTIME:
case AST_TREE_TOKEN_TYPE_TYPE:
case AST_TREE_TOKEN_TYPE_VOID:
case AST_TREE_TOKEN_TYPE_I8:
@@ -623,6 +623,7 @@ void astTreeDestroy(AstTree tree) {
case AST_TREE_TOKEN_BUILTIN_CAST:
case AST_TREE_TOKEN_BUILTIN_TYPE_OF:
case AST_TREE_TOKEN_BUILTIN_IMPORT:
+ case AST_TREE_TOKEN_BUILTIN_IS_COMPTIME:
case AST_TREE_TOKEN_TYPE_TYPE:
case AST_TREE_TOKEN_TYPE_VOID:
case AST_TREE_TOKEN_TYPE_I8:
@@ -894,6 +895,7 @@ AstTree *copyAstTreeBack(AstTree *tree, AstTreeVariables oldVariables[],
case AST_TREE_TOKEN_BUILTIN_CAST:
case AST_TREE_TOKEN_BUILTIN_TYPE_OF:
case AST_TREE_TOKEN_BUILTIN_IMPORT:
+ case AST_TREE_TOKEN_BUILTIN_IS_COMPTIME:
return newAstTree(
tree->token, NULL,
copyAstTreeBack(tree->type, oldVariables, newVariables, variables_size),
@@ -1584,6 +1586,7 @@ AstTreeRoot *makeAstRoot(const ParserNode *parsedRoot, char *filePath) {
case PARSER_TOKEN_BUILTIN_CAST:
case PARSER_TOKEN_BUILTIN_TYPE_OF:
case PARSER_TOKEN_BUILTIN_IMPORT:
+ case PARSER_TOKEN_BUILTIN_IS_COMPTIME:
case PARSER_TOKEN_SYMBOL_BRACKET_LEFT:
case PARSER_TOKEN_SYMBOL_BRACKET_RIGHT:
goto AFTER_SWITCH;
@@ -1687,6 +1690,8 @@ AstTree *astTreeParse(const ParserNode *parserNode, AstTreeHelper *helper) {
return astTreeParseKeyword(parserNode, AST_TREE_TOKEN_BUILTIN_TYPE_OF);
case PARSER_TOKEN_BUILTIN_IMPORT:
return astTreeParseKeyword(parserNode, AST_TREE_TOKEN_BUILTIN_IMPORT);
+ case PARSER_TOKEN_BUILTIN_IS_COMPTIME:
+ return astTreeParseKeyword(parserNode, AST_TREE_TOKEN_BUILTIN_IS_COMPTIME);
case PARSER_TOKEN_TYPE_TYPE:
return &AST_TREE_TYPE_TYPE;
case PARSER_TOKEN_TYPE_FUNCTION:
@@ -2006,6 +2011,7 @@ AstTree *astTreeParseFunction(const ParserNode *parserNode,
case PARSER_TOKEN_BUILTIN_CAST:
case PARSER_TOKEN_BUILTIN_TYPE_OF:
case PARSER_TOKEN_BUILTIN_IMPORT:
+ case PARSER_TOKEN_BUILTIN_IS_COMPTIME:
case PARSER_TOKEN_SYMBOL_BRACKET_LEFT:
case PARSER_TOKEN_SYMBOL_BRACKET_RIGHT:
printError(node->str_begin, node->str_end, "Unexpected %s",
@@ -2600,6 +2606,7 @@ AstTree *astTreeParseCurlyBracket(const ParserNode *parserNode,
case PARSER_TOKEN_BUILTIN_CAST:
case PARSER_TOKEN_BUILTIN_TYPE_OF:
case PARSER_TOKEN_BUILTIN_IMPORT:
+ case PARSER_TOKEN_BUILTIN_IS_COMPTIME:
case PARSER_TOKEN_SYMBOL_BRACKET_LEFT:
case PARSER_TOKEN_SYMBOL_BRACKET_RIGHT:
printError(node->str_begin, node->str_end, "Unexpected %s",
@@ -2788,6 +2795,7 @@ bool isConst(AstTree *tree) {
case AST_TREE_TOKEN_BUILTIN_CAST:
case AST_TREE_TOKEN_BUILTIN_TYPE_OF:
case AST_TREE_TOKEN_BUILTIN_IMPORT:
+ case AST_TREE_TOKEN_BUILTIN_IS_COMPTIME:
case AST_TREE_TOKEN_TYPE_TYPE:
case AST_TREE_TOKEN_TYPE_FUNCTION:
case AST_TREE_TOKEN_TYPE_VOID:
@@ -2905,6 +2913,7 @@ bool isConstByValue(AstTree *tree) {
case AST_TREE_TOKEN_BUILTIN_CAST:
case AST_TREE_TOKEN_BUILTIN_TYPE_OF:
case AST_TREE_TOKEN_BUILTIN_IMPORT:
+ case AST_TREE_TOKEN_BUILTIN_IS_COMPTIME:
case AST_TREE_TOKEN_TYPE_TYPE:
case AST_TREE_TOKEN_TYPE_FUNCTION:
case AST_TREE_TOKEN_TYPE_VOID:
@@ -3141,6 +3150,7 @@ AstTree *makeTypeOf(AstTree *value) {
case AST_TREE_TOKEN_BUILTIN_CAST:
case AST_TREE_TOKEN_BUILTIN_TYPE_OF:
case AST_TREE_TOKEN_BUILTIN_IMPORT:
+ case AST_TREE_TOKEN_BUILTIN_IS_COMPTIME:
case AST_TREE_TOKEN_VALUE_OBJECT:
case AST_TREE_TOKEN_VARIABLE_DEFINE:
case AST_TREE_TOKEN_KEYWORD_PUTC:
@@ -3180,6 +3190,7 @@ bool typeIsEqualBack(const AstTree *type0, const AstTree *type1) {
case AST_TREE_TOKEN_BUILTIN_CAST:
case AST_TREE_TOKEN_BUILTIN_TYPE_OF:
case AST_TREE_TOKEN_BUILTIN_IMPORT:
+ case AST_TREE_TOKEN_BUILTIN_IS_COMPTIME:
case AST_TREE_TOKEN_FUNCTION:
case AST_TREE_TOKEN_KEYWORD_PUTC:
case AST_TREE_TOKEN_KEYWORD_RETURN:
@@ -3326,6 +3337,7 @@ AstTree *getValue(AstTree *tree) {
case AST_TREE_TOKEN_BUILTIN_CAST:
case AST_TREE_TOKEN_BUILTIN_TYPE_OF:
case AST_TREE_TOKEN_BUILTIN_IMPORT:
+ case AST_TREE_TOKEN_BUILTIN_IS_COMPTIME:
case AST_TREE_TOKEN_TYPE_FUNCTION:
case AST_TREE_TOKEN_TYPE_TYPE:
case AST_TREE_TOKEN_TYPE_VOID:
@@ -3396,7 +3408,7 @@ AstTree *getValue(AstTree *tree) {
.str_end = NULL,
};
- AstTree *value = runExpression(tree, scope, &shouldRet, false);
+ AstTree *value = runExpression(tree, scope, &shouldRet, false, true);
astTreeDestroy(scopeTree);
@@ -3432,6 +3444,7 @@ bool isIntType(AstTree *type) {
case AST_TREE_TOKEN_BUILTIN_CAST:
case AST_TREE_TOKEN_BUILTIN_TYPE_OF:
case AST_TREE_TOKEN_BUILTIN_IMPORT:
+ case AST_TREE_TOKEN_BUILTIN_IS_COMPTIME:
case AST_TREE_TOKEN_KEYWORD_PUTC:
case AST_TREE_TOKEN_KEYWORD_RETURN:
case AST_TREE_TOKEN_KEYWORD_IF:
@@ -3531,6 +3544,7 @@ bool isEqual(AstTree *left, AstTree *right) {
case AST_TREE_TOKEN_BUILTIN_CAST:
case AST_TREE_TOKEN_BUILTIN_TYPE_OF:
case AST_TREE_TOKEN_BUILTIN_IMPORT:
+ case AST_TREE_TOKEN_BUILTIN_IS_COMPTIME:
case AST_TREE_TOKEN_KEYWORD_PUTC:
case AST_TREE_TOKEN_KEYWORD_RETURN:
case AST_TREE_TOKEN_KEYWORD_IF:
@@ -3768,6 +3782,8 @@ bool setAllTypes(AstTree *tree, AstTreeSetTypesHelper helper,
return setTypesBuiltinTypeOf(tree, helper, functionCall);
case AST_TREE_TOKEN_BUILTIN_IMPORT:
return setTypesBuiltinImport(tree, helper, functionCall);
+ case AST_TREE_TOKEN_BUILTIN_IS_COMPTIME:
+ return setTypesBuiltinIsComptime(tree, helper);
case AST_TREE_TOKEN_TYPE_ARRAY:
return setTypesTypeArray(tree, helper);
case AST_TREE_TOKEN_OPERATOR_ARRAY_ACCESS:
@@ -4938,6 +4954,12 @@ bool setTypesBuiltinImport(AstTree *tree, AstTreeSetTypesHelper helper,
return false;
}
+bool setTypesBuiltinIsComptime(AstTree *tree, AstTreeSetTypesHelper helper) {
+ (void)helper;
+ tree->type = copyAstTree(&AST_TREE_BOOL_TYPE);
+ return true;
+}
+
bool setTypesTypeArray(AstTree *tree, AstTreeSetTypesHelper helper) {
AstTreeBracket *metadata = tree->metadata;
diff --git a/src/compiler/ast-tree.h b/src/compiler/ast-tree.h
index aaf614e..39df36d 100644
--- a/src/compiler/ast-tree.h
+++ b/src/compiler/ast-tree.h
@@ -5,9 +5,11 @@
typedef enum AstTreeToken {
AST_TREE_TOKEN_FUNCTION,
+
AST_TREE_TOKEN_BUILTIN_CAST,
AST_TREE_TOKEN_BUILTIN_TYPE_OF,
AST_TREE_TOKEN_BUILTIN_IMPORT,
+ AST_TREE_TOKEN_BUILTIN_IS_COMPTIME,
AST_TREE_TOKEN_KEYWORD_PUTC,
AST_TREE_TOKEN_KEYWORD_RETURN,
@@ -382,6 +384,7 @@ bool setTypesBuiltinTypeOf(AstTree *tree, AstTreeSetTypesHelper helper,
AstTreeFunctionCall *functionCall);
bool setTypesBuiltinImport(AstTree *tree, AstTreeSetTypesHelper helper,
AstTreeFunctionCall *functionCall);
+bool setTypesBuiltinIsComptime(AstTree *tree, AstTreeSetTypesHelper helper);
bool setTypesTypeArray(AstTree *tree, AstTreeSetTypesHelper helper);
bool setTypesArrayAccess(AstTree *tree, AstTreeSetTypesHelper helper);
diff --git a/src/compiler/lexer.c b/src/compiler/lexer.c
index ffc3976..378e480 100644
--- a/src/compiler/lexer.c
+++ b/src/compiler/lexer.c
@@ -10,7 +10,10 @@ const char *LEXER_TOKEN_STRINGS[] = {
"LEXER_TOKEN_SYMBOL_CLOSE_PARENTHESIS",
"LEXER_TOKEN_SYMBOL_CLOSE_BRACKET",
"LEXER_TOKEN_IDENTIFIER",
- "LEXER_TOKEN_BUILTIN",
+ "LEXER_TOKEN_BUILTIN_CAST",
+ "LEXER_TOKEN_BUILTIN_TYPE_OF",
+ "LEXER_TOKEN_BUILTIN_IMPORT",
+ "LEXER_TOKEN_BUILTIN_IS_COMPTIME",
"LEXER_TOKEN_KEYWORD_TYPE",
"LEXER_TOKEN_KEYWORD_VOID",
"LEXER_TOKEN_KEYWORD_I8",
@@ -170,14 +173,16 @@ static const size_t LEXER_KEYWORD_SIZE =
sizeof(LEXER_KEYWORD_TOKENS) / sizeof(*LEXER_KEYWORD_TOKENS);
static const char *LEXER_BUILTIN_STRINGS[] = {
- "@cast",
- "@typeOf",
- "@import",
+ "cast",
+ "typeOf",
+ "import",
+ "isComptime",
};
static const LexerToken LEXER_BUILTIN_TOKENS[] = {
LEXER_TOKEN_BUILTIN_CAST,
LEXER_TOKEN_BUILTIN_TYPE_OF,
LEXER_TOKEN_BUILTIN_IMPORT,
+ LEXER_TOKEN_BUILTIN_IS_COMPTIME,
};
static const size_t LEXER_BUILTIN_SIZE =
sizeof(LEXER_BUILTIN_TOKENS) / sizeof(*LEXER_BUILTIN_TOKENS);
@@ -344,7 +349,7 @@ lexerPushClear(LexerNodeArray *array, size_t *array_size, char *iter,
case LEXER_TOKEN_BUILTIN: {
const size_t index =
searchInStringArray(LEXER_BUILTIN_STRINGS, LEXER_BUILTIN_SIZE,
- *node_str_begin, iter - *node_str_begin);
+ *node_str_begin + 1, iter - *node_str_begin - 1);
if (index == LEXER_BUILTIN_SIZE) {
printError(*node_str_begin, iter, "Bad builtin");
UNREACHABLE;
@@ -423,6 +428,7 @@ lexerPushClear(LexerNodeArray *array, size_t *array_size, char *iter,
case LEXER_TOKEN_BUILTIN_CAST:
case LEXER_TOKEN_BUILTIN_TYPE_OF:
case LEXER_TOKEN_BUILTIN_IMPORT:
+ case LEXER_TOKEN_BUILTIN_IS_COMPTIME:
case LEXER_TOKEN_SYMBOL_CLOSE_BRACKET:
case LEXER_TOKEN_SYMBOL_OPEN_BRACKET:
if (*array_size == array->size) {
diff --git a/src/compiler/lexer.h b/src/compiler/lexer.h
index 98da7b5..7cceae7 100644
--- a/src/compiler/lexer.h
+++ b/src/compiler/lexer.h
@@ -16,6 +16,7 @@ typedef enum LexerToken {
LEXER_TOKEN_BUILTIN_CAST,
LEXER_TOKEN_BUILTIN_TYPE_OF,
LEXER_TOKEN_BUILTIN_IMPORT,
+ LEXER_TOKEN_BUILTIN_IS_COMPTIME,
LEXER_TOKEN_KEYWORD_TYPE,
LEXER_TOKEN_KEYWORD_VOID,
LEXER_TOKEN_KEYWORD_I8,
diff --git a/src/compiler/parser.c b/src/compiler/parser.c
index 0f4a880..c4cbfee 100644
--- a/src/compiler/parser.c
+++ b/src/compiler/parser.c
@@ -15,6 +15,7 @@ const char *PARSER_TOKEN_STRINGS[] = {
"PARSER_TOKEN_BUILTIN_CAST",
"PARSER_TOKEN_BUILTIN_TYPE_OF",
"PARSER_TOKEN_BUILTIN_IMPORT",
+ "PARSER_TOKEN_BUILTIN_IS_COMPTIME",
"PARSER_TOKEN_VALUE_INT",
"PARSER_TOKEN_VALUE_FLOAT",
@@ -226,6 +227,7 @@ void parserNodePrint(const ParserNode *node, int indent) {
case PARSER_TOKEN_BUILTIN_CAST:
case PARSER_TOKEN_BUILTIN_TYPE_OF:
case PARSER_TOKEN_BUILTIN_IMPORT:
+ case PARSER_TOKEN_BUILTIN_IS_COMPTIME:
case PARSER_TOKEN_TYPE_TYPE:
case PARSER_TOKEN_TYPE_VOID:
case PARSER_TOKEN_TYPE_BOOL:
@@ -512,6 +514,7 @@ void parserNodeDelete(ParserNode *node) {
case PARSER_TOKEN_BUILTIN_CAST:
case PARSER_TOKEN_BUILTIN_TYPE_OF:
case PARSER_TOKEN_BUILTIN_IMPORT:
+ case PARSER_TOKEN_BUILTIN_IS_COMPTIME:
case PARSER_TOKEN_TYPE_TYPE:
case PARSER_TOKEN_TYPE_VOID:
case PARSER_TOKEN_TYPE_BOOL:
@@ -796,6 +799,8 @@ ParserNode *parseNode(LexerNode *node, LexerNode *begin, LexerNode *end,
return parserNoMetadata(node, parent, PARSER_TOKEN_BUILTIN_TYPE_OF);
case LEXER_TOKEN_BUILTIN_IMPORT:
return parserNoMetadata(node, parent, PARSER_TOKEN_BUILTIN_IMPORT);
+ case LEXER_TOKEN_BUILTIN_IS_COMPTIME:
+ return parserNoMetadata(node, parent, PARSER_TOKEN_BUILTIN_IS_COMPTIME);
case LEXER_TOKEN_KEYWORD_TYPE:
return parserNoMetadata(node, parent, PARSER_TOKEN_TYPE_TYPE);
case LEXER_TOKEN_KEYWORD_VOID:
@@ -1531,6 +1536,7 @@ ParserNode *parserFunction(LexerNode *node, LexerNode *begin, LexerNode *end,
case PARSER_TOKEN_BUILTIN_CAST:
case PARSER_TOKEN_BUILTIN_TYPE_OF:
case PARSER_TOKEN_BUILTIN_IMPORT:
+ case PARSER_TOKEN_BUILTIN_IS_COMPTIME:
case PARSER_TOKEN_VALUE_INT:
case PARSER_TOKEN_VALUE_FLOAT:
case PARSER_TOKEN_VALUE_BOOL:
@@ -1994,6 +2000,7 @@ bool isExpression(ParserNode *node) {
case PARSER_TOKEN_BUILTIN_CAST:
case PARSER_TOKEN_BUILTIN_TYPE_OF:
case PARSER_TOKEN_BUILTIN_IMPORT:
+ case PARSER_TOKEN_BUILTIN_IS_COMPTIME:
case PARSER_TOKEN_CONSTANT:
case PARSER_TOKEN_VARIABLE:
case PARSER_TOKEN_SYMBOL_PARENTHESIS:
@@ -2106,6 +2113,7 @@ bool isType(ParserNode *node) {
case PARSER_TOKEN_BUILTIN_CAST:
case PARSER_TOKEN_BUILTIN_TYPE_OF:
case PARSER_TOKEN_BUILTIN_IMPORT:
+ case PARSER_TOKEN_BUILTIN_IS_COMPTIME:
case PARSER_TOKEN_OPERATOR_ADDRESS:
case PARSER_TOKEN_KEYWORD_NULL:
case PARSER_TOKEN_KEYWORD_UNDEFINED:
@@ -2165,6 +2173,7 @@ bool isValue(ParserNode *node) {
case PARSER_TOKEN_BUILTIN_CAST:
case PARSER_TOKEN_BUILTIN_TYPE_OF:
case PARSER_TOKEN_BUILTIN_IMPORT:
+ case PARSER_TOKEN_BUILTIN_IS_COMPTIME:
case PARSER_TOKEN_OPERATOR_ACCESS:
case PARSER_TOKEN_OPERATOR_ASSIGN:
case PARSER_TOKEN_OPERATOR_SUM_ASSIGN:
diff --git a/src/compiler/parser.h b/src/compiler/parser.h
index f0d8372..271cc13 100644
--- a/src/compiler/parser.h
+++ b/src/compiler/parser.h
@@ -12,6 +12,7 @@ typedef enum ParserToken {
PARSER_TOKEN_BUILTIN_CAST,
PARSER_TOKEN_BUILTIN_TYPE_OF,
PARSER_TOKEN_BUILTIN_IMPORT,
+ PARSER_TOKEN_BUILTIN_IS_COMPTIME,
PARSER_TOKEN_VALUE_INT,
PARSER_TOKEN_VALUE_FLOAT,