summaryrefslogtreecommitdiff
path: root/src/compiler
diff options
context:
space:
mode:
Diffstat (limited to 'src/compiler')
-rw-r--r--src/compiler/ast-tree.c16
-rw-r--r--src/compiler/ast-tree.h7
-rw-r--r--src/compiler/code-generator.c24
-rw-r--r--src/compiler/code-generator.h1
-rw-r--r--src/compiler/lexer.c4
-rw-r--r--src/compiler/lexer.h1
-rw-r--r--src/compiler/parser.c15
-rw-r--r--src/compiler/parser.h2
8 files changed, 19 insertions, 51 deletions
diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c
index 22ce146..a132840 100644
--- a/src/compiler/ast-tree.c
+++ b/src/compiler/ast-tree.c
@@ -8,7 +8,7 @@
const char *AST_TREE_TOKEN_STRINGS[] = {
"AST_TREE_TOKEN_FUNCTION",
- "AST_TREE_TOKEN_KEYWORD_PRINT",
+
"AST_TREE_TOKEN_KEYWORD_PRINT_U64",
"AST_TREE_TOKEN_NONE",
@@ -60,7 +60,6 @@ void astTreePrint(const AstTree *tree, int indent) {
printf("]");
}
goto RETURN_SUCCESS;
- case AST_TREE_TOKEN_KEYWORD_PRINT:
case AST_TREE_TOKEN_TYPE_VOID:
goto RETURN_SUCCESS;
case AST_TREE_TOKEN_KEYWORD_PRINT_U64: {
@@ -160,7 +159,6 @@ void astTreeDestroy(AstTree tree) {
free(metadata);
}
return;
- case AST_TREE_TOKEN_KEYWORD_PRINT:
case AST_TREE_TOKEN_TYPE_VOID:
case AST_TREE_TOKEN_VALUE_U64:
return;
@@ -333,8 +331,6 @@ AstTreeVariable *getVariable(AstTreeVariables *variables, size_t variables_size,
AstTree *astTreeParse(ParserNode *parserNode, AstTreeVariables *variables,
size_t variables_size) {
switch (parserNode->token) {
- case PARSER_TOKEN_KEYWORD_PRINT:
- return newAstTree(AST_TREE_TOKEN_KEYWORD_PRINT, NULL);
case PARSER_TOKEN_FUNCTION_DEFINITION:
return astTreeParseFunction(parserNode, variables, variables_size);
case PARSER_TOKEN_TYPE_FUNCTION:
@@ -594,7 +590,8 @@ bool hasTypeOf(AstTree *value, AstTree *type) {
}
return typeIsEqual(typeMetadata->returnType, valueMetadata->returnType);
}
- case AST_TREE_TOKEN_KEYWORD_PRINT:
+ case AST_TREE_TOKEN_KEYWORD_PRINT_U64:
+ case AST_TREE_TOKEN_VALUE_U64:
case AST_TREE_TOKEN_TYPE_FUNCTION:
case AST_TREE_TOKEN_TYPE_VOID:
case AST_TREE_TOKEN_FUNCTION_CALL:
@@ -604,10 +601,11 @@ bool hasTypeOf(AstTree *value, AstTree *type) {
}
goto ERROR;
case AST_TREE_TOKEN_FUNCTION:
- case AST_TREE_TOKEN_KEYWORD_PRINT:
case AST_TREE_TOKEN_TYPE_VOID:
case AST_TREE_TOKEN_FUNCTION_CALL:
case AST_TREE_TOKEN_IDENTIFIER:
+ case AST_TREE_TOKEN_KEYWORD_PRINT_U64:
+ case AST_TREE_TOKEN_VALUE_U64:
return false;
case AST_TREE_TOKEN_NONE:
}
@@ -619,7 +617,8 @@ ERROR:
bool typeIsEqual(AstTree *type0, AstTree *type1) {
switch (type0->token) {
case AST_TREE_TOKEN_FUNCTION:
- case AST_TREE_TOKEN_KEYWORD_PRINT:
+ case AST_TREE_TOKEN_KEYWORD_PRINT_U64:
+ case AST_TREE_TOKEN_VALUE_U64:
return false;
case AST_TREE_TOKEN_TYPE_VOID:
return type1->token == AST_TREE_TOKEN_TYPE_VOID;
@@ -636,6 +635,7 @@ bool typeIsEqual(AstTree *type0, AstTree *type1) {
return type1->token == AST_TREE_TOKEN_IDENTIFIER &&
type0->metadata == type1->metadata;
case AST_TREE_TOKEN_NONE:
+ break;
}
printLog("Bad token '%d'", type0->token);
exit(1);
diff --git a/src/compiler/ast-tree.h b/src/compiler/ast-tree.h
index 8a7617d..a557a1f 100644
--- a/src/compiler/ast-tree.h
+++ b/src/compiler/ast-tree.h
@@ -6,8 +6,9 @@
typedef enum AstTreeToken {
AST_TREE_TOKEN_FUNCTION,
- AST_TREE_TOKEN_KEYWORD_PRINT,
+
AST_TREE_TOKEN_KEYWORD_PRINT_U64,
+
AST_TREE_TOKEN_TYPE_FUNCTION,
AST_TREE_TOKEN_TYPE_VOID,
AST_TREE_TOKEN_FUNCTION_CALL,
@@ -108,8 +109,8 @@ AstTree *astTreeParseIdentifier(ParserNode *parserNode,
size_t variables_size);
AstTree *astTreeParsePrintU64(ParserNode *parserNode,
- AstTreeVariables *variables,
- size_t variables_size);
+ AstTreeVariables *variables,
+ size_t variables_size);
bool hasTypeOf(AstTree *value, AstTree *type);
bool typeIsEqual(AstTree *type0, AstTree *type1);
diff --git a/src/compiler/code-generator.c b/src/compiler/code-generator.c
index fb843d0..abe65f8 100644
--- a/src/compiler/code-generator.c
+++ b/src/compiler/code-generator.c
@@ -12,7 +12,6 @@ void codeGeneratorDelete(CodeGeneratorCodes *code) {
for (size_t i = 0; i < code->codes_size; ++i) {
CodeGeneratorCode current = code->codes[i];
switch (current.instruction) {
- case CODE_GENERATOR_INSTRUCTION_PRINT:
case CODE_GENERATOR_INSTRUCTION_PRINT_U64:
case CODE_GENERATOR_INSTRUCTION_RET:
continue;
@@ -78,10 +77,14 @@ CodeGeneratorCodes *codeGenerator(AstTreeRoot *astTreeRoot) {
return NULL;
}
continue;
- case AST_TREE_TOKEN_KEYWORD_PRINT:
case AST_TREE_TOKEN_TYPE_FUNCTION:
case AST_TREE_TOKEN_TYPE_VOID:
+ case AST_TREE_TOKEN_VALUE_U64:
+ case AST_TREE_TOKEN_IDENTIFIER:
+ case AST_TREE_TOKEN_KEYWORD_PRINT_U64:
+ case AST_TREE_TOKEN_FUNCTION_CALL:
case AST_TREE_TOKEN_NONE:
+ break;
}
printLog("Bad token %d", variable->value->token);
return NULL;
@@ -98,11 +101,6 @@ bool codeGeneratorAstTreeFunction(char *label_begin, char *label_end,
for (size_t i = 0; i < scope.expressions_size; ++i) {
AstTree tree = scope.expressions[i];
switch (tree.token) {
- case AST_TREE_TOKEN_KEYWORD_PRINT:
- generateCodePushCode(
- codes, createGenerateCode(label_begin, label_end,
- CODE_GENERATOR_INSTRUCTION_PRINT, NULL));
- goto OK;
case AST_TREE_TOKEN_FUNCTION_CALL: {
AstTreeFunctionCall *metadata = tree.metadata;
AstTree *function = metadata->function;
@@ -161,15 +159,13 @@ bool codeGeneratorAstTreeFunction(char *label_begin, char *label_end,
static const char TEMPLATE[] =
"format ELF64 executable 3\n\nSYS_exit = 60\nSYS_write = 1\nSTDOUT = "
- "1\n\nsegment readable writable\nhello: db \"Hello, "
- "World!\",0xa\nhello_len = $-hello\n\nsegment readable executable\nentry "
- "_start\n\nprint:\nmov rax, SYS_write\nmov rdi, STDOUT\nmov rsi, "
- "hello\nmov rdx, hello_len\nsyscall\nret\n\n; rdi = the "
+ "1\n\nsegment readable executable\nentry _start\n\n; rdi = the "
"number\nprint_u64:\nmov rcx, rsp\nmov rax, rdi\nmov rbx, 10\n\n.L:\nxor "
"rdx, rdx\ndiv rbx\nadd dl, '0'\ndec rcx\nmov [rcx],dl\ncmp rax, 0\njnz "
".L\n\nmov rax, SYS_write\nmov rdi, STDOUT\nmov rsi, rcx\n\nmov rdx, "
"rsp\nsub rdx, rcx\n\nsyscall\nret\n\n_start:\ncall main\nmov rax, "
"SYS_exit\nxor rdi,rdi\nsyscall\n";
+
static const size_t TEMPLATE_LEN =
sizeof(TEMPLATE) / sizeof(*TEMPLATE) - sizeof(*TEMPLATE);
@@ -205,12 +201,6 @@ char *codeGeneratorToFlatASM(const CodeGeneratorCodes *codes) {
}
switch (code.instruction) {
- case CODE_GENERATOR_INSTRUCTION_PRINT: {
- constexpr char INST[] = "call print\n";
- codeGeneratorAppendFlatASMCommand(&fasm, &fasm_size, &fasm_inserted, INST,
- strlen(INST));
- }
- continue;
case CODE_GENERATOR_INSTRUCTION_PRINT_U64: {
CodeGeneratorOperandU64 metadata = (CodeGeneratorOperandU64)code.metadata;
char *inst;
diff --git a/src/compiler/code-generator.h b/src/compiler/code-generator.h
index ace6e97..03415a4 100644
--- a/src/compiler/code-generator.h
+++ b/src/compiler/code-generator.h
@@ -5,7 +5,6 @@
#include <stdint.h>
typedef enum CodeGeneratorInstruction : uint8_t {
- CODE_GENERATOR_INSTRUCTION_PRINT,
CODE_GENERATOR_INSTRUCTION_PRINT_U64,
CODE_GENERATOR_INSTRUCTION_CALL,
CODE_GENERATOR_INSTRUCTION_RET,
diff --git a/src/compiler/lexer.c b/src/compiler/lexer.c
index 8b8b6bb..322d65a 100644
--- a/src/compiler/lexer.c
+++ b/src/compiler/lexer.c
@@ -11,7 +11,6 @@
const char *LEXER_TOKEN_STRINGS[] = {
"LEXER_TOKEN_IDENTIFIER",
"LEXER_TOKEN_KEYWORD_VOID",
- "LEXER_TOKEN_KEYWORD_PRINT",
"LEXER_TOKEN_KEYWORD_PRINT_U64",
"LEXER_TOKEN_NUMBER",
@@ -47,12 +46,10 @@ const size_t LEXER_SYMBOL_SIZE =
const char *LEXER_KEYWORD_STRINGS[] = {
"void",
- "print",
"print_u64",
};
const LexerToken LEXER_KEYWORD_TOKENS[] = {
LEXER_TOKEN_KEYWORD_VOID,
- LEXER_TOKEN_KEYWORD_PRINT,
LEXER_TOKEN_KEYWORD_PRINT_U64,
};
const size_t LEXER_KEYWORD_SIZE =
@@ -171,7 +168,6 @@ void lexerPushClear(LexerNodeArray *array, size_t *array_size, char *iter,
// goto PUSH;
PUSH:
case LEXER_TOKEN_KEYWORD_VOID:
- case LEXER_TOKEN_KEYWORD_PRINT:
case LEXER_TOKEN_KEYWORD_PRINT_U64:
case LEXER_TOKEN_NUMBER:
case LEXER_TOKEN_SYMBOL_EOL:
diff --git a/src/compiler/lexer.h b/src/compiler/lexer.h
index c3871e0..ca012c2 100644
--- a/src/compiler/lexer.h
+++ b/src/compiler/lexer.h
@@ -5,7 +5,6 @@
typedef enum LexerToken {
LEXER_TOKEN_IDENTIFIER,
LEXER_TOKEN_KEYWORD_VOID,
- LEXER_TOKEN_KEYWORD_PRINT,
LEXER_TOKEN_KEYWORD_PRINT_U64,
LEXER_TOKEN_NUMBER,
diff --git a/src/compiler/parser.c b/src/compiler/parser.c
index 333d755..a42c005 100644
--- a/src/compiler/parser.c
+++ b/src/compiler/parser.c
@@ -18,7 +18,6 @@ const char *PARSER_TOKEN_STRINGS[] = {
"PARSER_TOKEN_TYPE_FUNCTION",
"PARSER_TOKEN_TYPE_VOID",
- "PARSER_TOKEN_KEYWORD_PRINT",
"PARSER_TOKEN_KEYWORD_PRINT_U64",
"PARSER_TOKEN_CONSTANT",
@@ -69,7 +68,6 @@ static constexpr ParserOrder PARSER_ORDER[] = {
.data =
{
LEXER_TOKEN_SYMBOL_COLON,
- LEXER_TOKEN_KEYWORD_PRINT,
LEXER_TOKEN_KEYWORD_PRINT_U64,
},
},
@@ -115,7 +113,6 @@ void parserNodePrint(const ParserNode *node, int indent) {
goto RETURN_SUCCESS;
case PARSER_TOKEN_IDENTIFIER:
case PARSER_TOKEN_TYPE_VOID:
- case PARSER_TOKEN_KEYWORD_PRINT:
goto RETURN_SUCCESS;
case PARSER_TOKEN_VALUE_U64: {
ParserNodeU64Metadata metadata = (ParserNodeU64Metadata)node->metadata;
@@ -244,7 +241,6 @@ void parserNodeDelete(ParserNode *node) {
goto RETURN_SUCCESS;
case PARSER_TOKEN_IDENTIFIER:
case PARSER_TOKEN_TYPE_VOID:
- case PARSER_TOKEN_KEYWORD_PRINT:
case PARSER_TOKEN_VALUE_U64:
goto RETURN_SUCCESS;
case PARSER_TOKEN_CONSTANT: {
@@ -396,8 +392,6 @@ ParserNode *parseNode(LexerNode *node, LexerNode *begin, LexerNode *end,
return parserIdentifier(node, parent);
case LEXER_TOKEN_KEYWORD_VOID:
return parserVoid(node, parent);
- case LEXER_TOKEN_KEYWORD_PRINT:
- return parserPrint(node, parent);
case LEXER_TOKEN_KEYWORD_PRINT_U64:
return parserPrintU64(node, end, parent);
case LEXER_TOKEN_SYMBOL_EOL:
@@ -442,12 +436,6 @@ ParserNode *parserVoid(LexerNode *node, ParserNode *parent) {
node->str_end, NULL, parent);
}
-ParserNode *parserPrint(LexerNode *node, ParserNode *parent) {
- return node->parserNode =
- newParserNode(PARSER_TOKEN_KEYWORD_PRINT, node->str_begin,
- node->str_end, NULL, parent);
-}
-
ParserNode *parserPrintU64(LexerNode *node, LexerNode *end,
ParserNode *parent) {
LexerNode *afterNode = node + 1;
@@ -800,7 +788,6 @@ bool isExpression(ParserNode *node) {
case PARSER_TOKEN_CONSTANT:
case PARSER_TOKEN_SYMBOL_PARENTHESIS:
case PARSER_TOKEN_FUNCTION_DEFINITION:
- case PARSER_TOKEN_KEYWORD_PRINT:
case PARSER_TOKEN_FUNCTION_CALL:
case PARSER_TOKEN_KEYWORD_PRINT_U64:
return true;
@@ -827,7 +814,6 @@ bool isType(ParserNode *node) {
case PARSER_TOKEN_CONSTANT:
case PARSER_TOKEN_SYMBOL_PARENTHESIS:
case PARSER_TOKEN_FUNCTION_DEFINITION:
- case PARSER_TOKEN_KEYWORD_PRINT:
case PARSER_TOKEN_ROOT:
case PARSER_TOKEN_SYMBOL_EOL:
case PARSER_TOKEN_SYMBOL_CURLY_BRACKET:
@@ -852,7 +838,6 @@ bool isValue(ParserNode *node) {
case PARSER_TOKEN_IDENTIFIER:
case PARSER_TOKEN_CONSTANT:
case PARSER_TOKEN_SYMBOL_PARENTHESIS:
- case PARSER_TOKEN_KEYWORD_PRINT:
case PARSER_TOKEN_ROOT:
case PARSER_TOKEN_TYPE_FUNCTION:
case PARSER_TOKEN_SYMBOL_EOL:
diff --git a/src/compiler/parser.h b/src/compiler/parser.h
index 974fdd5..d5b11bd 100644
--- a/src/compiler/parser.h
+++ b/src/compiler/parser.h
@@ -14,7 +14,6 @@ typedef enum ParserToken {
PARSER_TOKEN_TYPE_FUNCTION,
PARSER_TOKEN_TYPE_VOID,
- PARSER_TOKEN_KEYWORD_PRINT,
PARSER_TOKEN_KEYWORD_PRINT_U64,
PARSER_TOKEN_CONSTANT,
@@ -94,7 +93,6 @@ ParserNode *getUntilCommonParent(ParserNode *node, ParserNode *parent);
ParserNode *parserIdentifier(LexerNode *node, ParserNode *parent);
ParserNode *parserVoid(LexerNode *node, ParserNode *parent);
-ParserNode *parserPrint(LexerNode *node, ParserNode *parent);
ParserNode *parserPrintU64(LexerNode *node, LexerNode *end, ParserNode *parent);
ParserNode *parserNumber(LexerNode *node, ParserNode *parent);
ParserNode *parserEol(LexerNode *node, LexerNode *begin, ParserNode *parent);