aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile10
-rw-r--r--code/basic.felan16
-rw-r--r--code/main.felan5
-rw-r--r--src/compiler/ast-tree.c32
-rw-r--r--src/compiler/ast-tree.h29
-rw-r--r--src/compiler/lexer.c16
-rw-r--r--src/compiler/lexer.h10
-rw-r--r--src/compiler/parser.c12
-rw-r--r--src/compiler/parser.h8
-rw-r--r--src/runner/runner.c18
-rw-r--r--src/utils/log.c4
-rw-r--r--src/utils/string.c4
-rw-r--r--src/utils/string.h4
13 files changed, 79 insertions, 89 deletions
diff --git a/Makefile b/Makefile
index a816d3f..d9f18bf 100644
--- a/Makefile
+++ b/Makefile
@@ -20,13 +20,13 @@ INC_DIRS := $(SRC_DIR)
INC_FLAGS := $(addprefix -I,$(INC_DIRS))
# OP_FLAG := -Ofast
-# OP_FLAG := -O3
+OP_FLAG := -O3
# OP_FLAG := -Oz
-OP_FLAG := -g
+# OP_FLAG := -g
-# CFLAGS := $(INC_FLAGS) -Wall -Wextra -lm -std=gnu23 -DPRINT_STATISTICS -DPRINT_COMPILE_TREE $(OP_FLAG)
-CFLAGS := $(INC_FLAGS) -Wall -Wextra -lm -std=gnu23 -DPRINT_STATISTICS $(OP_FLAG)
-# CFLAGS := $(INC_FLAGS) -Wall -Wextra -lm -std=gnu23 $(OP_FLAG)
+# CFLAGS := $(INC_FLAGS) -Wall -Wextra -std=gnu23 -DPRINT_STATISTICS -DPRINT_COMPILE_TREE $(OP_FLAG)
+CFLAGS := $(INC_FLAGS) -Wall -Wextra -std=gnu23 -DPRINT_STATISTICS $(OP_FLAG)
+# CFLAGS := $(INC_FLAGS) -Wall -Wextra -std=gnu23 $(OP_FLAG)
EXEC_FILE := $(BUILD_DIR)/$(PROJECT_NAME)
diff --git a/code/basic.felan b/code/basic.felan
index 4d6c38f..8f55514 100644
--- a/code/basic.felan
+++ b/code/basic.felan
@@ -270,22 +270,6 @@ __mod__ :: (left:i64,right:i64) -> i64 {
return @mod(left,right);
};
-__mod__ :: (left:f16,right:f16) -> f16 {
- return @mod(left,right);
-};
-
-__mod__ :: (left:f32,right:f32) -> f32 {
- return @mod(left,right);
-};
-
-__mod__ :: (left:f64,right:f64) -> f64 {
- return @mod(left,right);
-};
-
-__mod__ :: (left:f128,right:f128) -> f128 {
- return @mod(left,right);
-};
-
__greater__ :: (left:u8,right:u8) -> bool {
return @greater(left,right);
};
diff --git a/code/main.felan b/code/main.felan
index 4e3a4b4..2c627ff 100644
--- a/code/main.felan
+++ b/code/main.felan
@@ -3,7 +3,12 @@
main :: () -> void {
a := false;
b :: true;
+ c := &a;
+ c.* = true;
if a == b {
+ putc 'a';
+ }else{
+ putc 'b';
}
};
diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c
index 676fafb..7c02209 100644
--- a/src/compiler/ast-tree.c
+++ b/src/compiler/ast-tree.c
@@ -320,7 +320,7 @@ void astTreePrint(const AstTree *tree, int indent) {
goto RETURN_SUCCESS;
case AST_TREE_TOKEN_VALUE_INT: {
AstTreeInt *metadata = tree->metadata;
- printf(",value=%lu", *metadata);
+ printf(",value=%lld", *metadata);
}
goto RETURN_SUCCESS;
case AST_TREE_TOKEN_VALUE_FLOAT: {
@@ -900,7 +900,7 @@ void astTreeRootsDestroy(AstTreeRoots roots) {
}
AstTree *newAstTree(AstTreeToken token, void *metadata, AstTree *type,
- char *str_begin, char *str_end) {
+ char const *str_begin, char const *str_end) {
AstTree *result = a404m_malloc(sizeof(*result));
*result = (AstTree){
.token = token,
@@ -1758,8 +1758,8 @@ bool pushVariable(AstTreeHelper *helper, AstTreeVariables *variables,
AstTreeVariable *variable) {
if (helper->variables[0] != variables) {
for (size_t j = 0; j < variables->size; ++j) {
- char *var_begin = variables->data[j]->name_begin;
- char *var_end = variables->data[j]->name_end;
+ const char *var_begin = variables->data[j]->name_begin;
+ const char *var_end = variables->data[j]->name_end;
if (variable->name_end - variable->name_begin == var_end - var_begin &&
strnEquals(var_begin, variable->name_begin,
@@ -1959,10 +1959,10 @@ AstTree *astTreeParse(const ParserNode *parserNode, AstTreeHelper *helper) {
return astTreeParseUnaryOperator(parserNode, helper,
AST_TREE_TOKEN_OPERATOR_POINTER);
case PARSER_TOKEN_OPERATOR_ADDRESS:
- return astTreeParseUnaryOperator(parserNode, helper,
+ return astTreeParseUnaryOperatorSingleChild(parserNode, helper,
AST_TREE_TOKEN_OPERATOR_ADDRESS);
case PARSER_TOKEN_OPERATOR_DEREFERENCE:
- return astTreeParseUnaryOperator(parserNode, helper,
+ return astTreeParseUnaryOperatorSingleChild(parserNode, helper,
AST_TREE_TOKEN_OPERATOR_DEREFERENCE);
case PARSER_TOKEN_VARIABLE:
return astTreeParseVariable(parserNode, helper);
@@ -2467,6 +2467,20 @@ AstTree *astTreeParseUnaryOperator(const ParserNode *parserNode,
parserNode->str_end);
}
+AstTree *astTreeParseUnaryOperatorSingleChild(const ParserNode *parserNode,
+ AstTreeHelper *helper,
+ AstTreeToken token) {
+ ParserNodeSingleChildMetadata *node_metadata = parserNode->metadata;
+
+ AstTreeSingleChild *metadata = astTreeParse(node_metadata, helper);
+ if (metadata == NULL) {
+ return NULL;
+ }
+
+ return newAstTree(token, metadata, NULL, parserNode->str_begin,
+ parserNode->str_end);
+}
+
AstTree *astTreeParseOperateAssignOperator(const ParserNode *parserNode,
AstTreeHelper *helper,
AstTreeToken token) {
@@ -5276,9 +5290,9 @@ bool setTypesBuiltinUnary(AstTree *tree, AstTreeSetTypesHelper helper,
return false;
}
- char *str = functionCall->parameters[0].nameBegin;
- size_t str_size = functionCall->parameters[0].nameEnd -
- functionCall->parameters[0].nameBegin;
+ const char *str = functionCall->parameters[0].nameBegin;
+ const size_t str_size = functionCall->parameters[0].nameEnd -
+ functionCall->parameters[0].nameBegin;
static char VALUE_STR[] = "value";
static size_t VALUE_STR_SIZE =
diff --git a/src/compiler/ast-tree.h b/src/compiler/ast-tree.h
index 74aa027..e52d8c2 100644
--- a/src/compiler/ast-tree.h
+++ b/src/compiler/ast-tree.h
@@ -100,8 +100,8 @@ typedef struct AstTree {
AstTreeToken token;
void *metadata;
struct AstTree *type;
- char *str_begin;
- char *str_end;
+ char const *str_begin;
+ char const *str_end;
} AstTree;
extern AstTree AST_TREE_TYPE_TYPE;
@@ -125,8 +125,8 @@ extern AstTree AST_TREE_CODE_TYPE;
extern AstTree AST_TREE_VOID_VALUE;
typedef struct AstTreeVariable {
- char *name_begin;
- char *name_end;
+ char const *name_begin;
+ char const *name_end;
AstTree *type;
AstTree *value;
AstTree *initValue;
@@ -171,10 +171,10 @@ typedef struct AstTreeFunction {
} AstTreeFunction;
typedef struct AstTreeTypeFunctionArgument {
- char *str_begin;
- char *str_end;
- char *name_begin;
- char *name_end;
+ char const *str_begin;
+ char const *str_end;
+ char const *name_begin;
+ char const *name_end;
AstTree *type;
} AstTreeTypeFunctionArgument;
@@ -185,8 +185,8 @@ typedef struct AstTreeTypeFunction {
} AstTreeTypeFunction;
typedef struct AstTreeFunctionCallParam {
- char *nameBegin;
- char *nameEnd;
+ char const *nameBegin;
+ char const *nameEnd;
AstTree *value;
} AstTreeFunctionCallParam;
@@ -251,8 +251,8 @@ typedef struct AstTreeStruct {
} AstTreeStruct;
typedef struct AstTreeName {
- char *begin;
- char *end;
+ char const *begin;
+ char const *end;
} AstTreeName;
typedef struct AstTreeAccess {
@@ -283,7 +283,7 @@ void astTreeRootDelete(AstTreeRoot *root);
void astTreeRootsDestroy(AstTreeRoots roots);
AstTree *newAstTree(AstTreeToken token, void *metadata, AstTree *type,
- char *str_begin, char *str_end);
+ char const *str_begin, char const *str_end);
AstTree *copyAstTree(AstTree *tree);
AstTree *copyAstTreeBack(AstTree *tree, AstTreeVariables oldVariables[],
AstTreeVariables newVariables[],
@@ -338,6 +338,9 @@ AstTree *astTreeParseBinaryOperator(const ParserNode *parserNode,
AstTreeHelper *helper, AstTreeToken token);
AstTree *astTreeParseUnaryOperator(const ParserNode *parserNode,
AstTreeHelper *helper, AstTreeToken token);
+AstTree *astTreeParseUnaryOperatorSingleChild(const ParserNode *parserNode,
+ AstTreeHelper *helper,
+ AstTreeToken token);
AstTree *astTreeParseOperateAssignOperator(const ParserNode *parserNode,
AstTreeHelper *helper,
AstTreeToken token);
diff --git a/src/compiler/lexer.c b/src/compiler/lexer.c
index b28bd48..a766ce7 100644
--- a/src/compiler/lexer.c
+++ b/src/compiler/lexer.c
@@ -251,7 +251,7 @@ void lexerNodeArrayPrint(LexerNodeArray array) {
void lexerNodeArrayDestroy(LexerNodeArray array) { free(array.data); }
-LexerNodeArray lexer(char *str) {
+LexerNodeArray lexer(const char *str) {
size_t result_size = 0;
LexerNodeArray result = {
.data = a404m_malloc(result_size),
@@ -259,8 +259,8 @@ LexerNodeArray lexer(char *str) {
};
LexerToken node_token = LEXER_TOKEN_NONE;
- char *node_str_begin = str;
- char *iter = str;
+ char const *node_str_begin = str;
+ char const *iter = str;
for (; *iter != '\0'; ++iter) {
char c = *iter;
if (c == '/') {
@@ -280,7 +280,7 @@ LexerNodeArray lexer(char *str) {
&node_token, LEXER_TOKEN_NONE);
++iter;
int in = 1;
- char *openingIter = iter - 2;
+ char const *openingIter = iter - 2;
for (; in != 0; ++iter) {
if (*iter == '*' && *(iter + 1) == '/') {
@@ -313,7 +313,7 @@ LexerNodeArray lexer(char *str) {
}
lexerPushClear(&result, &result_size, iter, &node_str_begin, &node_token,
token);
- char *openingIter = iter;
+ char const *openingIter = iter;
++iter;
for (;; ++iter) {
if (*iter == '\0') {
@@ -372,8 +372,8 @@ RETURN_SUCCESS:
}
inline __attribute__((always_inline)) void
-lexerPushClear(LexerNodeArray *array, size_t *array_size, char *iter,
- char **node_str_begin, LexerToken *node_token,
+lexerPushClear(LexerNodeArray *array, size_t *array_size, char const *iter,
+ char const **node_str_begin, LexerToken *node_token,
LexerToken token) {
switch (*node_token) {
case LEXER_TOKEN_IDENTIFIER: {
@@ -553,7 +553,7 @@ bool isSymbol(char c) {
}
}
-bool isCompleteSymbol(char *str, size_t str_size) {
+bool isCompleteSymbol(char const *str, size_t str_size) {
return searchInStringArray(LEXER_SYMBOL_STRINGS, LEXER_SYMBOL_SIZE, str,
str_size) != LEXER_SYMBOL_SIZE;
}
diff --git a/src/compiler/lexer.h b/src/compiler/lexer.h
index 7f52eaf..921b76a 100644
--- a/src/compiler/lexer.h
+++ b/src/compiler/lexer.h
@@ -133,8 +133,8 @@ typedef enum LexerToken {
extern const char *LEXER_TOKEN_STRINGS[];
typedef struct LexerNode {
- char *str_begin;
- char *str_end;
+ char const *str_begin;
+ char const *str_end;
struct ParserNode *parserNode;
LexerToken token;
} LexerNode;
@@ -152,15 +152,15 @@ extern void lexerNodeArrayPrint(LexerNodeArray array);
#endif
extern void lexerNodeArrayDestroy(LexerNodeArray array);
-extern LexerNodeArray lexer(char *str);
+extern LexerNodeArray lexer(const char *str);
extern void lexerPushClear(LexerNodeArray *array, size_t *array_size,
- char *iter, char **node_str_begin,
+ const char *iter, char const **node_str_begin,
LexerToken *node_token, LexerToken token);
extern bool isIdentifier(char c);
extern bool isNumber(char c);
extern bool isSymbol(char c);
-extern bool isCompleteSymbol(char *str, size_t str_size);
+extern bool isCompleteSymbol(const char *str, size_t str_size);
extern bool isSpace(char c);
extern bool isString(char c);
diff --git a/src/compiler/parser.c b/src/compiler/parser.c
index 6e8283a..0d41a25 100644
--- a/src/compiler/parser.c
+++ b/src/compiler/parser.c
@@ -279,7 +279,7 @@ void parserNodePrint(const ParserNode *node, int indent) {
goto RETURN_SUCCESS;
case PARSER_TOKEN_VALUE_INT: {
ParserNodeIntMetadata *metadata = node->metadata;
- printf(",operand=%ld", *metadata);
+ printf(",operand=%lld", *metadata);
}
goto RETURN_SUCCESS;
case PARSER_TOKEN_VALUE_FLOAT: {
@@ -711,8 +711,9 @@ RETURN_SUCCESS:
free(node);
}
-ParserNode *newParserNode(ParserToken token, char *str_begin, char *str_end,
- void *metadata, ParserNode *parent) {
+ParserNode *newParserNode(ParserToken token, char const *str_begin,
+ char const *str_end, void *metadata,
+ ParserNode *parent) {
ParserNode *parserNode = a404m_malloc(sizeof(*parserNode));
*parserNode = (ParserNode){
.token = token,
@@ -1251,7 +1252,8 @@ ParserNode *parserString(LexerNode *node, ParserNode *parent) {
metadata->begin = metadata->end = a404m_malloc(
sizeof(*metadata->begin) * (node->str_end - node->str_begin));
- for (char *iter = node->str_begin + 1; iter < node->str_end - 1; ++iter) {
+ for (char const *iter = node->str_begin + 1; iter < node->str_end - 1;
+ ++iter) {
if (*iter == '\\') {
iter += 1;
bool success;
@@ -2374,7 +2376,7 @@ bool isValue(ParserNode *node) {
UNREACHABLE;
}
-char escapeChar(char *begin, char *end, bool *success) {
+char escapeChar(char const *begin, char const *end, bool *success) {
(void)end;
switch (*begin) {
case 'a':
diff --git a/src/compiler/parser.h b/src/compiler/parser.h
index b34b82f..1237991 100644
--- a/src/compiler/parser.h
+++ b/src/compiler/parser.h
@@ -117,8 +117,8 @@ typedef struct ParserOrder {
typedef struct ParserNode {
ParserToken token;
- char *str_begin;
- char *str_end;
+ char const *str_begin;
+ char const *str_end;
void *metadata;
struct ParserNode *parent;
} ParserNode;
@@ -204,7 +204,7 @@ ParserNode *parserFromPath(const char *filePath
ParserNode *parser(LexerNodeArray lexed);
bool parserNodeArray(LexerNode *begin, LexerNode *end, ParserNode *parent);
-ParserNode *newParserNode(ParserToken token, char *str_begin, char *str_end,
+ParserNode *newParserNode(ParserToken token, char const*str_begin, char const *str_end,
void *metadata, ParserNode *parent);
ParserNode *parseNode(LexerNode *node, LexerNode *begin, LexerNode *end,
@@ -262,4 +262,4 @@ bool isExpression(ParserNode *node);
bool isType(ParserNode *node);
bool isValue(ParserNode *node);
-char escapeChar(char *begin, char *end, bool *success);
+char escapeChar(char const*begin, char const*end, bool *success);
diff --git a/src/runner/runner.c b/src/runner/runner.c
index e334cf1..abbd05c 100644
--- a/src/runner/runner.c
+++ b/src/runner/runner.c
@@ -669,24 +669,6 @@ AstTree *runAstTreeBuiltin(AstTree *tree, AstTreeScope *scope,
case AST_TREE_TOKEN_TYPE_U64:
*(u64 *)ret->metadata = *(u64 *)ret->metadata % *(u64 *)right->metadata;
break;
-#ifdef FLOAT_16_SUPPORT
- case AST_TREE_TOKEN_TYPE_F16:
- *(f16 *)ret->metadata =
- fmodf(*(f16 *)ret->metadata, *(f16 *)right->metadata);
- break;
-#endif
- case AST_TREE_TOKEN_TYPE_F32:
- *(f32 *)ret->metadata =
- fmodf(*(f32 *)ret->metadata, *(f32 *)right->metadata);
- break;
- case AST_TREE_TOKEN_TYPE_F64:
- *(f64 *)ret->metadata =
- fmod(*(f64 *)ret->metadata, *(f64 *)right->metadata);
- break;
- case AST_TREE_TOKEN_TYPE_F128:
- *(f128 *)ret->metadata =
- fmodl(*(f128 *)ret->metadata, *(f128 *)right->metadata);
- break;
default:
UNREACHABLE;
}
diff --git a/src/utils/log.c b/src/utils/log.c
index 54253de..6d95628 100644
--- a/src/utils/log.c
+++ b/src/utils/log.c
@@ -7,7 +7,7 @@
void _printLogBack(const char *format, const char *file, int line, ...) {
va_list args;
- va_start(args, end);
+ va_start(args, line);
char *errorStr;
vasprintf(&errorStr, format, args);
@@ -18,7 +18,7 @@ void _printLogBack(const char *format, const char *file, int line, ...) {
void _printErrorWarningBack(const char *file, int line, const char *begin, const char *end,
bool isError, const char *format, ...) {
va_list args;
- va_start(args, end);
+ va_start(args, format);
char *errorStr;
vasprintf(&errorStr, format, args);
diff --git a/src/utils/string.c b/src/utils/string.c
index 55e6236..d05f0ec 100644
--- a/src/utils/string.c
+++ b/src/utils/string.c
@@ -39,7 +39,7 @@ size_t searchInStringArray(const char *array[], size_t array_size,
return array_size;
}
-u64 decimalToU64(char *str_begin, char *str_end, bool *success) {
+u64 decimalToU64(char const *str_begin, char const *str_end, bool *success) {
u64 result = 0;
while (str_begin < str_end) {
@@ -56,7 +56,7 @@ u64 decimalToU64(char *str_begin, char *str_end, bool *success) {
return result;
}
-f128 numberToFloat(char *str_begin, char *str_end, bool *success) {
+f128 numberToFloat(char const *str_begin, char const *str_end, bool *success) {
f128 left = 0;
f128 right = 0;
bool isPastPoint = false;
diff --git a/src/utils/string.h b/src/utils/string.h
index 56f6825..878311f 100644
--- a/src/utils/string.h
+++ b/src/utils/string.h
@@ -12,8 +12,8 @@ bool strnEquals(const char *left, const char *right, size_t len);
size_t searchInStringArray(const char *array[], size_t array_size,
const char *str, size_t str_size);
-u64 decimalToU64(char *str_begin, char *str_end, bool *success);
-f128 numberToFloat(char *str_begin, char *str_end, bool *success);
+u64 decimalToU64(char const*str_begin, char const*str_end, bool *success);
+f128 numberToFloat(char const*str_begin, char const*str_end, bool *success);
char *u64ToString(u64 value);
char *strClone(const char *str);