aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorA404M <ahmadmahmoudiprogrammer@gmail.com>2024-09-19 06:26:42 +0330
committerA404M <ahmadmahmoudiprogrammer@gmail.com>2024-09-19 06:26:42 +0330
commit66739336e7358188ee7828d311881e06b2f3ad83 (patch)
tree51ad82d338cb3750a6ff659c66ba7473dc5872a0
parenta1283a31533c7728f073448cb8a20ea98c5cb40e (diff)
fixed an error in strings
fixed error in parenthesis some code clean up
-rw-r--r--src/compiler/lexer/lexer.c2
-rw-r--r--src/compiler/parser/parser.c95
-rw-r--r--src/compiler/parser/parser.h7
3 files changed, 81 insertions, 23 deletions
diff --git a/src/compiler/lexer/lexer.c b/src/compiler/lexer/lexer.c
index c216298..eee5ec3 100644
--- a/src/compiler/lexer/lexer.c
+++ b/src/compiler/lexer/lexer.c
@@ -174,6 +174,8 @@ Nodes lexer(char const *restrict str) {
const char current = str[i];
if (current == c) {
break;
+ }else if(current == '\\'){
+ ++i;
} else if (current == '\0') {
fprintf(stderr, "expected %c to end\n", c);
exit(1);
diff --git a/src/compiler/parser/parser.c b/src/compiler/parser/parser.c
index 7a486d9..2f5b89b 100644
--- a/src/compiler/parser/parser.c
+++ b/src/compiler/parser/parser.c
@@ -13,7 +13,7 @@ const char *PARSED_TOKEN_STRINGS[] = {
static const ParseOrder PARSE_ORDER[] = {
{
- .ltr = false,
+ .ltr = true,
.size = 2,
.tokens =
{
@@ -157,8 +157,8 @@ ParsedNode *parser(Nodes lexedNodes) {
ParsedNode *root = a404m_malloc(sizeof(ParsedNode));
root->token = PARSED_TOKEN_ROOT;
root->parent = NULL;
- root->metadata =
- parserScope(lexedNodes.nodes, lexedNodes.nodes + lexedNodes.size, root);
+ root->metadata = parserScopeCode(lexedNodes.nodes,
+ lexedNodes.nodes + lexedNodes.size, root);
if (root->metadata == NULL) {
free(root);
return NULL;
@@ -166,8 +166,8 @@ ParsedNode *parser(Nodes lexedNodes) {
return root;
}
-ScopeMetadata *parserScope(Node *nodesBegin, Node *nodesEnd,
- ParsedNode *parent) {
+ScopeMetadata *parserScope(Node *nodesBegin, Node *nodesEnd, ParsedNode *parent,
+ bool (*isAllowed)(ParsedToken)) {
if (nodesBegin >= nodesEnd) {
return NULL;
}
@@ -176,14 +176,14 @@ ScopeMetadata *parserScope(Node *nodesBegin, Node *nodesEnd,
ParsedNode **nodes = a404m_malloc(nodes_size * sizeof(ParsedNode *));
size_t nodes_inserted = 0;
- for (size_t i = 0; i < PARSE_ORDER_SIZE; ++i) {
- const ParseOrder order = PARSE_ORDER[i];
+ for (size_t order_index = 0; order_index < PARSE_ORDER_SIZE; ++order_index) {
+ const ParseOrder order = PARSE_ORDER[order_index];
for (Node *node = order.ltr ? nodesBegin : (nodesEnd - 1);
nodesBegin <= node && node < nodesEnd; order.ltr ? ++node : --node) {
- for (size_t j = 0; j < order.size; ++j) {
- const Token token = order.tokens[j];
- if (node->token == token) {
+ for (size_t order_tokens_index = 0; order_tokens_index < order.size;
+ ++order_tokens_index) {
+ if (node->token == order.tokens[order_tokens_index]) {
ParsedNode *parsedNode =
parseNode(nodesBegin, nodesEnd, node, parent);
if (parsedNode == NULL) {
@@ -210,23 +210,29 @@ ScopeMetadata *parserScope(Node *nodesBegin, Node *nodesEnd,
}
}
- ScopeMetadata *metadata = a404m_malloc(sizeof(ScopeMetadata));
- metadata->operands = a404m_malloc(nodes_inserted * sizeof(ParsedNode *));
-
+ ParsedNode **operands = a404m_malloc(nodes_inserted * sizeof(ParsedNode *));
nodes_size = nodes_inserted;
nodes_inserted = 0;
for (size_t i = 0; i < nodes_size; ++i) {
ParsedNode *currentNode = nodes[i];
if (currentNode->parent == parent) {
- metadata->operands[nodes_inserted] = currentNode;
+ if (!isAllowed(currentNode->token)) {
+ fprintf(
+ stderr,
+ "error in parsing token '%s' is not allowed at compiler line %d\n",
+ PARSED_TOKEN_STRINGS[currentNode->token], __LINE__);
+ goto RETURN_ERROR;
+ }
+ operands[nodes_inserted] = currentNode;
++nodes_inserted;
}
}
free(nodes);
+ ScopeMetadata *metadata = a404m_malloc(sizeof(ScopeMetadata));
metadata->operands =
- a404m_realloc(metadata->operands, nodes_inserted * sizeof(ParsedNode *));
+ a404m_realloc(operands, nodes_inserted * sizeof(ParsedNode *));
metadata->operands_size = nodes_inserted;
return metadata;
@@ -236,6 +242,46 @@ RETURN_ERROR:
return NULL;
}
+static bool isAllowedCodeScope(ParsedToken token) {
+ switch (token) {
+ case PARSED_TOKEN_NONE:
+ case PARSED_TOKEN_ROOT:
+ case PARSED_TOKEN_PRINT:
+ case PARSED_TOKEN_PARENTHESIS:
+ case PARSED_TOKEN_VALUE_STRING:
+ return false;
+ case PARSED_TOKEN_EOL:
+ return true;
+ }
+ fprintf(stderr, "bad token '%d' at compiler line %d\n", token, __LINE__);
+ exit(1);
+}
+
+static bool isAllowedParenthesisScope(ParsedToken token) {
+ switch (token) {
+ case PARSED_TOKEN_PARENTHESIS:
+ case PARSED_TOKEN_VALUE_STRING:
+ return true;
+ case PARSED_TOKEN_NONE:
+ case PARSED_TOKEN_ROOT:
+ case PARSED_TOKEN_PRINT:
+ case PARSED_TOKEN_EOL:
+ return false;
+ }
+ fprintf(stderr, "bad token '%d' at compiler line %d\n", token, __LINE__);
+ exit(1);
+}
+
+ScopeMetadata *parserScopeCode(Node *nodesBegin, Node *nodesEnd,
+ ParsedNode *parent) {
+ return parserScope(nodesBegin, nodesEnd, parent, isAllowedCodeScope);
+}
+
+ScopeMetadata *parserScopeParenthesis(Node *nodesBegin, Node *nodesEnd,
+ ParsedNode *parent) {
+ return parserScope(nodesBegin, nodesEnd, parent, isAllowedParenthesisScope);
+}
+
ParsedNode *parseNode(Node *nodesBegin, Node *nodesEnd, Node *node,
ParsedNode *parent) {
switch (node->token) {
@@ -284,6 +330,7 @@ ParsedNode *parserPrint(Node *, Node *nodesEnd, Node *node,
ParsedNode *parseParenthesis(Node *nodesBegin, Node *, Node *node,
ParsedNode *parent) {
+ ParsedNode *parsedNode = a404m_malloc(sizeof(*parsedNode));
Node *opening = NULL;
Node *closing = node;
for (Node *iter = closing - 1; iter >= nodesBegin; --iter) {
@@ -295,26 +342,30 @@ ParsedNode *parseParenthesis(Node *nodesBegin, Node *, Node *node,
if (opening == NULL) {
fprintf(stderr, "error in parsing token '%s' at compiler line %d\n",
TOKEN_STRINGS[node->token], __LINE__);
- return NULL;
+ goto RETURN_ERROR;
}
- ParsedNode *parsedNode = closing->parsedNode = opening->parsedNode =
- a404m_malloc(sizeof(*parsedNode));
parsedNode->strBegin = opening->strBegin;
parsedNode->strEnd = closing->strEnd;
parsedNode->token = PARSED_TOKEN_PARENTHESIS;
parsedNode->parent = parent;
- parsedNode->metadata = parserScope(opening + 1, closing, parsedNode);
- if (parsedNode->metadata == NULL) {
+ const ScopeMetadata *metadata = parsedNode->metadata =
+ parserScopeParenthesis(opening + 1, closing, parsedNode);
+
+ if (metadata == NULL) {
fprintf(stderr, "error in parsing token '%s' at compiler line %d\n",
TOKEN_STRINGS[node->token], __LINE__);
- free(parsedNode);
- return NULL;
+ goto RETURN_ERROR;
}
+ closing->parsedNode = opening->parsedNode = parsedNode;
opening->token = closing->token = TOKEN_PARSED;
return parsedNode;
+
+RETURN_ERROR:
+ free(parsedNode);
+ return NULL;
}
ParsedNode *parseString(Node *node, ParsedNode *parent) {
diff --git a/src/compiler/parser/parser.h b/src/compiler/parser/parser.h
index efabc8c..4a39e17 100644
--- a/src/compiler/parser/parser.h
+++ b/src/compiler/parser/parser.h
@@ -46,7 +46,12 @@ extern void deleteParsedNode(ParsedNode *parsedNode);
extern ParsedNode *parser(Nodes lexedNodes);
extern ScopeMetadata *parserScope(Node *nodesBegin, Node *nodesEnd,
- ParsedNode *parent);
+ ParsedNode *parent,
+ bool (*isAllowed)(ParsedToken));
+extern ScopeMetadata *parserScopeCode(Node *nodesBegin, Node *nodesEnd,
+ ParsedNode *parent);
+extern ScopeMetadata *parserScopeParenthesis(Node *nodesBegin, Node *nodesEnd,
+ ParsedNode *parent);
extern ParsedNode *parseNode(Node *nodesBegin, Node *nodesEnd, Node *node,
ParsedNode *parent);