Parse ref/deref/parenthesis

This commit is contained in:
Sofia 2026-04-14 00:05:30 +03:00
parent 78c5ab4c25
commit d4016e3ab7
2 changed files with 25 additions and 1 deletions

View File

@ -101,6 +101,14 @@ namespace parsing {
try { try {
auto before_meta = inner.metadata(); auto before_meta = inner.metadata();
if (inner.peek().content == "(") {
inner.next();
auto expr = parse_expression(inner).unwrap();
inner.expect(token::Type::Symbol, ")");
stream.m_position = inner.m_position;
return expr;
}
if (auto cast = parse_cast(inner); cast.ok()) { if (auto cast = parse_cast(inner); cast.ok()) {
auto expr = parse_expression(inner).unwrap(); auto expr = parse_expression(inner).unwrap();
stream.m_position = inner.m_position; stream.m_position = inner.m_position;
@ -112,6 +120,22 @@ namespace parsing {
} }
}; };
} }
else if (inner.peek().content == "&") {
inner.next();
auto expr = parse_expression(inner).unwrap();
stream.m_position = inner.m_position;
return std::unique_ptr<AST::Expression> {
new AST::RefExpression(before_meta + inner.metadata(), std::move(expr))
};
}
else if (inner.peek().content == "*") {
inner.next();
auto expr = parse_expression(inner).unwrap();
stream.m_position = inner.m_position;
return std::unique_ptr<AST::Expression> {
new AST::DerefExpression(before_meta + inner.metadata(), std::move(expr))
};
}
auto plain_expr = parse_plain_expression(inner); auto plain_expr = parse_plain_expression(inner);
while (inner.peek().content == "(") { while (inner.peek().content == "(") {

2
test.c
View File

@ -10,6 +10,6 @@ int main() {
printf("10th fibonacci number is %d!", fibonacci(10)); printf("10th fibonacci number is %d!", fibonacci(10));
char res = 0; char res = 0;
char* test = &res; char* test = &res;
*test = 15; (*test) = 15;
return res; return res;
} }