Skip function body

This commit is contained in:
Duncan Ogilvie 2025-01-25 03:08:32 +01:00
parent 4000f508e4
commit da57cd3059
1 changed files with 36 additions and 5 deletions

View File

@ -541,9 +541,10 @@ struct Parser
} }
kind = Lexer::tok_eof; kind = Lexer::tok_eof;
// TODO: eat nested {} as well?
if (!isToken(Lexer::tok_semic)) if (!isToken(Lexer::tok_semic))
{ {
errLine(curToken(), "expected ; after function type"); errLine(curToken(), "expected ; after member function type");
return false; return false;
} }
eatSemic(); eatSemic();
@ -950,7 +951,7 @@ struct Parser
if (!isToken(Lexer::tok_semic)) if (!isToken(Lexer::tok_semic))
{ {
errLine(curToken(), "expected ; after function type"); errLine(curToken(), "expected ; after function pointer typedef");
return false; return false;
} }
eatSemic(); eatSemic();
@ -1105,9 +1106,39 @@ struct Parser
} }
} }
} }
if (!isToken(Lexer::tok_semic))
if(isToken(Lexer::tok_bropen))
{ {
errLine(curToken(), "expected ; after function type"); index++;
int depth = 1;
while(true)
{
if(isToken(Lexer::tok_eof))
{
errLine(curToken(), "unexpected eof in function body");
return false;
}
if(isToken(Lexer::tok_bropen))
{
depth++;
}
else if(isToken(Lexer::tok_brclose))
{
depth--;
if(depth == 0)
{
index++;
break;
}
}
index++;
}
}
else if (!isToken(Lexer::tok_semic))
{
errLine(curToken(), "expected ; after top-level function type");
return false; return false;
} }
} }
@ -1322,4 +1353,4 @@ bool Types::ParseModel(const std::string& code, const std::string& owner, std::v
return false; return false;
model = std::move(p.model); model = std::move(p.model);
return true; return true;
} }