From 9b9a3ec725be090397cc13f9930976458fab1ccc Mon Sep 17 00:00:00 2001 From: dmitry Date: Wed, 25 Aug 2010 13:55:24 +0000 Subject: [PATCH] passrc: added parsing label marks in the code blocks git-svn-id: trunk@15903 - --- packages/fcl-passrc/src/pastree.pp | 14 +++++++++++ packages/fcl-passrc/src/pparser.pp | 40 +++++++++++++++++++++++++----- 2 files changed, 48 insertions(+), 6 deletions(-) diff --git a/packages/fcl-passrc/src/pastree.pp b/packages/fcl-passrc/src/pastree.pp index f02542a5f8..b56c569b43 100644 --- a/packages/fcl-passrc/src/pastree.pp +++ b/packages/fcl-passrc/src/pastree.pp @@ -759,6 +759,7 @@ type TPasImplTry = class; TPasImplExceptOn = class; TPasImplRaise = class; + TPasImplLabelMark = class; { TPasImplBlock } @@ -782,6 +783,7 @@ type function AddTry: TPasImplTry; function AddExceptOn(const VarName, TypeName: string): TPasImplExceptOn; function AddRaise: TPasImplRaise; + function AddLabelMark(const Id: string): TPasImplLabelMark; function CloseOnSemicolon: boolean; virtual; public Elements: TList; // TPasImplElement objects @@ -958,6 +960,11 @@ type procedure Visit(obj: TPasElement); virtual; end; + TPasImplLabelMark = class(TPasImplElement) + public + LabelId: AnsiString; + end; + const AccessNames: array[TArgumentAccess] of string[6] = ('', 'const ', 'var ', 'out '); AllVisibilities: TPasMemberVisibilities = @@ -1681,6 +1688,13 @@ begin AddElement(Result); end; +function TPasImplBlock.AddLabelMark(const Id: string): TPasImplLabelMark; +begin + Result:=TPasIMplLabelMark.Create('', Self); + Result.LabelId:=Id; + AddElement(Result); +end; + function TPasImplBlock.CloseOnSemicolon: boolean; begin Result:=false; diff --git a/packages/fcl-passrc/src/pparser.pp b/packages/fcl-passrc/src/pparser.pp index fd9e11f267..85148f130e 100644 --- a/packages/fcl-passrc/src/pparser.pp +++ b/packages/fcl-passrc/src/pparser.pp @@ -2912,13 +2912,41 @@ begin end; else UngetToken; - Command:=ParseCommand; - //WriteLn(i,'COMMAND="',Command,'" Token=',CurTokenString); + + Command:=''; + + NextToken; + // testing for label mark + if CurToken=tkIdentifier then + begin + Command:=CurTokenText; + NextToken; + // testing for the goto mark + if CurToken=tkColon then + begin + CurBlock.AddLabelMark(Command); + end + else + begin + Command:=''; + UngetToken; + UngetToken; + end; + end else + UngetToken; + + if Command='' then - ParseExc(SParserSyntaxError); - CmdElem:=CurBlock.AddCommand(Command); - if NewImplElement=nil then NewImplElement:=CmdElem; - if CloseStatement(false) then break; + begin + // parsing the assignment statement or call expression + Command:=ParseCommand; + //WriteLn(i,'COMMAND="',Command,'" Token=',CurTokenString); + if Command='' then + ParseExc(SParserSyntaxError); + CmdElem:=CurBlock.AddCommand(Command); + if NewImplElement=nil then NewImplElement:=CmdElem; + if CloseStatement(false) then break; + end; end; end; end;