aboutsummaryrefslogtreecommitdiff
path: root/src/compiler/tree_parser/tree_parser.h
diff options
context:
space:
mode:
authorA404M <ahmadmahmoudiprogrammer@gmail.com>2024-09-22 19:34:43 +0330
committerA404M <ahmadmahmoudiprogrammer@gmail.com>2024-09-22 19:34:43 +0330
commitf79290084948f3cf140395c270c07cf29ca58e8d (patch)
treed716526678782153f3617bbf78984b4c4ebed380 /src/compiler/tree_parser/tree_parser.h
parentd2ab53c625d386a4fbc6a9d5a5eb29faab1b3f0c (diff)
Better errors
Added variables
Diffstat (limited to 'src/compiler/tree_parser/tree_parser.h')
-rw-r--r--src/compiler/tree_parser/tree_parser.h113
1 files changed, 113 insertions, 0 deletions
diff --git a/src/compiler/tree_parser/tree_parser.h b/src/compiler/tree_parser/tree_parser.h
new file mode 100644
index 0000000..0ee783f
--- /dev/null
+++ b/src/compiler/tree_parser/tree_parser.h
@@ -0,0 +1,113 @@
+#pragma once
+
+#include <compiler/parser/parser.h>
+
+#include "utils/types.h"
+
+typedef enum TreeToken {
+ TREE_TOKEN_NONE = 0,
+ TREE_TOKEN_GLOBAL_SCOPE,
+ TREE_TOKEN_LOCAL_SCOPE,
+ TREE_TOKEN_FUNCTION_CALL,
+ TREE_TOKEN_DEFINE_VARIABLE,
+ TREE_TOKEN_DEFINE_CONSTANT,
+ TREE_TOKEN_IDENTIFIER,
+ TREE_TOKEN_VALUE_STRING,
+ TREE_TOKEN_STRUCT,
+ TREE_TOKEN_FUNCTION,
+} TreeToken;
+
+extern const char *TREE_TOKEN_STRINGS[];
+
+typedef struct ParsedTree {
+ char const *strBegin;
+ char const *strEnd;
+ TreeToken token;
+ void *metadata;
+} ParsedTree;
+
+typedef struct TreeStructMetadata {
+} TreeStructMetadata;
+
+typedef ParsedTree *TypeId;
+
+typedef struct TreeDefineVariableMetadata {
+ char const *nameBegin;
+ char const *nameEnd;
+ TypeId type;
+ ParsedTree *value;
+ ParsedTree *tree;
+} TreeDefineVariableMetadata;
+
+typedef struct TreeFunctionCallMetadata {
+ TreeDefineVariableMetadata *function;
+ ParsedTree **values;
+ size_t values_size;
+} TreeFunctionCallMetadata;
+
+typedef struct TreeScopeMetadata {
+ ParsedTree **lines;
+ size_t lines_size;
+ TreeDefineVariableMetadata **variables;
+ size_t variables_size;
+} TreeScopeMetadata;
+
+typedef struct TreeIdentifierMetadata {
+ TreeDefineVariableMetadata *variable;
+} TreeIdentifierMetadata;
+
+typedef struct TreeFunctionMetadata {
+ TreeDefineVariableMetadata **params;
+ size_t params_size;
+ TreeScopeMetadata *scope;
+ TypeId returnType;
+} TreeFunctionMetadata;
+
+typedef SizedString TreeStringValueMetadata;
+
+extern void _printParsedTreeNode(const ParsedTree *parsedTree,int indent);
+extern void printParsedTreeNode(const ParsedTree *parsedTree);
+
+extern void deleteParsedTree(ParsedTree *parsedTree);
+
+extern ParsedTree *treeParser(SourceCode code);
+extern ParsedTree *_treeParser(const ParsedNode *node, SourceCode code);
+
+extern ParsedTree *treeParseNode(const ParsedNode *node, SourceCode code,
+ const TreeScopeMetadata *scopes[],
+ size_t scopes_size);
+
+extern ParsedTree *treeParseRoot(const ParsedNode *root, SourceCode code);
+extern ParsedTree *treeParseLocalScope(const ParsedNode *node, SourceCode code,
+ const TreeScopeMetadata *scopes[],
+ size_t scopes_size);
+
+extern TreeDefineVariableMetadata *treeParseDefineVariable(
+ ParsedTree *tree, const ParsedNode *node, SourceCode code,
+ const TreeScopeMetadata *scopes[], size_t scopes_size);
+extern TreeDefineVariableMetadata *getVariable(
+ const char *strBegin, const char *strEnd, SourceCode code,
+ const TreeScopeMetadata *scopes[], size_t scopes_size);
+extern ParsedTree *treeParseIdentifier(const ParsedNode *node, SourceCode code,
+ const TreeScopeMetadata *scopes[],
+ size_t scopes_size);
+extern ParsedTree *treeParseFunctionCall(const ParsedNode *node,
+ SourceCode code,
+ const TreeScopeMetadata *scopes[],
+ size_t scopes_size);
+extern ParsedTree *treeParseValueString(const ParsedNode *node,
+ SourceCode code);
+extern ParsedTree *treeParseVariableDefinition(
+ const ParsedNode *node, SourceCode code, const TreeScopeMetadata *scopes[],
+ size_t scopes_size, TreeToken token);
+extern ParsedTree *treeParseStruct(const ParsedNode *node, SourceCode code,
+ const TreeScopeMetadata *scopes[],
+ size_t scopes_size);
+extern ParsedTree *treeParseFunction(const ParsedNode *node, SourceCode code,
+ const TreeScopeMetadata *scopes[],
+ size_t scopes_size);
+
+extern TypeId getTreeExpressionType(ParsedTree *const tree);
+extern TypeId getType(const TreeDefineVariableMetadata *define);
+extern bool isType(ParsedTree *const tree);
+extern SizedString *nodeToString(ParsedNode const *tree, SourceCode code);