Parse expressions in parens (3 + 2) * 4

This commit is contained in:
2026-04-09 10:38:58 +10:00
parent 1e3bd6c601
commit 70dc5eb5a0
2 changed files with 71 additions and 3 deletions

View File

@@ -1607,12 +1607,70 @@ static inline ResultType(Nothing, charptr) parseInlineGround(SolsParser* parser)
}
static inline ResultType(Nothing, charptr) parseOpenParen(SolsParser* parser) {
return Error(Nothing, charptr, "WIP");
size_t parenCount = 1;
size_t curlyCount = 0;
SolsTokens tokens = ({
ResultType(SolsTokens, charptr) _result = createSolsTokens();
if (_result.error) {
return Error(Nothing, charptr, _result.as.error);
}
_result.as.success;
});
// Collect tokens
for (;;) {
ResultType(SolsToken, Nothing) token = parserConsume(parser);
if (token.error) {
return Error(Nothing, charptr, "Expecting ')'");
}
bool done = false;
switch (token.as.success.type) {
case STT_OPEN_PAREN:
parenCount++;
break;
case STT_CLOSE_PAREN:
parenCount--;
if (parenCount == 0) {
if (curlyCount == 0) {
done = true;
} else {
return Error(Nothing, charptr, "Expecting '}' before ')'");
}
}
break;
case STT_OPEN_CURLY:
curlyCount++;
break;
case STT_CLOSE_CURLY:
if (curlyCount == 0) {
return Error(Nothing, charptr, "Extra closing curly brace inside ()");
}
curlyCount--;
break;
default:
break;
}
if (done) break;
addTokenToSolsTokens(&tokens, token.as.success);
}
// Parse tokens
ResultType(SolsParser, charptr) newParser = createSolsParser(&tokens);
if (newParser.error) {
return Error(Nothing, charptr, newParser.as.error);
}
newParser.as.success.currentParent = &newParser.as.success.output;
ResultType(Nothing, charptr) parsed = parse(&newParser.as.success);
if (parsed.error) {
addToParserErrors(parser, parsed.as.error);
}
// Add node to parent
newParser.as.success.output.type = SNT_EXPR_IN_PAREN;
addChildToSolsNode(parser->currentParent, newParser.as.success.output);
return Success(Nothing, charptr, {});
}
static inline ResultType(Nothing, charptr) parseCloseParen(SolsParser* parser) {
(void)parser;
return Error(Nothing, charptr, "Extra closing parenthases");
return Error(Nothing, charptr, "Extra closing parentheses");
}
ResultType(Nothing, charptr) parse(SolsParser* parser) {