Repository URL to install this package:
Version:
3.0.0 ▾
|
//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;
resourcestring
SParserErrorAtToken = 'parser error at token';
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;
ADeprecatedConst2 = 2 deprecated 'use another const';
Type
TLineEndStr = string [3];
TDeprecatedType = Integer deprecated;
TDeprecatedRecord = Record
x,Y : Integer;
end deprecated;
TDeprecatedFieldsRecord = Record
x,Y : Integer deprecated;
end;
TDeprecatedFieldsRecord2 = Record
x,Y : Integer deprecated
end;
TAnEnumType=(one,two,three);
arangetypealias = type 0..$FF;
TASetType=set of TAnEnumType;
TIntegerSet = Set of 0..SizeOf(Integer)*8-1;
TAnArrayType=Array[1..10] of Integer;
TASubRangeType=one..two;
TABooleanArrayType=Array[Boolean] of Integer;
TDay = (monday,tuesday,wednesday,thursday,friday,saturday,sunday);
TShortDay = (mon,tue,wed,thu,fri,sat,sun);
TShortDays = set of TShortDay;
TDays = set of TDay;
TMyInteger = Integer;
ADouble = type double;
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;
TYPE
PPoint = ^TPoint;
TPoint = OBJECT
X, Y: Sw_Integer;
END;
PRect = ^TRect;
TRect = OBJECT
A, B: TPoint; { Corner points }
FUNCTION Empty: Boolean;
FUNCTION Equals (R: TRect): Boolean;
FUNCTION Contains (P: TPoint): Boolean;
PROCEDURE Copy (R: TRect);
PROCEDURE Union (R: TRect);
PROCEDURE Intersect (R: TRect);
PROCEDURE Move (ADX, ADY: Sw_Integer);
PROCEDURE Grow (ADX, ADY: Sw_Integer);
PROCEDURE Assign (XA, YA, XB, YB: Sw_Integer);
END;
TNotifyEvent = Procedure (Sender : TObject) of object;
TNestedProcedure = Procedure (Sender : TObject) is nested;
TNotifyEvent2 = Function (Sender : TObject) : Integer of object;
// TADeprecatedType = Integer deprecated;
TMyChildClass = Class;
MyInterface = Interface;
{ 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;
TC = TMyChildClass;
TPasFunctionType=Class(TObject)
public
destructor Destroy; override;
Class Function TypeName: string;
Function ElementTypeName: string;
Function GetDeclaration(Full: boolean): string;
Procedure Something; strict
Private
Procedure SomethingElse;
public
ResultEl: TObject;
end;
TPropModifiers = Class(TObject)
Private
FB : Integer;
Function IsStored : Boolean;
Function GetI(AI : Integer) : Integer;
Procedure SetI(AI : Integer; AVal : Integer);
Published
Property A : Integer Read FB Write FB Stored False;
Property B : Integer Read FB Write FB Stored True;
Property C : Integer Read FB Write FB Stored IsStored;
Property D : Integer Read FB Write FB Default 1;
Property E : Integer Read FB Write FB Stored True Default 1;
Public
Property Ints[AI : Integer] : Integer Read GetI Write SetI; default;
end;
TPropModifiers2 = class(TPropModifiers)
Public
Property Ints[AI : Integer] : Integer Read GetI Write SetI; default; deprecated;
end;
TEdit = Class(TObject)
Text : String;
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;
AnExternalVar1: Integer; external;
AnExternalVar2: Integer; external name 'avar';
AnExternalLibVar: Integer; external 'library' name 'avar';
APublicVar : String; public;
APublicVar2 : String; public name 'ANAME';
APublicVar3 : String; export;
APublicVar4 : String; export name 'nono';
APublicVar5 : String; cvar; external;
APublicVar6 : String; external name 'me';
APublicVar7 : String deprecated; external name 'me';
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';
Function hi(q : QWord) : DWord; [INTERNPROC: fpc_in_hi_qword];
{$define extdecl:=cdecl}
Type
FontEnumProc = function (var ELogFont:TEnumLogFont; var Metric:TNewTextMetric;
FontType:longint; Data:LParam):longint; extdecl;
Type
generic TFPGListEnumerator<T> = class(TObject)
protected
FList: TFPList;
FPosition: Integer;
function GetCurrent: T;
end;
TFPGListEnumeratorSpec = specialize TFPGListEnumerator<TPasFunctionType>;
Implementation
Procedure SimpleProc;
procedure SubProc;
Var S : String;
begin
s:= s+'a';
end;
Var
a,B,c,i : integer;
begin
a:= 1;
c:= a+b;
for i:= 1 to 10 do
write(a);
end;
Procedure OverloadedProc(A: Integer);
Var
i : 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;
Var sc : string;
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;
Type
TI = Class(TComponent)
Public
FP : Integer;
Procedure SetP1(A : Integer); virtual;
Procedure M1;virtual;
Function F1 : Integer; virtual;
procedure test; virtual;
property P : Integer Read FP Write SetP1;
end;
Procedure TI.M1;
begin
end;
Procedure TI.Test;
begin
end;
Function TI.F1 : Integer;
begin
Result:=0;
end;
Procedure TI.SetP1(A : Integer);
begin
FP:=A;
end;
TYpe
TI2 = Class(TI)
procedure write(s : string);
Procedure SetP1(A : Integer); override;
Procedure M1;override;
Procedure Test;override;
Function F1 : integer; override;
procedure donothing;
property P : Integer Read F1 Write SetP1;
end;
Procedure TI2.M1;
begin
Inherited;
end;
Procedure TI2.Write(s : string);
begin
writeln(s);
end;
Function TI2.F1 :Integer;
begin
Result:=0;
end;
Procedure TI2.Test;
begin
if true then
Inherited Test
else
DoNothing;
Inherited test;
if true then
Inherited
else
DoNothing;
end;
Procedure TI2.DoNothing;
function escapetext(s : string) : string;
begin
end;
var
Atext : string;
begin
Self.Write(EscapeText(AText));
TComponent.Create(Self);
end;
Procedure TI2.SetP1(A : Integer);
begin
FP:=A;
Inherited P:= 3;
Inherited SetP1(3);
Inherited P:= Ord(A);
end;
procedure usage;
begin
end;
Procedure DoSomething;
begin
end;
Procedure DoSomethingElse;
begin
end;
procedure stat1;
begin
end;
procedure stat2;
begin
end;
procedure stat3;
begin
end;
procedure stat4;
begin
end;
procedure stat5;
begin
end;
procedure stat6;
begin
end;
procedure stat7;
begin
end;
procedure stat8;
begin
end;
procedure stat9;
begin
end;
procedure doit;
begin
end;
procedure statement;
begin
end;
procedure work;
begin
end;
procedure kissdwarf(i : integer);
begin
writeln('kiss dwarf',i);
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;
TScanner = record
currow,curcolumn : integer;
curfilename : string;
end;
//PAR = Record;
var
msg,curtokenname : string;
TheCustomer: Passenger;
L: ^LongInt;
P: PPChar;
S,T: Ar;
M, X,Y : Double;
Done : Boolean;
Weather,Good: Boolean;
c : char;
j,dwarfs,i,Number,Block : integer;
exp1,exp2,exp3,exp4,exp5,exp6,exp7,exp8,exp9 : boolean;
o : Tobject;
day,today : tday;
A,B,D : Passenger;
E : Exception;
scanner : tscanner;
begin
O:=Nil;
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
6: 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 o is TObject then
begin
write('object');
end
else
if o is TMyParentClass 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 i>=10e-3 do
dec(i);
while i>0 do
while j>0 do
begin
dec(i);
dec(j);
end;
while i>0 do
if i>2 then
dec(i)
else
dec(i,2);
X:= 2+3;
TheCustomer.Name:= 'Michael';
TheCustomer.Flight:= 'PS901';
With TheCustomer do
begin
Name:= 'Michael';
Flight:= 'PS901';
end;
With A,B,D do
Statement;
With A do
With B 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:= Y;
except
on excep: EParserError do
begin
writeln(excep.message,' : ',excep.classname);
raise ;
end;
end;
FreeAndNil(M);
finally
FreeAndNil(E)
end;
raise EParserError.Create(Format(SParserErrorAtToken, [Msg, CurTokenName]) {$ifdef addlocation}+' ('+inttostr(scanner.currow)+' '+inttostr(scanner.curcolumn)+')'{$endif});
// try else
end;
function addone : integer;
begin
end;
procedure myproc;
begin
end;
procedure Expression;
Var
A,b,c,d,e,f,i,j : Integer;
x : double;
u : Boolean;
fu : function : integer;
ad : boolean;
z : tdays;
today,tomorrow : tday;
bs : set of byte;
cs : set of char;
cc : char;
W : TShortDays;
buffer : array[1..10] of byte;
P : Pointer;
SErrMultipleSourceFiles,FileName,Dirname,S : string;
o,co : tobject;
begin
x:= 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 Fu=@AddOne Then
WriteLn('Functions are equal');
If Fu()=Addone then
WriteLn('Functions return same values ');
z:= [today,tomorrow];
z:= [Monday..Friday,Sunday];
bs:= [2,3*2,6*2,9*2];
cs:= ['A'..'Z','a'..'z','0'..'9'];
i:= Byte('A');
cc:= Char(48);
ad:= boolean(1);
i:= longint(@Buffer);
i:= Integer('A');
cc:= Char(225);
i:= Word(@Buffer);
B:= Byte(C);
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 * ?
(Co as TEdit).Text:= 'Some text';
Co:= O as TComponent;
if co is TComponent then ;
If co is TC then ;
raise Exception.Create(SErrMultipleSourceFiles);
if Filename<>'' then
raise Exception.Create(SErrMultipleSourceFiles);
if Filename<>'' then
raise Exception.Create(SErrMultipleSourceFiles)
else
Filename:= s;
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.