about summary refs log tree commit diff
path: root/src/bootstrap/parser.pry
diff options
context:
space:
mode:
authorBaitinq <[email protected]>2025-07-13 22:33:17 +0200
committerBaitinq <[email protected]>2025-07-13 22:33:17 +0200
commit00ab96818e8bb001ed26ee09adc1e3e230b03631 (patch)
tree4ffd13ede929092ccf8e9a76527b6e5a54212f87 /src/bootstrap/parser.pry
parentBoostrap: Support struct instanciation (diff)
downloadpry-lang-00ab96818e8bb001ed26ee09adc1e3e230b03631.tar.gz
pry-lang-00ab96818e8bb001ed26ee09adc1e3e230b03631.tar.bz2
pry-lang-00ab96818e8bb001ed26ee09adc1e3e230b03631.zip
Boostrap: Support struct field access assignment
Diffstat (limited to 'src/bootstrap/parser.pry')
-rw-r--r--src/bootstrap/parser.pry32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/bootstrap/parser.pry b/src/bootstrap/parser.pry
index 658d1f9..155244f 100644
--- a/src/bootstrap/parser.pry
+++ b/src/bootstrap/parser.pry
@@ -732,6 +732,7 @@ let parser_parse_function_definition = (p: *parser) => *Node {
 	return create_node(p, n); 
 };
 
+/* StructInstantiation ::= IDENTIFIER LBRACE RBRACE */
 let parser_parse_struct_instanciation = (p: *parser) => *Node {
 	let typ = parser_accept_token(p, TOKEN_IDENTIFIER);
 	if typ == cast(*token, null) {
@@ -755,6 +756,33 @@ let parser_parse_struct_instanciation = (p: *parser) => *Node {
 	return create_node(p, n); 
 };
 
+extern parser_parse_primary_expression = (*parser) => *Node;
+
+/* FieldAccess ::= PrimaryExpression DOT IDENTIFIER */
+let parser_parse_field_access = (p: *parser) => *Node {
+	let expression = parser_parse_primary_expression(p);
+	if expression == cast(*Node, null) {
+		return cast(*Node, null);
+	};
+	if parser_accept_token(p, TOKEN_DOT) == cast(*token, null) {
+		return cast(*Node, null);
+	};
+	let ident = parser_accept_token(p, TOKEN_IDENTIFIER);
+	if ident == cast(*token, null) {
+		return cast(*Node, null);
+	};
+
+	let d = cast(*NODE_FIELD_ACCESS_DATA, arena_alloc((*p).arena, sizeof(NODE_FIELD_ACCESS_DATA)));
+	(*d).expression = expression;
+	(*d).name = cast(*i8, (*ident).data);
+
+	let n = Node{};
+	n.type = NODE_FIELD_ACCESS;
+	n.data = cast(*void, d);
+
+	return create_node(p, n); 
+};
+
 /* PrimaryExpression ::= NULL | NUMBER | BOOLEAN | CHAR | STRING | IDENTIFIER | FunctionDefinition | StructDefinition | StructInstantiation | FieldAccess | LPAREN Expression RPAREN */
 let parser_parse_primary_expression = (p: *parser) => *Node {
 	let stmt = parser_accept_parse(p, parser_parse_function_definition);
@@ -953,6 +981,10 @@ let parser_parse_postfix_expression = (p: *parser) => *Node {
 	if ex != cast(*Node, null) {
 		return ex;
 	};
+	let ex = parser_accept_parse(p, parser_parse_field_access);
+	if ex != cast(*Node, null) {
+		return ex;
+	};
 	return parser_parse_primary_expression(p);
 };