mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-13 10:29:17 +02:00
fcl-passrc: parser: check semicolon after if then
git-svn-id: trunk@38061 -
This commit is contained in:
parent
9240e0c2e6
commit
517e2e3218
@ -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;
|
||||
|
@ -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<v2 then v3:=v1 else v3:=v2;');
|
||||
Add([
|
||||
'var',
|
||||
' v1,v2,v3:longint;',
|
||||
'begin',
|
||||
' v1:=1;',
|
||||
' v2:=v1+v1*v1+v1 div v1;',
|
||||
' v3:=-v1;',
|
||||
' repeat',
|
||||
' v1:=v1+1;',
|
||||
' until v1>=5;',
|
||||
' while v1>=0 do',
|
||||
' v1:=v1-v2;',
|
||||
' for v1:=v2 to v3 do v2:=v1;',
|
||||
' if v1<v2 then v3:=v1 else v3:=v2;',
|
||||
'']);
|
||||
ParseProgram;
|
||||
AssertEquals('3 declarations',3,PasProgram.ProgramSection.Declarations.Count);
|
||||
end;
|
||||
@ -4450,6 +4453,18 @@ begin
|
||||
CheckResolverException('Boolean expected, but Longint found',nXExpectedButYFound);
|
||||
end;
|
||||
|
||||
procedure TTestResolver.TestIfAssignMissingSemicolonFail;
|
||||
begin
|
||||
StartProgram(false);
|
||||
Add([
|
||||
'var',
|
||||
' v:longint;',
|
||||
'begin',
|
||||
' if true then v:=1',
|
||||
' v:=2']);
|
||||
CheckParserException('Expected "Semicolon"',nParserExpectTokenError);
|
||||
end;
|
||||
|
||||
procedure TTestResolver.TestForLoopVarNonVarFail;
|
||||
begin
|
||||
StartProgram(false);
|
||||
|
Loading…
Reference in New Issue
Block a user