Parcourir la source

fcl-passrc: parse goto statement

mattias il y a 3 ans
Parent
commit
14d589955a

+ 7 - 0
packages/fcl-passrc/src/pastree.pp

@@ -1689,6 +1689,13 @@ type
     LabelId: String;
   end;
 
+  { TPasImplGoto }
+
+  TPasImplGoto = class(TPasImplStatement)
+  public
+    LabelName: string;
+  end;
+
   { TPassTreeVisitor }
 
   TPassTreeVisitor = class

+ 8 - 0
packages/fcl-passrc/src/paswrite.pp

@@ -130,6 +130,7 @@ type
     procedure WriteImplRepeatUntil(aRepeatUntil : TPasImplRepeatUntil); virtual;
     procedure WriteImplTryFinallyExcept(aTry: TPasImplTry); virtual;
     Procedure WriteImplRaise(aRaise : TPasImplRaise); virtual;
+    Procedure WriteImplGoto(aGoto : TPasImplGoto); virtual;
     Procedure WriteImplAssign(aAssign : TPasImplAssign); virtual;
     Procedure WriteImplSimple(aSimple: TPasImplSimple); virtual;
     Procedure WriteImplExceptOn(aOn : TPasImplExceptOn); virtual;
@@ -1220,6 +1221,8 @@ begin
     WriteImplTryFinallyExcept(TPasImplTry(aElement))
   else if AElement.InheritsFrom(TPasImplRaise) then
     WriteImplRaise(TPasImplRaise(aElement))
+  else if AElement.InheritsFrom(TPasImplGoto) then
+    WriteImplGoto(TPasImplGoto(aElement))
   else if AElement.InheritsFrom(TPasImplAssign) then
     WriteImplAssign(TPasImplAssign(aElement))
   else if AElement.InheritsFrom(TPasImplSimple) then
@@ -1428,6 +1431,11 @@ begin
   Addln(';');
 end;
 
+procedure TPasWriter.WriteImplGoto(aGoto: TPasImplGoto);
+begin
+  Addln('goto '+aGoto.LabelName+';');
+end;
+
 procedure TPasWriter.WriteImplAssign(aAssign: TPasImplAssign);
 
 begin

+ 6 - 4
packages/fcl-passrc/src/pparser.pp

@@ -6194,6 +6194,7 @@ begin
               or (CurBlock is TPasImplForLoop)
               or (CurBlock is TPasImplWithDo)
               or (CurBlock is TPasImplRaise)
+              or (CurBlock is TPasImplGoto)
               or (CurBlock is TPasImplExceptOn) then
             // simply close block
           else
@@ -6220,9 +6221,10 @@ begin
       tkgoto:
         begin
         CheckStatementCanStart;
-        NextToken;
-        CurBlock.AddCommand('goto '+curtokenstring);
-        // expecttoken(tkSemiColon);
+        SrcPos:=CurTokenPos;
+        ExpectTokens([tkIdentifier,tkNumber]);
+        El:=TPasImplGoto(CreateElement(TPasImplGoto,'',CurBlock,SrcPos));
+        TPasImplGoto(El).LabelName:=CurTokenString;
         end;
       tkfor:
         begin
@@ -6623,7 +6625,7 @@ var
 begin
   Labels:=TPasLabels(CreateElement(TPasLabels, '', AParent));
   repeat
-    expectTokens([tkIdentifier,tkNumber]);
+    ExpectTokens([tkIdentifier,tkNumber]);
     Labels.Labels.Add(CurTokenString);
     NextToken;
     if not (CurToken in [tkSemicolon, tkComma]) then