From da57cd3059e54e2812b5058e77762cc73adaeaf1 Mon Sep 17 00:00:00 2001 From: Duncan Ogilvie Date: Sat, 25 Jan 2025 03:08:32 +0100 Subject: [PATCH] Skip function body --- btparser/typesparser.cpp | 41 +++++++++++++++++++++++++++++++++++----- 1 file changed, 36 insertions(+), 5 deletions(-) diff --git a/btparser/typesparser.cpp b/btparser/typesparser.cpp index fa8ee63..ce9e48e 100644 --- a/btparser/typesparser.cpp +++ b/btparser/typesparser.cpp @@ -541,9 +541,10 @@ struct Parser } kind = Lexer::tok_eof; + // TODO: eat nested {} as well? if (!isToken(Lexer::tok_semic)) { - errLine(curToken(), "expected ; after function type"); + errLine(curToken(), "expected ; after member function type"); return false; } eatSemic(); @@ -950,7 +951,7 @@ struct Parser if (!isToken(Lexer::tok_semic)) { - errLine(curToken(), "expected ; after function type"); + errLine(curToken(), "expected ; after function pointer typedef"); return false; } 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; } } @@ -1322,4 +1353,4 @@ bool Types::ParseModel(const std::string& code, const std::string& owner, std::v return false; model = std::move(p.model); return true; -} \ No newline at end of file +}