forked from solstice/solstice
Parse expressions in parens (3 + 2) * 4
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user