mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-14 16:49:07 +02:00
fcl-passrc: parser: use token start for statement position
git-svn-id: trunk@37239 -
This commit is contained in:
parent
eccb5422e0
commit
8a9ddd8eb4
@ -4803,7 +4803,7 @@ begin
|
|||||||
tkasm:
|
tkasm:
|
||||||
begin
|
begin
|
||||||
CheckSemicolon;
|
CheckSemicolon;
|
||||||
El:=TPasImplElement(CreateElement(TPasImplAsmStatement,'',CurBlock));
|
El:=TPasImplElement(CreateElement(TPasImplAsmStatement,'',CurBlock,Scanner.CurTokenPos));
|
||||||
ParseAsmBlock(TPasImplAsmStatement(El));
|
ParseAsmBlock(TPasImplAsmStatement(El));
|
||||||
CurBlock.AddElement(El);
|
CurBlock.AddElement(El);
|
||||||
if NewImplElement=nil then NewImplElement:=CurBlock;
|
if NewImplElement=nil then NewImplElement:=CurBlock;
|
||||||
@ -4813,13 +4813,13 @@ begin
|
|||||||
tkbegin:
|
tkbegin:
|
||||||
begin
|
begin
|
||||||
CheckSemicolon;
|
CheckSemicolon;
|
||||||
El:=TPasImplElement(CreateElement(TPasImplBeginBlock,'',CurBlock));
|
El:=TPasImplElement(CreateElement(TPasImplBeginBlock,'',CurBlock,Scanner.CurTokenPos));
|
||||||
CreateBlock(TPasImplBeginBlock(El));
|
CreateBlock(TPasImplBeginBlock(El));
|
||||||
end;
|
end;
|
||||||
tkrepeat:
|
tkrepeat:
|
||||||
begin
|
begin
|
||||||
CheckSemicolon;
|
CheckSemicolon;
|
||||||
El:=TPasImplRepeatUntil(CreateElement(TPasImplRepeatUntil,'',CurBlock));
|
El:=TPasImplRepeatUntil(CreateElement(TPasImplRepeatUntil,'',CurBlock,Scanner.CurTokenPos));
|
||||||
CreateBlock(TPasImplRepeatUntil(El));
|
CreateBlock(TPasImplRepeatUntil(El));
|
||||||
end;
|
end;
|
||||||
tkIf:
|
tkIf:
|
||||||
@ -4841,7 +4841,8 @@ begin
|
|||||||
begin
|
begin
|
||||||
if TPasImplIfElse(CurBlock).IfBranch=nil then
|
if TPasImplIfElse(CurBlock).IfBranch=nil then
|
||||||
begin
|
begin
|
||||||
El:=TPasImplCommand(CreateElement(TPasImplCommand,'', CurBlock));
|
// empty then statement e.g. if condition then else
|
||||||
|
El:=TPasImplCommand(CreateElement(TPasImplCommand,'', CurBlock,Scanner.CurTokenPos));
|
||||||
CurBlock.AddElement(El);
|
CurBlock.AddElement(El);
|
||||||
end;
|
end;
|
||||||
if TPasImplIfElse(CurBlock).ElseBranch<>nil then
|
if TPasImplIfElse(CurBlock).ElseBranch<>nil then
|
||||||
@ -4888,7 +4889,7 @@ begin
|
|||||||
end else if (CurBlock is TPasImplTryExcept) then
|
end else if (CurBlock is TPasImplTryExcept) then
|
||||||
begin
|
begin
|
||||||
CloseBlock;
|
CloseBlock;
|
||||||
El:=TPasImplTryExceptElse(CreateElement(TPasImplTryExceptElse,'',CurBlock));
|
El:=TPasImplTryExceptElse(CreateElement(TPasImplTryExceptElse,'',CurBlock,Scanner.CurTokenPos));
|
||||||
TPasImplTry(CurBlock).ElseBranch:=TPasImplTryExceptElse(El);
|
TPasImplTry(CurBlock).ElseBranch:=TPasImplTryExceptElse(El);
|
||||||
CurBlock:=TPasImplTryExceptElse(El);
|
CurBlock:=TPasImplTryExceptElse(El);
|
||||||
end else
|
end else
|
||||||
@ -4897,11 +4898,12 @@ begin
|
|||||||
begin
|
begin
|
||||||
// while Condition do
|
// while Condition do
|
||||||
CheckSemicolon;
|
CheckSemicolon;
|
||||||
|
SrcPos:=Scanner.CurTokenPos;
|
||||||
NextToken;
|
NextToken;
|
||||||
left:=DoParseExpression(CurBlock);
|
left:=DoParseExpression(CurBlock);
|
||||||
UngetToken;
|
UngetToken;
|
||||||
//WriteLn(i,'WHILE Condition="',Condition,'" Token=',CurTokenText);
|
//WriteLn(i,'WHILE Condition="',Condition,'" Token=',CurTokenText);
|
||||||
El:=TPasImplWhileDo(CreateElement(TPasImplWhileDo,'',CurBlock));
|
El:=TPasImplWhileDo(CreateElement(TPasImplWhileDo,'',CurBlock,SrcPos));
|
||||||
TPasImplWhileDo(El).ConditionExpr:=left;
|
TPasImplWhileDo(El).ConditionExpr:=left;
|
||||||
CreateBlock(TPasImplWhileDo(El));
|
CreateBlock(TPasImplWhileDo(El));
|
||||||
ExpectToken(tkdo);
|
ExpectToken(tkdo);
|
||||||
@ -4918,7 +4920,7 @@ begin
|
|||||||
// for VarName := StartValue to EndValue do
|
// for VarName := StartValue to EndValue do
|
||||||
// for VarName in Expression do
|
// for VarName in Expression do
|
||||||
CheckSemicolon;
|
CheckSemicolon;
|
||||||
El:=TPasImplForLoop(CreateElement(TPasImplForLoop,'',CurBlock));
|
El:=TPasImplForLoop(CreateElement(TPasImplForLoop,'',CurBlock,Scanner.CurTokenPos));
|
||||||
ok:=false;
|
ok:=false;
|
||||||
Try
|
Try
|
||||||
ExpectIdentifier;
|
ExpectIdentifier;
|
||||||
@ -4975,7 +4977,7 @@ begin
|
|||||||
// with Expr do
|
// with Expr do
|
||||||
// with Expr, Expr do
|
// with Expr, Expr do
|
||||||
CheckSemicolon;
|
CheckSemicolon;
|
||||||
SrcPos:=CurSourcePos;
|
SrcPos:=Scanner.CurTokenPos;
|
||||||
NextToken;
|
NextToken;
|
||||||
Left:=DoParseExpression(CurBlock);
|
Left:=DoParseExpression(CurBlock);
|
||||||
//writeln(i,'WITH Expr="',Expr,'" Token=',CurTokenText);
|
//writeln(i,'WITH Expr="',Expr,'" Token=',CurTokenText);
|
||||||
@ -4996,12 +4998,13 @@ begin
|
|||||||
tkcase:
|
tkcase:
|
||||||
begin
|
begin
|
||||||
CheckSemicolon;
|
CheckSemicolon;
|
||||||
|
SrcPos:=Scanner.CurTokenPos;
|
||||||
NextToken;
|
NextToken;
|
||||||
Left:=DoParseExpression(CurBlock);
|
Left:=DoParseExpression(CurBlock);
|
||||||
UngetToken;
|
UngetToken;
|
||||||
//writeln(i,'CASE OF Expr="',Expr,'" Token=',CurTokenText);
|
//writeln(i,'CASE OF Expr="',Expr,'" Token=',CurTokenText);
|
||||||
ExpectToken(tkof);
|
ExpectToken(tkof);
|
||||||
El:=TPasImplCaseOf(CreateElement(TPasImplCaseOf,'',CurBlock));
|
El:=TPasImplCaseOf(CreateElement(TPasImplCaseOf,'',CurBlock,SrcPos));
|
||||||
TPasImplCaseOf(El).CaseExpr:=Left;
|
TPasImplCaseOf(El).CaseExpr:=Left;
|
||||||
Left.Parent:=El;
|
Left.Parent:=El;
|
||||||
CreateBlock(TPasImplCaseOf(El));
|
CreateBlock(TPasImplCaseOf(El));
|
||||||
@ -5018,7 +5021,7 @@ begin
|
|||||||
tkelse:
|
tkelse:
|
||||||
begin
|
begin
|
||||||
// create case-else block
|
// create case-else block
|
||||||
El:=TPasImplCaseElse(CreateElement(TPasImplCaseElse,'',CurBlock));
|
El:=TPasImplCaseElse(CreateElement(TPasImplCaseElse,'',CurBlock,Scanner.CurTokenPos));
|
||||||
TPasImplCaseOf(CurBlock).ElseBranch:=TPasImplCaseElse(El);
|
TPasImplCaseOf(CurBlock).ElseBranch:=TPasImplCaseElse(El);
|
||||||
CreateBlock(TPasImplCaseElse(El));
|
CreateBlock(TPasImplCaseElse(El));
|
||||||
break;
|
break;
|
||||||
@ -5028,20 +5031,21 @@ begin
|
|||||||
if (curToken=tkIdentifier) and (LowerCase(CurtokenString)='otherwise') then
|
if (curToken=tkIdentifier) and (LowerCase(CurtokenString)='otherwise') then
|
||||||
begin
|
begin
|
||||||
// create case-else block
|
// create case-else block
|
||||||
El:=TPasImplCaseElse(CreateElement(TPasImplCaseElse,'',CurBlock));
|
El:=TPasImplCaseElse(CreateElement(TPasImplCaseElse,'',CurBlock,Scanner.CurTokenPos));
|
||||||
TPasImplCaseOf(CurBlock).ElseBranch:=TPasImplCaseElse(El);
|
TPasImplCaseOf(CurBlock).ElseBranch:=TPasImplCaseElse(El);
|
||||||
CreateBlock(TPasImplCaseElse(El));
|
CreateBlock(TPasImplCaseElse(El));
|
||||||
break;
|
break;
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
repeat
|
repeat
|
||||||
|
SrcPos:=Scanner.CurTokenPos;
|
||||||
Left:=DoParseExpression(CurBlock);
|
Left:=DoParseExpression(CurBlock);
|
||||||
//writeln(i,'CASE value="',Expr,'" Token=',CurTokenText);
|
//writeln(i,'CASE value="',Expr,'" Token=',CurTokenText);
|
||||||
if CurBlock is TPasImplCaseStatement then
|
if CurBlock is TPasImplCaseStatement then
|
||||||
TPasImplCaseStatement(CurBlock).Expressions.Add(Left)
|
TPasImplCaseStatement(CurBlock).Expressions.Add(Left)
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
El:=TPasImplCaseStatement(CreateElement(TPasImplCaseStatement,'',CurBlock));
|
El:=TPasImplCaseStatement(CreateElement(TPasImplCaseStatement,'',CurBlock,SrcPos));
|
||||||
TPasImplCaseStatement(El).AddExpression(Left);
|
TPasImplCaseStatement(El).AddExpression(Left);
|
||||||
CurBlock.AddElement(El);
|
CurBlock.AddElement(El);
|
||||||
CurBlock:=TPasImplCaseStatement(El);
|
CurBlock:=TPasImplCaseStatement(El);
|
||||||
@ -5074,7 +5078,7 @@ begin
|
|||||||
tktry:
|
tktry:
|
||||||
begin
|
begin
|
||||||
CheckSemicolon;
|
CheckSemicolon;
|
||||||
El:=TPasImplTry(CreateElement(TPasImplTry,'',CurBlock));
|
El:=TPasImplTry(CreateElement(TPasImplTry,'',CurBlock,Scanner.CurTokenPos));
|
||||||
CreateBlock(TPasImplTry(El));
|
CreateBlock(TPasImplTry(El));
|
||||||
end;
|
end;
|
||||||
tkfinally:
|
tkfinally:
|
||||||
@ -5086,7 +5090,7 @@ begin
|
|||||||
end;
|
end;
|
||||||
if CurBlock is TPasImplTry then
|
if CurBlock is TPasImplTry then
|
||||||
begin
|
begin
|
||||||
El:=TPasImplTryFinally(CreateElement(TPasImplTryFinally,'',CurBlock));
|
El:=TPasImplTryFinally(CreateElement(TPasImplTryFinally,'',CurBlock,Scanner.CurTokenPos));
|
||||||
TPasImplTry(CurBlock).FinallyExcept:=TPasImplTryFinally(El);
|
TPasImplTry(CurBlock).FinallyExcept:=TPasImplTryFinally(El);
|
||||||
CurBlock:=TPasImplTryFinally(El);
|
CurBlock:=TPasImplTryFinally(El);
|
||||||
end else
|
end else
|
||||||
@ -5102,7 +5106,7 @@ begin
|
|||||||
if CurBlock is TPasImplTry then
|
if CurBlock is TPasImplTry then
|
||||||
begin
|
begin
|
||||||
//writeln(i,'EXCEPT');
|
//writeln(i,'EXCEPT');
|
||||||
El:=TPasImplTryExcept(CreateElement(TPasImplTryExcept,'',CurBlock));
|
El:=TPasImplTryExcept(CreateElement(TPasImplTryExcept,'',CurBlock,Scanner.CurTokenPos));
|
||||||
TPasImplTry(CurBlock).FinallyExcept:=TPasImplTryExcept(El);
|
TPasImplTry(CurBlock).FinallyExcept:=TPasImplTryExcept(El);
|
||||||
CurBlock:=TPasImplTryExcept(El);
|
CurBlock:=TPasImplTryExcept(El);
|
||||||
end else
|
end else
|
||||||
@ -5111,7 +5115,7 @@ begin
|
|||||||
tkraise:
|
tkraise:
|
||||||
begin
|
begin
|
||||||
CheckSemicolon;
|
CheckSemicolon;
|
||||||
El:=TPasImplRaise(CreateElement(TPasImplRaise,'',CurBlock));
|
El:=TPasImplRaise(CreateElement(TPasImplRaise,'',CurBlock,Scanner.CurTokenPos));
|
||||||
CreateBlock(TPasImplRaise(El));
|
CreateBlock(TPasImplRaise(El));
|
||||||
NextToken;
|
NextToken;
|
||||||
If Curtoken in [tkElse,tkEnd,tkSemicolon] then
|
If Curtoken in [tkElse,tkEnd,tkSemicolon] then
|
||||||
@ -5195,8 +5199,9 @@ begin
|
|||||||
// on Exception do
|
// on Exception do
|
||||||
if CurBlock is TPasImplTryExcept then
|
if CurBlock is TPasImplTryExcept then
|
||||||
begin
|
begin
|
||||||
|
SrcPos:=Scanner.CurTokenPos;
|
||||||
ExpectIdentifier;
|
ExpectIdentifier;
|
||||||
El:=TPasImplExceptOn(CreateElement(TPasImplExceptOn,'',CurBlock));
|
El:=TPasImplExceptOn(CreateElement(TPasImplExceptOn,'',CurBlock,SrcPos));
|
||||||
SrcPos:=CurSourcePos;
|
SrcPos:=CurSourcePos;
|
||||||
Name:=CurTokenString;
|
Name:=CurTokenString;
|
||||||
NextToken;
|
NextToken;
|
||||||
@ -5226,6 +5231,7 @@ begin
|
|||||||
end
|
end
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
|
SrcPos:=Scanner.CurTokenPos;
|
||||||
left:=DoParseExpression(CurBlock);
|
left:=DoParseExpression(CurBlock);
|
||||||
case CurToken of
|
case CurToken of
|
||||||
tkAssign,
|
tkAssign,
|
||||||
@ -5238,7 +5244,7 @@ begin
|
|||||||
Ak:=TokenToAssignKind(CurToken);
|
Ak:=TokenToAssignKind(CurToken);
|
||||||
NextToken;
|
NextToken;
|
||||||
right:=DoParseExpression(CurBlock); // this may solve TPasImplWhileDo.AddElement BUG
|
right:=DoParseExpression(CurBlock); // this may solve TPasImplWhileDo.AddElement BUG
|
||||||
El:=TPasImplAssign(CreateElement(TPasImplAssign,'',CurBlock));
|
El:=TPasImplAssign(CreateElement(TPasImplAssign,'',CurBlock,SrcPos));
|
||||||
left.Parent:=El;
|
left.Parent:=El;
|
||||||
right.Parent:=El;
|
right.Parent:=El;
|
||||||
TPasImplAssign(El).left:=Left;
|
TPasImplAssign(El).left:=Left;
|
||||||
@ -5251,7 +5257,7 @@ begin
|
|||||||
if not (left is TPrimitiveExpr) then
|
if not (left is TPrimitiveExpr) then
|
||||||
ParseExcTokenError(TokenInfos[tkSemicolon]);
|
ParseExcTokenError(TokenInfos[tkSemicolon]);
|
||||||
// label mark. todo: check mark identifier in the list of labels
|
// label mark. todo: check mark identifier in the list of labels
|
||||||
El:=TPasImplLabelMark(CreateElement(TPasImplLabelMark,'', CurBlock));
|
El:=TPasImplLabelMark(CreateElement(TPasImplLabelMark,'', CurBlock,SrcPos));
|
||||||
TPasImplLabelMark(El).LabelId:=TPrimitiveExpr(left).Value;
|
TPasImplLabelMark(El).LabelId:=TPrimitiveExpr(left).Value;
|
||||||
CurBlock.AddElement(El);
|
CurBlock.AddElement(El);
|
||||||
CmdElem:=TPasImplLabelMark(El);
|
CmdElem:=TPasImplLabelMark(El);
|
||||||
@ -5259,7 +5265,7 @@ begin
|
|||||||
end;
|
end;
|
||||||
else
|
else
|
||||||
// simple statement (function call)
|
// simple statement (function call)
|
||||||
El:=TPasImplSimple(CreateElement(TPasImplSimple,'',CurBlock));
|
El:=TPasImplSimple(CreateElement(TPasImplSimple,'',CurBlock,SrcPos));
|
||||||
TPasImplSimple(El).expr:=Left;
|
TPasImplSimple(El).expr:=Left;
|
||||||
AddStatement(El);
|
AddStatement(El);
|
||||||
end;
|
end;
|
||||||
|
Loading…
Reference in New Issue
Block a user