From 44420249b454a4d1b1322c22a344a8b1b60fa3bd Mon Sep 17 00:00:00 2001 From: A404M Date: Wed, 9 Apr 2025 02:52:09 +0330 Subject: add putc keyword to print char remove print_u64 --- Makefile | 4 ++-- code/main.felan | 2 +- src/compiler/ast-tree.c | 36 ++++++++++++++++++------------------ src/compiler/ast-tree.h | 2 +- src/compiler/lexer.c | 8 ++++---- src/compiler/lexer.h | 2 +- src/compiler/parser.c | 24 ++++++++++++------------ src/compiler/parser.h | 4 ++-- src/runner/runner.c | 8 ++++---- 9 files changed, 45 insertions(+), 45 deletions(-) diff --git a/Makefile b/Makefile index 90092d3..f7e5e58 100644 --- a/Makefile +++ b/Makefile @@ -68,8 +68,8 @@ test/big.felan: Makefile echo "main :: () -> void {" > $@ for((n = 0;n < 100000;n++)); do echo " print(1);" >> $@; done echo "};" >> $@ - echo "print :: (value:u64) -> void {" >> $@ - echo " print_u64 value;" >> $@ + echo "print :: (value:u8) -> void {" >> $@ + echo " putc '0'+value;" >> $@ echo "};" >> $@ # $@ = left hand of : diff --git a/code/main.felan b/code/main.felan index 5609e27..70c08da 100644 --- a/code/main.felan +++ b/code/main.felan @@ -19,5 +19,5 @@ usize :: u64; main :: () -> void { a := 'a'; - print_u64 (if a == 97 1 else 0); + putc a; }; diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c index 678c533..6efdc6a 100644 --- a/src/compiler/ast-tree.c +++ b/src/compiler/ast-tree.c @@ -109,7 +109,7 @@ AstTree AST_TREE_VOID_VALUE = { const char *AST_TREE_TOKEN_STRINGS[] = { "AST_TREE_TOKEN_FUNCTION", - "AST_TREE_TOKEN_KEYWORD_PRINT_U64", + "AST_TREE_TOKEN_KEYWORD_PUTC", "AST_TREE_TOKEN_KEYWORD_RETURN", "AST_TREE_TOKEN_KEYWORD_IF", "AST_TREE_TOKEN_KEYWORD_WHILE", @@ -239,7 +239,7 @@ void astTreePrint(const AstTree *tree, int indent) { case AST_TREE_TOKEN_OPERATOR_DEREFERENCE: case AST_TREE_TOKEN_OPERATOR_PLUS: case AST_TREE_TOKEN_OPERATOR_MINUS: - case AST_TREE_TOKEN_KEYWORD_PRINT_U64: + case AST_TREE_TOKEN_KEYWORD_PUTC: case AST_TREE_TOKEN_KEYWORD_COMPTIME: { AstTreeSingleChild *metadata = tree->metadata; printf(",\n"); @@ -607,7 +607,7 @@ void astTreeDestroy(AstTree tree) { case AST_TREE_TOKEN_OPERATOR_DEREFERENCE: case AST_TREE_TOKEN_OPERATOR_PLUS: case AST_TREE_TOKEN_OPERATOR_MINUS: - case AST_TREE_TOKEN_KEYWORD_PRINT_U64: + case AST_TREE_TOKEN_KEYWORD_PUTC: case AST_TREE_TOKEN_KEYWORD_COMPTIME: { AstTreeSingleChild *metadata = tree.metadata; astTreeDelete(metadata); @@ -947,7 +947,7 @@ AstTree *copyAstTreeBack(AstTree *tree, AstTreeVariables oldVariables[], case AST_TREE_TOKEN_OPERATOR_DEREFERENCE: case AST_TREE_TOKEN_OPERATOR_PLUS: case AST_TREE_TOKEN_OPERATOR_MINUS: - case AST_TREE_TOKEN_KEYWORD_PRINT_U64: + case AST_TREE_TOKEN_KEYWORD_PUTC: case AST_TREE_TOKEN_KEYWORD_COMPTIME: { AstTreeSingleChild *metadata = tree->metadata; AstTreeSingleChild *new_metadata = @@ -1289,7 +1289,7 @@ AstTreeRoot *makeAstTree(ParserNode *parsedRoot) { case PARSER_TOKEN_KEYWORD_STRUCT: goto AFTER_SWITCH; case PARSER_TOKEN_ROOT: - case PARSER_TOKEN_KEYWORD_PRINT_U64: + case PARSER_TOKEN_KEYWORD_PUTC: case PARSER_TOKEN_KEYWORD_RETURN: case PARSER_TOKEN_CONSTANT: case PARSER_TOKEN_VARIABLE: @@ -1477,7 +1477,7 @@ AstTree *astTreeParse(ParserNode *parserNode, AstTreeHelper *helper) { return astTreeParseKeyword(parserNode, AST_TREE_TOKEN_VALUE_NULL); case PARSER_TOKEN_KEYWORD_UNDEFINED: return astTreeParseKeyword(parserNode, AST_TREE_TOKEN_VALUE_UNDEFINED); - case PARSER_TOKEN_KEYWORD_PRINT_U64: + case PARSER_TOKEN_KEYWORD_PUTC: return astTreeParsePrintU64(parserNode, helper); case PARSER_TOKEN_KEYWORD_RETURN: return astTreeParseReturn(parserNode, helper); @@ -1680,7 +1680,7 @@ AstTree *astTreeParseFunction(ParserNode *parserNode, AstTreeHelper *p_helper) { case PARSER_TOKEN_TYPE_F64: case PARSER_TOKEN_TYPE_F128: case PARSER_TOKEN_TYPE_BOOL: - case PARSER_TOKEN_KEYWORD_PRINT_U64: + case PARSER_TOKEN_KEYWORD_PUTC: case PARSER_TOKEN_KEYWORD_RETURN: case PARSER_TOKEN_KEYWORD_COMPTIME: case PARSER_TOKEN_KEYWORD_STRUCT: @@ -1919,7 +1919,7 @@ AstTree *astTreeParsePrintU64(ParserNode *parserNode, AstTreeHelper *helper) { return NULL; } - return newAstTree(AST_TREE_TOKEN_KEYWORD_PRINT_U64, + return newAstTree(AST_TREE_TOKEN_KEYWORD_PUTC, (AstTreeSingleChild *)operand, NULL, parserNode->str_begin, parserNode->str_end); } @@ -2227,7 +2227,7 @@ AstTree *astTreeParseCurlyBracket(ParserNode *parserNode, case PARSER_TOKEN_TYPE_F64: case PARSER_TOKEN_TYPE_F128: case PARSER_TOKEN_TYPE_BOOL: - case PARSER_TOKEN_KEYWORD_PRINT_U64: + case PARSER_TOKEN_KEYWORD_PUTC: case PARSER_TOKEN_KEYWORD_RETURN: case PARSER_TOKEN_KEYWORD_COMPTIME: case PARSER_TOKEN_KEYWORD_STRUCT: @@ -2462,7 +2462,7 @@ bool isConst(AstTree *tree) { return true; } case AST_TREE_TOKEN_KEYWORD_WHILE: - case AST_TREE_TOKEN_KEYWORD_PRINT_U64: + case AST_TREE_TOKEN_KEYWORD_PUTC: case AST_TREE_TOKEN_KEYWORD_RETURN: case AST_TREE_TOKEN_VARIABLE_DEFINE: case AST_TREE_TOKEN_OPERATOR_ASSIGN: @@ -2561,7 +2561,7 @@ bool isConstByValue(AstTree *tree) { return true; } case AST_TREE_TOKEN_KEYWORD_WHILE: - case AST_TREE_TOKEN_KEYWORD_PRINT_U64: + case AST_TREE_TOKEN_KEYWORD_PUTC: case AST_TREE_TOKEN_KEYWORD_RETURN: case AST_TREE_TOKEN_VARIABLE_DEFINE: case AST_TREE_TOKEN_OPERATOR_ASSIGN: @@ -2714,7 +2714,7 @@ AstTree *makeTypeOf(AstTree *value) { } case AST_TREE_TOKEN_VALUE_OBJECT: case AST_TREE_TOKEN_VARIABLE_DEFINE: - case AST_TREE_TOKEN_KEYWORD_PRINT_U64: + case AST_TREE_TOKEN_KEYWORD_PUTC: case AST_TREE_TOKEN_KEYWORD_RETURN: case AST_TREE_TOKEN_KEYWORD_IF: case AST_TREE_TOKEN_KEYWORD_WHILE: @@ -2749,7 +2749,7 @@ bool typeIsEqual(AstTree *type0, AstTree *type1) { bool typeIsEqualBack(const AstTree *type0, const AstTree *type1) { switch (type0->token) { case AST_TREE_TOKEN_FUNCTION: - case AST_TREE_TOKEN_KEYWORD_PRINT_U64: + case AST_TREE_TOKEN_KEYWORD_PUTC: case AST_TREE_TOKEN_KEYWORD_RETURN: case AST_TREE_TOKEN_KEYWORD_IF: case AST_TREE_TOKEN_KEYWORD_WHILE: @@ -2921,7 +2921,7 @@ AstTree *getValue(AstTree *tree) { case AST_TREE_TOKEN_FUNCTION: { return tree; } - case AST_TREE_TOKEN_KEYWORD_PRINT_U64: + case AST_TREE_TOKEN_KEYWORD_PUTC: case AST_TREE_TOKEN_KEYWORD_RETURN: case AST_TREE_TOKEN_VARIABLE_DEFINE: case AST_TREE_TOKEN_NONE: @@ -3045,7 +3045,7 @@ bool isCircularDependenciesBack(AstTreeHelper *helper, return false; } case AST_TREE_TOKEN_SCOPE: - case AST_TREE_TOKEN_KEYWORD_PRINT_U64: + case AST_TREE_TOKEN_KEYWORD_PUTC: case AST_TREE_TOKEN_KEYWORD_RETURN: case AST_TREE_TOKEN_VARIABLE_DEFINE: case AST_TREE_TOKEN_KEYWORD_IF: @@ -3162,7 +3162,7 @@ bool setAllTypes(AstTree *tree, AstTreeSetTypesHelper helper, return setTypesValueObject(tree, helper); case AST_TREE_TOKEN_FUNCTION: return setTypesFunction(tree, helper); - case AST_TREE_TOKEN_KEYWORD_PRINT_U64: + case AST_TREE_TOKEN_KEYWORD_PUTC: return setTypesPrintU64(tree, helper); case AST_TREE_TOKEN_KEYWORD_RETURN: return setTypesReturn(tree, helper, function); @@ -3438,12 +3438,12 @@ bool setTypesFunction(AstTree *tree, AstTreeSetTypesHelper helper) { bool setTypesPrintU64(AstTree *tree, AstTreeSetTypesHelper _helper) { AstTreeSingleChild *metadata = tree->metadata; AstTreeSetTypesHelper helper = { - .lookingType = &AST_TREE_U64_TYPE, + .lookingType = &AST_TREE_U8_TYPE, .treeHelper = _helper.treeHelper, }; if (!setAllTypes(metadata, helper, NULL)) { return false; - } else if (!typeIsEqual(metadata->type, &AST_TREE_U64_TYPE)) { + } else if (!typeIsEqual(metadata->type, &AST_TREE_U8_TYPE)) { printError(tree->str_begin, tree->str_end, "Type mismatch"); return false; } else { diff --git a/src/compiler/ast-tree.h b/src/compiler/ast-tree.h index fb708af..3ada2df 100644 --- a/src/compiler/ast-tree.h +++ b/src/compiler/ast-tree.h @@ -8,7 +8,7 @@ typedef enum AstTreeToken { AST_TREE_TOKEN_FUNCTION, - AST_TREE_TOKEN_KEYWORD_PRINT_U64, + AST_TREE_TOKEN_KEYWORD_PUTC, AST_TREE_TOKEN_KEYWORD_RETURN, AST_TREE_TOKEN_KEYWORD_IF, AST_TREE_TOKEN_KEYWORD_WHILE, diff --git a/src/compiler/lexer.c b/src/compiler/lexer.c index 43ea4c1..9a8d1a4 100644 --- a/src/compiler/lexer.c +++ b/src/compiler/lexer.c @@ -28,7 +28,7 @@ const char *LEXER_TOKEN_STRINGS[] = { "LEXER_TOKEN_KEYWORD_F64", "LEXER_TOKEN_KEYWORD_F128", "LEXER_TOKEN_KEYWORD_BOOL", - "LEXER_TOKEN_KEYWORD_PRINT_U64", + "LEXER_TOKEN_KEYWORD_PUTC", "LEXER_TOKEN_KEYWORD_RETURN", "LEXER_TOKEN_KEYWORD_TRUE", "LEXER_TOKEN_KEYWORD_FALSE", @@ -122,7 +122,7 @@ const char *LEXER_KEYWORD_STRINGS[] = { #ifdef FLOAT_16_SUPPORT "f16", #endif - "f32", "f64", "f128", "bool", "print_u64", + "f32", "f64", "f128", "bool", "putc", "return", "true", "false", "if", "else", "while", "comptime", "null", "struct", "undefined", }; @@ -137,7 +137,7 @@ const LexerToken LEXER_KEYWORD_TOKENS[] = { #endif LEXER_TOKEN_KEYWORD_F32, LEXER_TOKEN_KEYWORD_F64, LEXER_TOKEN_KEYWORD_F128, LEXER_TOKEN_KEYWORD_BOOL, - LEXER_TOKEN_KEYWORD_PRINT_U64, LEXER_TOKEN_KEYWORD_RETURN, + LEXER_TOKEN_KEYWORD_PUTC, LEXER_TOKEN_KEYWORD_RETURN, LEXER_TOKEN_KEYWORD_TRUE, LEXER_TOKEN_KEYWORD_FALSE, LEXER_TOKEN_KEYWORD_IF, LEXER_TOKEN_KEYWORD_ELSE, LEXER_TOKEN_KEYWORD_WHILE, LEXER_TOKEN_KEYWORD_COMPTIME, @@ -309,7 +309,7 @@ void lexerPushClear(LexerNodeArray *array, size_t *array_size, char *iter, case LEXER_TOKEN_KEYWORD_F64: case LEXER_TOKEN_KEYWORD_F128: case LEXER_TOKEN_KEYWORD_BOOL: - case LEXER_TOKEN_KEYWORD_PRINT_U64: + case LEXER_TOKEN_KEYWORD_PUTC: case LEXER_TOKEN_KEYWORD_RETURN: case LEXER_TOKEN_KEYWORD_TRUE: case LEXER_TOKEN_KEYWORD_FALSE: diff --git a/src/compiler/lexer.h b/src/compiler/lexer.h index 42f7aa8..80cd914 100644 --- a/src/compiler/lexer.h +++ b/src/compiler/lexer.h @@ -23,7 +23,7 @@ typedef enum LexerToken { LEXER_TOKEN_KEYWORD_F64, LEXER_TOKEN_KEYWORD_F128, LEXER_TOKEN_KEYWORD_BOOL, - LEXER_TOKEN_KEYWORD_PRINT_U64, + LEXER_TOKEN_KEYWORD_PUTC, LEXER_TOKEN_KEYWORD_RETURN, LEXER_TOKEN_KEYWORD_TRUE, LEXER_TOKEN_KEYWORD_FALSE, diff --git a/src/compiler/parser.c b/src/compiler/parser.c index 8df9b2d..78dc18f 100644 --- a/src/compiler/parser.c +++ b/src/compiler/parser.c @@ -38,7 +38,7 @@ const char *PARSER_TOKEN_STRINGS[] = { "PARSER_TOKEN_TYPE_F64", "PARSER_TOKEN_TYPE_F128", - "PARSER_TOKEN_KEYWORD_PRINT_U64", + "PARSER_TOKEN_KEYWORD_PUTC", "PARSER_TOKEN_KEYWORD_RETURN", "PARSER_TOKEN_KEYWORD_IF", "PARSER_TOKEN_KEYWORD_WHILE", @@ -158,7 +158,7 @@ static const ParserOrder PARSER_ORDER[] = { }, { .ltr = false, - ORDER_ARRAY(LEXER_TOKEN_KEYWORD_RETURN, LEXER_TOKEN_KEYWORD_PRINT_U64, + ORDER_ARRAY(LEXER_TOKEN_KEYWORD_RETURN, LEXER_TOKEN_KEYWORD_PUTC, LEXER_TOKEN_KEYWORD_COMPTIME, ), }, { @@ -270,7 +270,7 @@ void parserNodePrint(const ParserNode *node, int indent) { case PARSER_TOKEN_OPERATOR_DEREFERENCE: case PARSER_TOKEN_OPERATOR_PLUS: case PARSER_TOKEN_OPERATOR_MINUS: - case PARSER_TOKEN_KEYWORD_PRINT_U64: + case PARSER_TOKEN_KEYWORD_PUTC: case PARSER_TOKEN_KEYWORD_COMPTIME: case PARSER_TOKEN_SYMBOL_COMMA: case PARSER_TOKEN_SYMBOL_EOL: { @@ -516,7 +516,7 @@ void parserNodeDelete(ParserNode *node) { case PARSER_TOKEN_OPERATOR_DEREFERENCE: case PARSER_TOKEN_OPERATOR_PLUS: case PARSER_TOKEN_OPERATOR_MINUS: - case PARSER_TOKEN_KEYWORD_PRINT_U64: + case PARSER_TOKEN_KEYWORD_PUTC: case PARSER_TOKEN_KEYWORD_COMPTIME: case PARSER_TOKEN_SYMBOL_COMMA: case PARSER_TOKEN_SYMBOL_EOL: { @@ -739,8 +739,8 @@ ParserNode *parseNode(LexerNode *node, LexerNode *begin, LexerNode *end, return parserNoMetadata(node, parent, PARSER_TOKEN_KEYWORD_NULL); case LEXER_TOKEN_KEYWORD_UNDEFINED: return parserNoMetadata(node, parent, PARSER_TOKEN_KEYWORD_UNDEFINED); - case LEXER_TOKEN_KEYWORD_PRINT_U64: - return parserPrintU64(node, end, parent); + case LEXER_TOKEN_KEYWORD_PUTC: + return parserPutc(node, end, parent); case LEXER_TOKEN_KEYWORD_RETURN: return parserReturn(node, end, parent); case LEXER_TOKEN_KEYWORD_TRUE: @@ -943,7 +943,7 @@ ParserNode *parserNoMetadata(LexerNode *node, ParserNode *parent, newParserNode(token, node->str_begin, node->str_end, NULL, parent); } -ParserNode *parserPrintU64(LexerNode *node, LexerNode *end, +ParserNode *parserPutc(LexerNode *node, LexerNode *end, ParserNode *parent) { LexerNode *afterNode = node + 1; if (afterNode >= end) { @@ -961,7 +961,7 @@ ParserNode *parserPrintU64(LexerNode *node, LexerNode *end, } return operand->parent = node->parserNode = newParserNode( - PARSER_TOKEN_KEYWORD_PRINT_U64, node->str_begin, node->str_end, + PARSER_TOKEN_KEYWORD_PUTC, node->str_begin, node->str_end, (ParserNodeSingleChildMetadata *)operand, parent); } @@ -1268,7 +1268,7 @@ ParserNode *parserFunction(LexerNode *node, LexerNode *begin, LexerNode *end, case PARSER_TOKEN_TYPE_F128: case PARSER_TOKEN_KEYWORD_NULL: case PARSER_TOKEN_KEYWORD_UNDEFINED: - case PARSER_TOKEN_KEYWORD_PRINT_U64: + case PARSER_TOKEN_KEYWORD_PUTC: case PARSER_TOKEN_KEYWORD_RETURN: case PARSER_TOKEN_KEYWORD_STRUCT: case PARSER_TOKEN_CONSTANT: @@ -1702,7 +1702,7 @@ bool isExpression(ParserNode *node) { case PARSER_TOKEN_SYMBOL_PARENTHESIS: case PARSER_TOKEN_FUNCTION_DEFINITION: case PARSER_TOKEN_FUNCTION_CALL: - case PARSER_TOKEN_KEYWORD_PRINT_U64: + case PARSER_TOKEN_KEYWORD_PUTC: case PARSER_TOKEN_KEYWORD_RETURN: case PARSER_TOKEN_OPERATOR_ACCESS: case PARSER_TOKEN_OPERATOR_ASSIGN: @@ -1809,7 +1809,7 @@ bool isType(ParserNode *node) { case PARSER_TOKEN_VALUE_FLOAT: case PARSER_TOKEN_VALUE_BOOL: case PARSER_TOKEN_VALUE_CHAR: - case PARSER_TOKEN_KEYWORD_PRINT_U64: + case PARSER_TOKEN_KEYWORD_PUTC: case PARSER_TOKEN_KEYWORD_RETURN: case PARSER_TOKEN_OPERATOR_ASSIGN: case PARSER_TOKEN_OPERATOR_SUM_ASSIGN: @@ -1901,7 +1901,7 @@ bool isValue(ParserNode *node) { case PARSER_TOKEN_SYMBOL_EOL: case PARSER_TOKEN_SYMBOL_CURLY_BRACKET: case PARSER_TOKEN_SYMBOL_COMMA: - case PARSER_TOKEN_KEYWORD_PRINT_U64: + case PARSER_TOKEN_KEYWORD_PUTC: case PARSER_TOKEN_KEYWORD_RETURN: case PARSER_TOKEN_KEYWORD_WHILE: return false; diff --git a/src/compiler/parser.h b/src/compiler/parser.h index cb7af45..e55ee22 100644 --- a/src/compiler/parser.h +++ b/src/compiler/parser.h @@ -34,7 +34,7 @@ typedef enum ParserToken { PARSER_TOKEN_TYPE_F64, PARSER_TOKEN_TYPE_F128, - PARSER_TOKEN_KEYWORD_PRINT_U64, + PARSER_TOKEN_KEYWORD_PUTC, PARSER_TOKEN_KEYWORD_RETURN, PARSER_TOKEN_KEYWORD_IF, PARSER_TOKEN_KEYWORD_WHILE, @@ -177,7 +177,7 @@ LexerNode *getNextLexerNodeUsingCommonParent(LexerNode *node, LexerNode *end, ParserNode *parserNoMetadata(LexerNode *node, ParserNode *parent, ParserToken token); -ParserNode *parserPrintU64(LexerNode *node, LexerNode *end, ParserNode *parent); +ParserNode *parserPutc(LexerNode *node, LexerNode *end, ParserNode *parent); ParserNode *parserReturn(LexerNode *node, LexerNode *end, ParserNode *parent); ParserNode *parserNumber(LexerNode *node, ParserNode *parent); ParserNode *parserChar(LexerNode *node, ParserNode *parent); diff --git a/src/runner/runner.c b/src/runner/runner.c index 516870d..792ee83 100644 --- a/src/runner/runner.c +++ b/src/runner/runner.c @@ -96,10 +96,10 @@ AstTree *runAstTreeFunction(AstTree *tree, AstTreeFunctionCallParam *arguments, AstTree *runExpression(AstTree *expr, bool *shouldRet, bool isLeft) { switch (expr->token) { - case AST_TREE_TOKEN_KEYWORD_PRINT_U64: { + case AST_TREE_TOKEN_KEYWORD_PUTC: { AstTreeSingleChild *metadata = expr->metadata; AstTree *tree = runExpression(metadata, shouldRet, false); - printf("%lu", *(AstTreeInt *)tree->metadata); + printf("%c", (u8)*(AstTreeInt *)tree->metadata); astTreeDelete(tree); return &AST_TREE_VOID_VALUE; } @@ -780,7 +780,7 @@ AstTree *runExpression(AstTree *expr, bool *shouldRet, bool isLeft) { } else if (left->type == &AST_TREE_F16_TYPE && right->type == &AST_TREE_F16_TYPE) { doLogicalOperation(left, right, <=, AstTreeFloat, f16); - #endif +#endif } else { printError(expr->str_begin, expr->str_end, "Not supported"); UNREACHABLE; @@ -802,7 +802,7 @@ AstTree *runExpression(AstTree *expr, bool *shouldRet, bool isLeft) { case AST_TREE_TOKEN_TYPE_U64: #ifdef FLOAT_16_SUPPORT case AST_TREE_TOKEN_TYPE_F16: - #endif +#endif case AST_TREE_TOKEN_TYPE_F32: case AST_TREE_TOKEN_TYPE_F64: case AST_TREE_TOKEN_TYPE_F128: -- cgit v1.2.3