123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713 |
- //This is only for testing the parser, it is not intended to be runable in a real
- //program but for checking the contructs to be parsed well.
- //All statements are written like testparser would print them out to diff the
- //result with this file again to show differences.
- //Based on /utils/fpdoc/testunit.pp
- {$mode objfpc}
- {$h+}
- unit testunit1;
- interface
- uses
- SysUtils,Classes;
- const
- AnIntegerConst=1;
- AStringConst='Hello, World!';
- AFLoatconst=1.23;
- ABooleanConst=True;
- ATypedConst: Integer=3;
- AnArrayConst: Array[1..3] of Integer=(1,2,3);
- ARecordConst: TMethod=(Code:nil;Data:nil);
- ASetConst=[true,false];
- ADeprecatedConst=1 deprecated;
-
- Type
- TAnEnumType=(one,two,three);
- TASetType=set of TAnEnumType;
- TAnArrayType=Array[1..10] of Integer;
- TASubRangeType=one..two;
- TABooleanArrayType=Array[Boolean] of Integer;
- TARecordType=record
- X,Y: Integer;
- Z: String;
- end;
- TAVariantRecordType=record
- A: String;
- Case Integer of
- 1: (X,Y : Integer);
- 2: (phi,Omega : Real);
- end;
- TAVariantRecordType2=record
- A: String;
- Case Atype : Integer of
- 1 : (X,Y : Integer);
- 2 : (phi,Omega : Real);
- end;
-
- MyRec = Record
- X : Longint;
- Case byte of
- 2 : (Y : Longint;
- case byte of
- 3 : (Z : Longint);
- );
- end;
-
- // TADeprecatedType = Integer deprecated;
- { TMyParentClass }
- TMyParentClass=Class(TComponent)
- Private
- FI: Integer;
- Function GetA(AIndex: Integer): String;
- Function GetIP(AIndex: integer): String;
- procedure SetA(AIndex: Integer; const AValue: String);
- procedure SetIP(AIndex: integer; const AValue: String);
- Procedure WriteI(AI: Integer);
- Function ReadI: Integer;
- Protected
- Procedure AProtectedMethod;
- Property AProtectedProp: Integer Read FI Write FI;
- Public
- Constructor Create(AOwner: TComponent); override;
- Destructor Destroy; override;
- Procedure AVirtualProc; virtual;
- Procedure AnAbstractProc; virtual; abstract;
- Procedure AMessageProc(var Msg);message 123;
- Procedure AStringMessageProc(var Msg);message '123';
- Procedure ADeprecatedProc; deprecated;
- Procedure APlatformProc; Platform;
- Property IntProp: Integer Read FI Write Fi;
- Property IntROProp: Integer Read FI;
- Property GetIntProp: Integer Read ReadI Write WriteI;
- Property AnArrayProp[AIndex: Integer]: String Read GetA Write SetA;
- Property AnIndexProp: String Index 1 Read GetIP Write SetIP;
- Property AnIndexProp2: String Index 2 Read GetIP Write SetIP;
- Published
- Procedure SomePublishedMethod;
- end;
-
- { TMyChildClass }
- TMyChildClass=Class(TMyParentClass)
- Public
- Procedure AVirtualProc; Override;
- Procedure AnAbstractProc; Override;
- Published
- Property AProtectedProp;
- end;
-
- TPasFunctionType=Class(TPasProcedureType)
- public
- destructor Destroy; override;
- Class Function TypeName: string; override;
- Function ElementTypeName: string; override;
- Function GetDeclaration(Full: boolean): string; override;
- public
- ResultEl: TPasResultElement;
- end;
-
- var
- ASimpleVar: Integer;
- ATypedVar: TMethod;
- ARecordVar: Record
- A,B: Integer;
- end;
- AnArrayVar: Array[1..10] of Integer;
- ATypedArray: Array[TanEnumType] of Integer;
- AInitVar: Integer=1;
-
- ADeprecatedVar: Integer deprecated;
- ACVarVar: Integer ; cvar;
- AnExternalVar: Integer ;external name 'avar';
- AnExternalLibVar: Integer ;external 'library' name 'avar';
-
- Procedure SimpleProc;
- Procedure OverloadedProc(A: Integer);
- Procedure OverloadedProc(B: String);
- Function SimpleFunc: Integer;
- Function OverloadedFunc(A: Integer): Integer;
- Function OverloadedFunc(B: String): Integer;
- Procedure ConstArgProc(const A: Integer);
- Procedure VarArgProc(var A: Integer);
- Procedure OutArgProc(out A: Integer);
- Procedure UntypedVarArgProc(var A);
- Procedure UntypedConstArgProc(const A);
- Procedure UntypedOutArgProc(out A);
- Procedure ArrayArgProc(A: TAnArrayType);
- Procedure OpenArrayArgProc(A: Array of string);
- Procedure ConstArrayArgProc(A: Array of const);
- Procedure externalproc; external;
- Procedure externalnameProc; external name 'aname';
- Procedure externallibnameProc; external 'alibrary' name 'aname';
-
- Implementation
- Procedure SimpleProc;
- procedure SubProc;
- begin
- s:= s+'a';
- end;
- begin
- a:= 1;
- c:= a+b;
- for i:= 1 to 10 do
- write(a);
- end;
- Procedure OverloadedProc(A: Integer);
- begin
- if i=1 then ;
- end;
- Procedure OverloadedProc(B: String);
- begin
- end;
- Function SimpleFunc: Integer;
- begin
- end;
- Function OverloadedFunc(A: Integer): Integer;
- begin
- end;
- Function OverloadedFunc(B: String): Integer;
- begin
- end;
- Procedure ArrayArgProc(A: TAnArrayType);
- begin
- end;
- Procedure OpenArrayArgProc(A: Array of String);
- begin
- end;
- Procedure ConstArrayArgProc(A: Array of const);
- begin
- end;
- Procedure ConstArgProc(const A: Integer);
- begin
- end;
- Procedure VarArgProc(var A: Integer);
- begin
- end;
- Procedure OutArgProc(out A: Integer);
- begin
- end;
- Procedure UntypedVarArgProc(var A);
- begin
- end;
- Procedure UntypedConstArgProc(const A);
- begin
- end;
- Procedure UntypedOutArgProc(out A);
- begin
- end;
- { TMyChildClass }
- procedure TMyChildClass.AVirtualProc;
- begin
- inherited AVirtualProc;
- end;
- procedure TMyChildClass.AnAbstractProc;
- procedure SubCProc;
- begin
- sc:= sc+'ac';
- end;
- begin
- // Cannot call ancestor
- end;
- { TMyParentClass }
- procedure TMyParentClass.WriteI(AI: Integer);
- begin
- end;
- Function TMyParentClass.GetA(AIndex: Integer): String;
- begin
- end;
- Function TMyParentClass.GetIP(AIndex: integer): String;
- begin
- end;
- procedure TMyParentClass.SetA(AIndex: Integer; const AValue: String);
- begin
- end;
- procedure TMyParentClass.SetIP(AIndex: integer; const AValue: String);
- begin
- end;
- Function TMyParentClass.ReadI: Integer;
- begin
- end;
- procedure TMyParentClass.AProtectedMethod;
- begin
- end;
- constructor TMyParentClass.Create(AOwner: TComponent);
- begin
- inherited Create(AOwner);
- end;
- destructor TMyParentClass.Destroy;
- begin
- inherited Destroy;
- end;
- procedure TMyParentClass.AVirtualProc;
- begin
- end;
- procedure TMyParentClass.AMessageProc(var Msg);
- begin
- end;
- procedure TMyParentClass.AStringMessageProc(var Msg);
- begin
- end;
- procedure TMyParentClass.ADeprecatedProc;
- begin
- end;
- procedure TMyParentClass.APlatformProc;
- begin
- end;
- procedure TMyParentClass.SomePublishedMethod;
- begin
- end;
-
- Class Function TPasFunctionType.TypeName: String;
- begin
- Result:= 'Function';
- end;
- procedure Statements;
- const
- cint=1;
- cint1=-1;
- creal=3.1415;
- Addi=1+2;
- Subs=2-3;
- Muti=3*3;
- Divi=3/5;
- //Powe=2^3;
- Modu=5 mod 3;
- IDiv=5 div 3;
- fals= not TRUE;
- cand=true and false;
- cor=true or false;
- cxor=true xor false;
- lt=2<3;
- gt=3>2;
- let=2<=3;
- get=3>=2;
- LeftShift=2 shl 3;
- RightShift=2 shr 3;
- ConstString='01'+'ab';
- Type
- Passenger=Record
- Name: String[30];
- Flight: String[10];
- end;
- Type
- AR=record
- X,Y: LongInt;
- end;
- //PAR = Record;
- var
- TheCustomer: Passenger;
- L: ^LongInt;
- P: PPChar;
- S,T: Ar;
-
- begin
- X:= X+Y;
- //EparserError on C++ style
- //X+=Y; { Same as X := X+Y, needs -Sc command line switch}
- //x-=y;
- //X/=2; { Same as X := X/2, needs -Sc command line switch}
- //x*=y;
- Done:= False;
- Weather:= Good;
- //MyPi := 4* Tan(1); warum * ?
- L^:= 3;
- P^^:= 'A';
- Usage;
- WriteLn('Pascal is an easy language !');
- Doit();
- //label jumpto;
- //Jumpto :
- // Statement;
- //Goto jumpto;
- Case i of
- 3: DoSomething;
- 1..5: DoSomethingElse;
- end;
- Case C of
- 'a': WriteLn('A pressed');
- 'b': WriteLn('B pressed');
- 'c': WriteLn('C pressed');
- else
- WriteLn('unknown letter pressed : ',C);
- end;
- Case C of
- 'a','e','i','o','u': WriteLn('vowel pressed');
- 'y': WriteLn('This one depends on the language');
- else
- WriteLn('Consonant pressed');
- end;
- Case Number of
- 1..10: WriteLn('Small number');
- 11..100: WriteLn('Normal, medium number');
- else
- WriteLn('HUGE number');
- end;
- case block of
- 1: begin
- writeln('1');
- end;
- 2: writeln('2');
- else
- writeln('3');
- writeln('4');
- end;
- If exp1 Then
- If exp2 then
- Stat1
- else
- stat2;
- If exp3 Then
- begin
- If exp4 then
- Stat5
- else
- stat6
- end;
- If exp7 Then
- begin
- If exp8 then
- Stat9
- end
- else
- stat2;
- if i is integer then
- begin
- write('integer');
- end
- else
- if i is real then
- begin
- write('real');
- end
- else
- write('0');
- if Today in[Monday..Friday] then
- WriteLn('Must work harder')
- else
- WriteLn('Take a day off.');
- for Day:= Monday to Friday do
- Work;
- for I:= 100 downto 1 do
- WriteLn('Counting down : ',i);
- for I:= 1 to 7*dwarfs do
- KissDwarf(i);
- for i:= 0 to 10 do
- begin
- j:= 2+1;
- write(i,j);
- end;
- repeat
- WriteLn('I =',i);
- I:= I+2;
- until I>100;
-
- repeat
- X:= X/2;
- until x<10e-3;
- I:= I+2;
- while i<=100 do
- begin
- WriteLn('I =',i);
- I:= I+2;
- end;
- X:= X/2;
- while x>=10e-3 do
- dec(x);
- while x>0 do
- while y>0 do
- begin
- dec(x);
- dec(y);
- end;
- while x>0 do
- if x>2 then
- dec(x)
- else
- dec(x,2);
- X:= 2+3;
- TheCustomer.Name:= 'Michael';
- TheCustomer.Flight:= 'PS901';
- With TheCustomer do
- begin
- Name:= 'Michael';
- Flight:= 'PS901';
- end;
- With A,B,C,D do
- Statement;
- With A do
- With B do
- With C do
- With D do
- Statement;
- S.X:= 1;S.Y:= 1;
- T.X:= 2;T.Y:= 2;
- With S,T do
- WriteLn(X,' ',Y);
- {asm
- Movl $1,%ebx
- Movl $0,%eax
- addl %eax,%ebx
- end; ['EAX','EBX'];}
- try
- try
- M:= ParseSource(E,cmdl,'linux','i386');
- except
- on excep: EParserError do
- begin
- writeln(excep.message,' line:',excep.row,' column:',excep.column,' file:',excep.filename);
- raise ;
- end;
- end;
- Decls:= M.InterfaceSection.Declarations;
- for I:= 0 to Decls.Count-1 do
- Writeln('Interface item ',I,': ');
- FreeAndNil(M);
- finally
- FreeAndNil(E)
- end;
-
- raise EParserError.Create(Format(SParserErrorAtToken, [Msg, CurTokenName]) {$ifdef addlocation}+' ('+inttostr(scanner.currow)+' '+inttostr(scanner.curcolumn)+')'{$endif},Scanner.CurFilename, Scanner.CurRow, Scanner.CurColumn);
-
- // try else
- end;
- procedure Expression;
- begin
- A:= a+b *c /(-e+f)*3 div 2 + 4 mod 5 - 2 shl 3 + 3 shr 1 ;
- b:= (a and not b) or c xor d;
- u:= i<=2 or a<>b or j>=3;
- u:= i=1 or a>b or b<a or i<>2;
- u:= i in [1..2];
- If F=@AddOne Then
- WriteLn('Functions are equal');
- If F()=Addone then
- WriteLn('Functions return same values ');
- z:= [today,tomorrow];
- z:= [Monday..Friday,Sunday];
- z:= [2,3*2,6*2,9*2];
- z:= ['A'..'Z','a'..'z','0'..'9'];
- x:= Byte('A');
- x:= Char(48);
- x:= boolean(1);
- x:= longint(@Buffer);
- x:= Integer('A');
- x:= Char(4875);
- x:= Word(@Buffer);
- B:= Byte(C);
- Char(B):= C;
- TWordRec(W).L:= $FF;
- TWordRec(W).H:= 0;
- S:= TObject(P).ClassName;
- P:= @MyProc; //warum @ ? fix pparser 769 ?
- Dirname:= Dirname+'\';
- W:= [mon,tue]+[wed,thu,fri]; // equals [mon,tue,wed,thu,fri]
- W:= [mon,tue,wed]-[wed]; // equals [mon,tue]
- W:= [mon,tue,wed]*[wed,thu,fri]; // equals [wed] warum * ?
- (C as TEdit).Text:= 'Some text';
- C:= O as TComponent;
- if A is TComponent then ;
- If A is B then ;
- Inherited ;
- Inherited Test;
- if true then
- Inherited
- else
- DoNothing;
- if true then
- Inherited Test
- else
- DoNothing;
- Inherited P:= 3;
- Inherited SetP1(3);
- Result:= Char(P and $FF);
- Result:= Char((Inherited P) and $FF);
- Inherited P:= Ord(AValue);
- Result:= Inherited InterPretOption(Cmd,Arg);
- raise Exception.Create(SErrMultipleSourceFiles);
- if Filename<>'' then
- raise Exception.Create(SErrMultipleSourceFiles);
- if Filename<>'' then
- raise Exception.Create(SErrMultipleSourceFiles)
- else
- Filename:= s;
- Self.Write(EscapeText(AText));
- TObject.Create(Self);
- end;
- constructor TPasPackage.Create(const AName: String; AParent: TPasElement);
- begin
- if (Length(AName)>0)and(AName[1]<>'#') then
- Inherited Create('#'+AName,AParent)
- else
- Inherited Create(AName,AParent);
- Modules:= TList.Create;
- end;
- Function TPascalScanner.FetchToken: TToken;
- var
- IncludeStackItem: TIncludeStackItem;
- begin
- while true do
- begin
- Result:= DoFetchToken;
- if FCurToken=tkEOF then
- if FIncludeStack.Count>0 then
- begin
- CurSourceFile.Free;
- IncludeStackItem:= TIncludeStackItem(FIncludeStack[FIncludeStack.Count-1]);
- FIncludeStack.Delete(FIncludeStack.Count-1);
- FCurSourceFile:= IncludeStackItem.SourceFile;
- FCurFilename:= IncludeStackItem.Filename;
- FCurToken:= IncludeStackItem.Token;
- FCurTokenString:= IncludeStackItem.TokenString;
- FCurLine:= IncludeStackItem.Line;
- FCurRow:= IncludeStackItem.Row;
- TokenStr:= IncludeStackItem.TokenStr;
- IncludeStackItem.Free;
- Result:= FCurToken;
- end
- else
- break
- else
- if not PPIsSkipping then
- break;
- end;
- end;
- Procedure IFS;
- begin
- if true then
- repeat
- until false
- else
- Noting;
- end;
- Procedure IFS(x: integer); overload;
- begin
- if true then
- case x of
- 1: writeln;
- 2: write;
- else
- writeln('#');
- end
- else
- Noting;
- end;
- Procedure IFS1;
- begin
- if true then
- while true do
- Something
- else
- Noting;
- end;
- Procedure IFS3;
- begin
- if true then
- if true then
- write
- else
- writeln;
- end;
- Initialization
-
- hallo:= valid;
- end.
|