fcl-passrc: parsestatements: simplified

This commit is contained in:
mattias 2023-05-14 15:34:58 +02:00
parent 1cdbefe851
commit 98f1fdda94

View File

@ -6098,13 +6098,14 @@ procedure TPasParser.ParseStatement(Parent: TPasImplBlock;
out NewImplElement: TPasImplElement);
var
CurBlock: TPasImplBlock;
PrevToken: TToken;
{$IFDEF VerbosePasParserWriteln}
function i: string;
var
c: TPasElement;
begin
Result:='ParseImplCompoundStatement ';
Result:='ParseStatement ';
c:=CurBlock;
while c<>nil do begin
Result:=Result+' ';
@ -6155,16 +6156,13 @@ var
end;
procedure CheckStatementCanStart;
var
t: TToken;
begin
if (CurBlock.Elements.Count=0) then
exit; // at start of block
t:=GetPrevToken;
if t in [tkSemicolon,tkColon,tkElse,tkotherwise] then
if PrevToken in [tkSemicolon,tkColon,tkElse,tkotherwise] then
exit;
{$IFDEF VerbosePasParserWriteln}
writeln('TPasParser.ParseStatement.CheckSemicolon Prev=',GetPrevToken,' Cur=',CurToken,' ',CurBlock.ClassName,' ',CurBlock.Elements.Count,' ',TObject(CurBlock.Elements[0]).ClassName);
writeln('TPasParser.ParseStatement.CheckSemicolon Prev=',PrevToken,' Cur=',CurToken,' ',CurBlock.ClassName,' ',CurBlock.Elements.Count,' ',TObject(CurBlock.Elements[0]).ClassName);
{$ENDIF VerbosePasParserWriteln}
// last statement not complete -> semicolon is missing
ParseExcTokenError('Semicolon');
@ -6201,6 +6199,7 @@ begin
CurBlock := Parent;
while True do
begin
PrevToken:=CurToken;
NextToken;
{$IFDEF VerbosePasParserWriteln}
WriteLn(' Token=',CurTokenText,' CurBlock=',CurBlock.ClassName);
@ -6212,7 +6211,6 @@ begin
El:=TPasImplElement(CreateElement(TPasImplAsmStatement,'',CurBlock,CurTokenPos));
ParseAsmBlock(TPasImplAsmStatement(El));
CurBlock.AddElement(El);
El:=nil;
if NewImplElement=nil then NewImplElement:=CurBlock;
if CloseStatement(False) then
break;
@ -6222,14 +6220,12 @@ begin
CheckStatementCanStart;
El:=TPasImplElement(CreateElement(TPasImplBeginBlock,'',CurBlock,CurTokenPos));
CreateBlock(TPasImplBeginBlock(El));
El:=nil;
end;
tkrepeat:
begin
CheckStatementCanStart;
El:=TPasImplRepeatUntil(CreateElement(TPasImplRepeatUntil,'',CurBlock,CurTokenPos));
CreateBlock(TPasImplRepeatUntil(El));
El:=nil;
end;
tkIf:
begin
@ -6241,10 +6237,8 @@ begin
El:=TPasImplIfElse(CreateElement(TPasImplIfElse,'',CurBlock,SrcPos));
TPasImplIfElse(El).ConditionExpr:=Left;
Left.Parent:=El;
Left:=nil;
//WriteLn(i,'IF Condition="',Condition,'" Token=',CurTokenText);
CreateBlock(TPasImplIfElse(El));
El:=nil;
ExpectToken(tkthen);
end;
tkelse,tkotherwise:
@ -6260,7 +6254,6 @@ begin
// empty THEN statement e.g. if condition then else
El:=TPasImplCommand(CreateElement(TPasImplCommand,'', CurBlock,CurTokenPos));
CurBlock.AddElement(El); // this sets TPasImplIfElse(CurBlock).IfBranch:=El
El:=nil;
end;
if (CurToken=tkelse) and (TPasImplIfElse(CurBlock).ElseBranch=nil) then
begin
@ -6271,7 +6264,6 @@ begin
// empty ELSE statement without semicolon e.g. if condition then [...] else else
El:=TPasImplCommand(CreateElement(TPasImplCommand,'', CurBlock,CurTokenPos));
CurBlock.AddElement(El); // this sets TPasImplIfElse(CurBlock).IfBranch:=El
El:=nil;
CloseBlock;
end;
UngetToken;
@ -6285,7 +6277,6 @@ begin
El:=TPasImplTryExceptElse(CreateElement(TPasImplTryExceptElse,'',CurBlock,CurTokenPos));
TPasImplTry(CurBlock).ElseBranch:=TPasImplTryExceptElse(El);
CurBlock:=TPasImplTryExceptElse(El);
El:=nil;
break;
end
else if (CurBlock is TPasImplCaseStatement) then
@ -6320,9 +6311,7 @@ begin
El:=TPasImplWhileDo(CreateElement(TPasImplWhileDo,'',CurBlock,SrcPos));
TPasImplWhileDo(El).ConditionExpr:=Left;
Left.Parent:=El;
Left:=nil;
CreateBlock(TPasImplWhileDo(El));
El:=nil;
ExpectToken(tkdo);
end;
tkgoto:
@ -6384,7 +6373,6 @@ begin
ParseExcTokenError(TokenInfos[tkDo]);
Engine.FinishScope(stForLoopHeader,El);
CreateBlock(TPasImplForLoop(El));
El:=nil;
//WriteLn(i,'FOR "',VarName,'" := ',StartValue,' to ',EndValue,' Token=',CurTokenText);
end;
tkwith:
@ -6401,7 +6389,6 @@ begin
Expr.Parent:=El;
Engine.BeginScope(stWithExpr,Expr);
CreateBlock(TPasImplWithDo(El));
El:=nil;
repeat
if CurToken=tkdo then break;
if CurToken<>tkComma then
@ -6425,9 +6412,7 @@ begin
El:=TPasImplCaseOf(CreateElement(TPasImplCaseOf,'',CurBlock,SrcPos));
TPasImplCaseOf(El).CaseExpr:=Left;
Left.Parent:=El;
Left:=nil;
CreateBlock(TPasImplCaseOf(El));
El:=nil;
repeat
NextToken;
//writeln(i,'CASE OF Token=',CurTokenText);
@ -6497,7 +6482,6 @@ begin
CheckStatementCanStart;
El:=TPasImplTry(CreateElement(TPasImplTry,'',CurBlock,CurTokenPos));
CreateBlock(TPasImplTry(El));
El:=nil;
end;
tkfinally:
begin
@ -6528,7 +6512,6 @@ begin
El:=TPasImplTryExcept(CreateElement(TPasImplTryExcept,'',CurBlock,CurTokenPos));
TPasImplTry(CurBlock).FinallyExcept:=TPasImplTryExcept(El);
CurBlock:=TPasImplTryExcept(El);
El:=nil;
end else
ParseExcSyntaxError;
end;
@ -6604,7 +6587,6 @@ begin
Left:=DoParseExpression(CurBlock);
UngetToken;
TPasImplRepeatUntil(CurBlock).ConditionExpr:=Left;
Left:=nil;
//WriteLn(i,'UNTIL Condition="',Condition,'" Token=',CurTokenString);
if CloseBlock then break;
end else
@ -6661,7 +6643,6 @@ begin
end;
Engine.FinishScope(stExceptOnExpr,ImplExceptOn);
CreateBlock(ImplExceptOn);
El:=nil;
ExpectToken(tkDo);
end else
ParseExcSyntaxError;
@ -6681,7 +6662,6 @@ begin
El:=TPasImplAssign(CreateElement(TPasImplAssign,'',CurBlock,SrcPos));
TPasImplAssign(El).Left:=Left;
Left.Parent:=El;
Left:=nil;
TPasImplAssign(El).Kind:=TokenToAssignKind(CurToken);
NextToken;
Right:=DoParseExpression(CurBlock);
@ -6689,7 +6669,6 @@ begin
Right.Parent:=El;
Right:=nil;
AddStatement(El);
El:=nil;
end;
tkColon:
begin
@ -6700,23 +6679,19 @@ begin
// label mark. todo: check mark identifier in the list of labels
El:=TPasImplLabelMark(CreateElement(TPasImplLabelMark,'', CurBlock,SrcPos));
TPasImplLabelMark(El).LabelId:=TPrimitiveExpr(Left).Value;
Left:=nil;
CurBlock.AddElement(El);
CmdElem:=TPasImplLabelMark(El);
El:=nil;
end;
else
// simple statement (function call)
El:=TPasImplSimple(CreateElement(TPasImplSimple,'',CurBlock,SrcPos));
TPasImplSimple(El).Expr:=Left;
Left.Parent:=El;
Left:=nil;
AddStatement(El);
El:=nil;
end;
if not (CmdElem is TPasImplLabelMark) then
if NewImplElement=nil then NewImplElement:=CmdElem;
if (NewImplElement=nil) and not (CmdElem is TPasImplLabelMark) then
NewImplElement:=CmdElem;
end;
end;
else