diff options
Diffstat (limited to 'src/bootstrap/parser.pry')
| -rw-r--r-- | src/bootstrap/parser.pry | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/src/bootstrap/parser.pry b/src/bootstrap/parser.pry index 5c34edb..355b54d 100644 --- a/src/bootstrap/parser.pry +++ b/src/bootstrap/parser.pry @@ -345,6 +345,40 @@ let parser_parse_cast_statement = (p: *parser) => *Node { return create_node(p, r); }; +/* SizeOfStatement ::= "sizeof" LPAREN TYPE RPAREN */ +let parser_parse_sizeof_statement = (p: *parser) => *Node { + let ident = parser_accept_token(p, TOKEN_IDENTIFIER); + if ident == cast(*token, null) { + return cast(*Node, null); + }; + + if !strcmp(cast(*i8, (*ident).data), "sizeof") { + return cast(*Node, null); + }; + + if parser_accept_token(p, TOKEN_LPAREN) == cast(*token, null) { + return cast(*Node, null); + }; + + let typ = parser_parse_type(p); + if typ == cast(*Node, null) { + return cast(*Node, null); + }; + + if parser_accept_token(p, TOKEN_RPAREN) == cast(*token, null) { + return cast(*Node, null); + }; + + let d = cast(*NODE_SIZEOF_STATEMENT_DATA , arena_alloc((*p).arena, sizeof(NODE_SIZEOF_STATEMENT_DATA ))); + (*d).typ = typ; + + let r = Node{}; + r.type = NODE_SIZEOF_STATEMENT; + r.data = cast(*void, d); + + return create_node(p, r); +}; + /* FunctionType ::= LPAREN (Type ("," Type)*)? RPAREN ARROW Type */ let parser_parse_function_type = (p: *parser) => *Node { if parser_accept_token(p, TOKEN_LPAREN) == cast(*token, null) { @@ -824,6 +858,10 @@ let parser_parse_postfix_expression = (p: *parser) => *Node { if ex != cast(*Node, null) { return ex; }; + let ex = parser_accept_parse(p, parser_parse_sizeof_statement); + if ex != cast(*Node, null) { + return ex; + }; let ex = parser_accept_parse(p, parse_function_call_statement); if ex != cast(*Node, null) { return ex; @@ -1136,6 +1174,14 @@ let parser_parse_statement = (p: *parser) => *Node { }; return fn_call; }; + + let fn_call = parser_accept_parse(p, parser_parse_sizeof_statement); + if fn_call != cast(*Node, null) { + if parser_accept_token(p, TOKEN_SEMICOLON) == cast(*token, null) { + return cast(*Node, null); + }; + return fn_call; + }; let fn_call = parser_accept_parse(p, parse_function_call_statement); if fn_call != cast(*Node, null) { |