about summary refs log tree commit diff
path: root/src/bootstrap/parser.pry
diff options
context:
space:
mode:
Diffstat (limited to 'src/bootstrap/parser.pry')
-rw-r--r--src/bootstrap/parser.pry52
1 files changed, 30 insertions, 22 deletions
diff --git a/src/bootstrap/parser.pry b/src/bootstrap/parser.pry
index 444a033..bc36a41 100644
--- a/src/bootstrap/parser.pry
+++ b/src/bootstrap/parser.pry
@@ -611,7 +611,6 @@ let parser_parse_function_definition = (p: *parser) => *Node {
 		return cast(*Node, null);
 	};
 	
-	/* TODO: Body */
 	let statements = cast(**Node, arena_alloc((*p).arena, sizeof(*Node) * 100));
 	let i = 0;
 	while true {
@@ -670,7 +669,7 @@ let parser_parse_primary_expression = (p: *parser) => *Node {
 	if (*tok).type == TOKEN_IDENTIFIER {
 	    let d = cast(*NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, arena_alloc((*p).arena, sizeof(NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA)));
 	    (*d).name = cast(*i8, (*tok).data);
-	    (*d).type = cast(*Node, null); /* TODO */
+	    (*d).type = cast(*Node, null);
 	    let n = Node{};
 	    n.type = NODE_PRIMARY_EXPRESSION_IDENTIFIER;
 	    n.data = cast(*void, d);
@@ -854,7 +853,11 @@ let parser_parse_unary_expression = (p: *parser) => *Node {
 
 	let new_lhs_data = cast(*NODE_UNARY_EXPRESSION_DATA, arena_alloc((*p).arena, sizeof(NODE_UNARY_EXPRESSION_DATA)));
 	((*new_lhs_data).typ) = typ;
-	((*new_lhs_data).expression) = parser_parse_unary_expression(p); /* TODO: try? */
+	let e = parser_parse_unary_expression(p);
+	if e == cast(*Node, null) {
+		return cast(*Node, null);
+	};
+	((*new_lhs_data).expression) = e;
 	let new_lhs = Node{};
 	new_lhs.type = NODE_UNARY_EXPRESSION;
 	new_lhs.data = cast(*void, new_lhs_data);
@@ -864,6 +867,9 @@ let parser_parse_unary_expression = (p: *parser) => *Node {
 /* MultiplicativeExpression ::= UnaryExpression (("*" | "/" | "%") UnaryExpression)* */
 let parser_parse_multiplicative_expression = (p: *parser) => *Node {
 	let lhs = parser_parse_unary_expression(p);
+	if lhs == cast(*Node, null) {
+		return cast(*Node, null);
+	};
 
 	while true {
 		let typ = -1;
@@ -881,6 +887,9 @@ let parser_parse_multiplicative_expression = (p: *parser) => *Node {
 		};
 
 		let rhs = parser_parse_unary_expression(p);
+		if rhs == cast(*Node, null) {
+			return cast(*Node, null);
+		};
 
 		let new_lhs_data = cast(*NODE_MULTIPLICATIVE_EXPRESSION_DATA, arena_alloc((*p).arena, sizeof(NODE_MULTIPLICATIVE_EXPRESSION_DATA)));
 		((*new_lhs_data).lhs) = lhs;
@@ -897,6 +906,9 @@ let parser_parse_multiplicative_expression = (p: *parser) => *Node {
 /* AdditiveExpression ::= MultiplicativeExpression (("+" | "-") MultiplicativeExpression)* */
 let parser_parse_additive_expression = (p: *parser) => *Node {
 	let lhs = parser_parse_multiplicative_expression(p);
+	if lhs == cast(*Node, null) {
+		return cast(*Node, null);
+	};
 
 	while true {
 		let plus = parser_accept_token(p, TOKEN_PLUS);
@@ -909,6 +921,9 @@ let parser_parse_additive_expression = (p: *parser) => *Node {
 		};
 
 		let rhs = parser_parse_multiplicative_expression(p);
+		if rhs == cast(*Node, null) {
+			return cast(*Node, null);
+		};
 
 		let new_lhs_data = cast(*NODE_ADDITIVE_EXPRESSION_DATA, arena_alloc((*p).arena, sizeof(NODE_ADDITIVE_EXPRESSION_DATA)));
 		((*new_lhs_data).addition) = plus != cast(*token, null);
@@ -940,13 +955,15 @@ let parser_parse_expression = (p: *parser) => *Node {
 let parse_assignment_statement = (p: *parser) => *Node {
 	let is_declaration = false;
 	if parser_accept_token(p, TOKEN_LET) != cast(*token, null) {
-	    printf("IS DECLARATION\n");
 	    is_declaration = true;
 	};
+	
+	let is_dereference = false;
+	if parser_accept_token(p, TOKEN_MUL) != cast(*token, null) {
+	    is_dereference = true;
+	};
 
-	/* TODO: is_dereference */
-
-	let lhs = parser_parse_expression(p); /* TODO */
+	let lhs = parser_parse_expression(p);
 	if lhs == cast(*Node, null) {
 	    return cast(*Node, null);
 	};	
@@ -955,14 +972,14 @@ let parse_assignment_statement = (p: *parser) => *Node {
 	    return cast(*Node, null);
 	};
 	
-	let rhs = parser_parse_expression(p); /* TODO */
+	let rhs = parser_parse_expression(p);
 	if rhs == cast(*Node, null) {
 	    return cast(*Node, null);
 	};
 
 	let d = cast(*NODE_ASSIGNMENT_STATEMENT_DATA , arena_alloc((*p).arena, sizeof(NODE_ASSIGNMENT_STATEMENT_DATA)));
 	(*d).is_declaration = is_declaration;
-	(*d).is_dereference = false;
+	(*d).is_dereference = is_dereference;
 	(*d).lhs = lhs;
 	(*d).rhs = rhs;
 	let n = Node{};
@@ -1011,10 +1028,10 @@ let parser_parse_import_declaration = (p: *parser) => *Node {
 	let bytes_read = read(file, file_contents, file_size);
 	(*(file_contents + cast(*i8, bytes_read))) = '\0';
 
-	let todo = slice{};
-	todo.data = cast(*void, file_contents);
-	todo.data_len = file_size;
-	let inner_tokenizer = tokenizer_init((*p).arena, todo);
+	let f = slice{};
+	f.data = cast(*void, file_contents);
+	f.data_len = file_size;
+	let inner_tokenizer = tokenizer_init((*p).arena, f);
 	let tokens = tokenizer_tokenize(inner_tokenizer);
 
 	let buf2 = cast(*i8, arena_alloc((*p).arena, 90));
@@ -1197,12 +1214,3 @@ let parse_program = (p: *parser) => *Node {
 let parse = (p: *parser) => *Node {
 	return parse_program(p);
 };
-
-/*
-
-For example -2:
-
-* parsing assignment statement
-* parsing ident and num literals
-
-*/