diff options
Diffstat (limited to 'src/bootstrap/parser.pry')
| -rw-r--r-- | src/bootstrap/parser.pry | 32 |
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); }; |