Browse Source

fcl-passrc: parser: use token start for statement position

git-svn-id: trunk@37239 -
Mattias Gaertner 8 years ago
parent
commit
8a9ddd8eb4
1 changed files with 27 additions and 21 deletions
  1. 27 21
      packages/fcl-passrc/src/pparser.pp

+ 27 - 21
packages/fcl-passrc/src/pparser.pp

@@ -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,8 +4841,9 @@ begin
       begin
       begin
         if TPasImplIfElse(CurBlock).IfBranch=nil then
         if TPasImplIfElse(CurBlock).IfBranch=nil then
         begin
         begin
-        El:=TPasImplCommand(CreateElement(TPasImplCommand,'', CurBlock));
-        CurBlock.AddElement(El);
+          // empty then statement  e.g. if condition then else
+          El:=TPasImplCommand(CreateElement(TPasImplCommand,'', CurBlock,Scanner.CurTokenPos));
+          CurBlock.AddElement(El);
         end;
         end;
         if TPasImplIfElse(CurBlock).ElseBranch<>nil then
         if TPasImplIfElse(CurBlock).ElseBranch<>nil then
         begin
         begin
@@ -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;