From 517e2e3218dbe7f95ddaf9f46823b0e61b9d31fe Mon Sep 17 00:00:00 2001 From: Mattias Gaertner Date: Sat, 27 Jan 2018 16:25:57 +0000 Subject: [PATCH] fcl-passrc: parser: check semicolon after if then git-svn-id: trunk@38061 - --- packages/fcl-passrc/src/pparser.pp | 24 ++++++++------ packages/fcl-passrc/tests/tcresolver.pas | 41 ++++++++++++++++-------- 2 files changed, 42 insertions(+), 23 deletions(-) diff --git a/packages/fcl-passrc/src/pparser.pp b/packages/fcl-passrc/src/pparser.pp index 48457c5c51..5f1f24f5da 100644 --- a/packages/fcl-passrc/src/pparser.pp +++ b/packages/fcl-passrc/src/pparser.pp @@ -4956,15 +4956,19 @@ var end; procedure CheckSemicolon; + var + t: TToken; begin - if (CurBlock.Elements.Count>0) and not (GetPrevToken in [tkSemicolon,tkColon]) - and (CurBlock.ClassType<>TPasImplIfElse) then - begin - {$IFDEF VerbosePasParser} - writeln('TPasParser.ParseStatement.CheckSemicolon Prev=',GetPrevToken,' Cur=',CurToken,' ',CurBlock.ClassName,' ',CurBlock.Elements.Count,' ',TObject(CurBlock.Elements[0]).ClassName); - {$ENDIF} - ParseExcTokenError('Semicolon'); - end; + if (CurBlock.Elements.Count=0) then exit; + t:=GetPrevToken; + if t in [tkSemicolon,tkColon] then + exit; + if (CurBlock.ClassType=TPasImplIfElse) and (t=tkelse) then + exit; + {$IFDEF VerbosePasParser} + writeln('TPasParser.ParseStatement.CheckSemicolon Prev=',GetPrevToken,' Cur=',CurToken,' ',CurBlock.ClassName,' ',CurBlock.Elements.Count,' ',TObject(CurBlock.Elements[0]).ClassName); + {$ENDIF} + ParseExcTokenError('Semicolon'); end; var @@ -4994,7 +4998,7 @@ begin while True do begin NextToken; - // WriteLn({$IFDEF VerbosePasParser}i,{$ENDIF}' Token=',CurTokenText); + //WriteLn({$IFDEF VerbosePasParser}i,{$ENDIF}' Token=',CurTokenText); case CurToken of tkasm: begin @@ -5440,7 +5444,7 @@ begin // assign statement Ak:=TokenToAssignKind(CurToken); NextToken; - right:=DoParseExpression(CurBlock); // this may solve TPasImplWhileDo.AddElement BUG + right:=DoParseExpression(CurBlock); El:=TPasImplAssign(CreateElement(TPasImplAssign,'',CurBlock,SrcPos)); left.Parent:=El; right.Parent:=El; diff --git a/packages/fcl-passrc/tests/tcresolver.pas b/packages/fcl-passrc/tests/tcresolver.pas index eeed82e5c3..c090d735c9 100644 --- a/packages/fcl-passrc/tests/tcresolver.pas +++ b/packages/fcl-passrc/tests/tcresolver.pas @@ -317,6 +317,7 @@ type Procedure TestRepeatUntilNonBoolFail; Procedure TestWhileDoNonBoolFail; Procedure TestIfThenNonBoolFail; + Procedure TestIfAssignMissingSemicolonFail; Procedure TestForLoopVarNonVarFail; Procedure TestForLoopStartIncompFail; Procedure TestForLoopEndIncompFail; @@ -4227,19 +4228,21 @@ end; procedure TTestResolver.TestStatements; begin StartProgram(false); - Add('var'); - Add(' v1,v2,v3:longint;'); - Add('begin'); - Add(' v1:=1;'); - Add(' v2:=v1+v1*v1+v1 div v1;'); - Add(' v3:=-v1;'); - Add(' repeat'); - Add(' v1:=v1+1;'); - Add(' until v1>=5;'); - Add(' while v1>=0 do'); - Add(' v1:=v1-v2;'); - Add(' for v1:=v2 to v3 do v2:=v1;'); - Add(' if v1=5;', + ' while v1>=0 do', + ' v1:=v1-v2;', + ' for v1:=v2 to v3 do v2:=v1;', + ' if v1