* Support operators

git-svn-id: trunk@194 -
This commit is contained in:
daniel 2005-06-04 16:14:28 +00:00
parent cd01ab8935
commit 3ece6aa385
2 changed files with 73 additions and 72 deletions

View File

@ -89,7 +89,7 @@ type
function GetDeclaration(full : Boolean) : string; virtual;
Visibility: TPasMemberVisibility;
property RefCount: LongWord read FRefCount;
property Name: string read FName;
property Name: string read FName write Fname;
property Parent: TPasElement read FParent;
end;

View File

@ -47,36 +47,36 @@ type
protected
FPackage: TPasPackage;
public
function CreateElement(AClass: TPTreeElement; const AName: String;
AParent: TPasElement; const ASourceFilename: String;
function CreateElement(AClass: TPTreeElement; const AName: string;
AParent: TPasElement; const ASourceFilename: string;
ASourceLinenumber: Integer): TPasElement;
function CreateElement(AClass: TPTreeElement; const AName: String;
function CreateElement(AClass: TPTreeElement; const AName: string;
AParent: TPasElement; AVisibility: TPasMemberVisibility;
const ASourceFilename: String; ASourceLinenumber: Integer): TPasElement;
const ASourceFilename: string; ASourceLinenumber: Integer): TPasElement;
virtual; abstract;
function CreateFunctionType(const AName: String; AParent: TPasElement;
UseParentAsResultParent: Boolean; const ASourceFilename: String;
function CreateFunctionType(const AName,resultname: string; AParent: TPasElement;
UseParentAsResultParent: Boolean; const ASourceFilename: string;
ASourceLinenumber: Integer): TPasFunctionType;
function FindElement(const AName: String): TPasElement; virtual; abstract;
function FindModule(const AName: String): TPasModule; virtual;
function FindElement(const AName: string): TPasElement; virtual; abstract;
function FindModule(const AName: string): TPasModule; virtual;
property Package: TPasPackage read FPackage;
end;
EParserError = class(Exception)
private
FFilename: String;
FFilename: string;
FRow, FColumn: Integer;
public
constructor Create(const AReason, AFilename: String;
constructor Create(const AReason, AFilename: string;
ARow, AColumn: Integer);
property Filename: String read FFilename;
property Filename: string read FFilename;
property Row: Integer read FRow;
property Column: Integer read FColumn;
end;
function ParseSource(AEngine: TPasTreeContainer;
const FPCCommandLine, OSTarget, CPUTarget: String): TPasModule;
const FPCCommandLine, OSTarget, CPUTarget: string): TPasModule;
implementation
@ -95,36 +95,36 @@ type
FScanner: TPascalScanner;
FEngine: TPasTreeContainer;
FCurToken: TToken;
FCurTokenString: String;
FCurTokenString: string;
// UngetToken support:
FTokenBuffer: array[0..1] of TToken;
FTokenStringBuffer: array[0..1] of String;
FTokenStringBuffer: array[0..1] of string;
FTokenBufferIndex, FTokenBufferSize: Integer;
procedure ParseExc(const Msg: String);
procedure ParseExc(const Msg: string);
protected
function CreateElement(AClass: TPTreeElement; const AName: String;
function CreateElement(AClass: TPTreeElement; const AName: string;
AParent: TPasElement): TPasElement;
function CreateElement(AClass: TPTreeElement; const AName: String;
function CreateElement(AClass: TPTreeElement; const AName: string;
AParent: TPasElement; AVisibility: TPasMemberVisibility): TPasElement;
public
constructor Create(AScanner: TPascalScanner; AFileResolver: TFileResolver;
AEngine: TPasTreeContainer);
function CurTokenName: String;
function CurTokenText: String;
function CurTokenName: string;
function CurTokenText: string;
procedure NextToken;
procedure UngetToken;
procedure ExpectToken(tk: TToken);
function ExpectIdentifier: String;
function ExpectIdentifier: string;
function ParseType(Parent: TPasElement; Prefix : String): TPasType;
function ParseType(Parent: TPasElement; Prefix : string): TPasType;
function ParseType(Parent: TPasElement): TPasType;
function ParseComplexType: TPasType;
procedure ParseArrayType(Element: TPasArrayType);
function ParseExpression: String;
function ParseExpression: string;
procedure AddProcOrFunction(ASection: TPasSection; AProc: TPasProcedure);
function CheckIfOverloaded(AOwner: TPasClassType;
const AName: String): TPasElement;
const AName: string): TPasElement;
procedure ParseMain(var Module: TPasModule);
procedure ParseUnit(var Module: TPasModule);
@ -142,7 +142,7 @@ type
function ParseProcedureOrFunctionDecl(Parent: TPasElement;
proctype:Tproctype): TPasProcedure;
procedure ParseRecordDecl(Parent: TPasRecordType);
function ParseClassDecl(Parent: TPasElement; const AClassName: String;
function ParseClassDecl(Parent: TPasElement; const AClassName: string;
AObjKind: TPasObjKind): TPasType;
procedure ParseProperty(Element:TPasElement);
@ -151,21 +151,21 @@ type
property Engine: TPasTreeContainer read FEngine;
property CurToken: TToken read FCurToken;
property CurTokenString: String read FCurTokenString;
property CurTokenString: string read FCurTokenString;
end;
function TPasTreeContainer.CreateElement(AClass: TPTreeElement;
const AName: String; AParent: TPasElement; const ASourceFilename: String;
const AName: string; AParent: TPasElement; const ASourceFilename: string;
ASourceLinenumber: Integer): TPasElement;
begin
Result := CreateElement(AClass, AName, AParent, visDefault, ASourceFilename,
ASourceLinenumber);
end;
function TPasTreeContainer.CreateFunctionType(const AName: String;
function TPasTreeContainer.CreateFunctionType(const AName,resultname: string;
AParent: TPasElement; UseParentAsResultParent: Boolean;
const ASourceFilename: String; ASourceLinenumber: Integer): TPasFunctionType;
const ASourceFilename: string; ASourceLinenumber: Integer): TPasFunctionType;
var
ResultParent: TPasElement;
begin
@ -178,16 +178,16 @@ begin
ResultParent := Result;
TPasFunctionType(Result).ResultEl :=
TPasResultElement(CreateElement(TPasResultElement, 'Result', ResultParent,
TPasResultElement(CreateElement(TPasResultElement, resultname, ResultParent,
ASourceFilename, ASourceLinenumber));
end;
function TPasTreeContainer.FindModule(const AName: String): TPasModule;
function TPasTreeContainer.FindModule(const AName: string): TPasModule;
begin
Result := nil;
end;
constructor EParserError.Create(const AReason, AFilename: String;
constructor EParserError.Create(const AReason, AFilename: string;
ARow, AColumn: Integer);
begin
inherited Create(AReason);
@ -196,7 +196,7 @@ begin
FColumn := AColumn;
end;
procedure TPasParser.ParseExc(const Msg: String);
procedure TPasParser.ParseExc(const Msg: string);
begin
raise EParserError.Create(Format(SParserErrorAtToken, [Msg, CurTokenName]),
Scanner.CurFilename, Scanner.CurRow, Scanner.CurColumn);
@ -211,7 +211,7 @@ begin
FEngine := AEngine;
end;
function TPasParser.CurTokenName: String;
function TPasParser.CurTokenName: string;
begin
if CurToken = tkIdentifier then
Result := 'Identifier ' + Scanner.CurTokenString
@ -219,7 +219,7 @@ begin
Result := TokenInfos[CurToken];
end;
function TPasParser.CurTokenText: String;
function TPasParser.CurTokenText: string;
begin
case CurToken of
tkIdentifier, tkString, tkNumber, tkChar:
@ -283,7 +283,7 @@ begin
ParseExc(Format(SParserExpectTokenError, [TokenInfos[tk]]));
end;
function TPasParser.ExpectIdentifier: String;
function TPasParser.ExpectIdentifier: string;
begin
ExpectToken(tkIdentifier);
Result := CurTokenString;
@ -295,7 +295,7 @@ begin
Result:=ParseType(Parent,'');
end;
function TPasParser.ParseType(Parent: TPasElement; Prefix : String): TPasType;
function TPasParser.ParseType(Parent: TPasElement; Prefix : string): TPasType;
procedure ParseRange;
begin
@ -311,7 +311,7 @@ function TPasParser.ParseType(Parent: TPasElement; Prefix : String): TPasType;
end;
var
Name, s: String;
Name, s: string;
EnumValue: TPasEnumValue;
Ref: TPasElement;
begin
@ -341,7 +341,7 @@ begin
else if s = 'LONGWORD' then Name := 'LongWord'
else if s = 'SHORTINT' then Name := 'ShortInt'
else if s = 'SMALLINT' then Name := 'SmallInt'
else if s = 'STRING' then Name := 'String'
else if s = 'string' then Name := 'string'
else if s = 'WORD' then Name := 'Word'
else
Ref := Engine.FindElement(Name);
@ -355,7 +355,7 @@ begin
Result := TPasUnresolvedTypeRef(CreateElement(TPasUnresolvedTypeRef, Name, nil));
// !!!: Doesn't make sense for resolved types
if Name = 'String' then
if Name = 'string' then
begin
NextToken;
if CurToken = tkSquaredBraceOpen then
@ -429,7 +429,7 @@ begin
end;
tkFunction:
begin
Result := Engine.CreateFunctionType('', Parent, false,
Result := Engine.CreateFunctionType('','result', Parent, false,
Scanner.CurFilename, Scanner.CurRow);
try
ParseProcedureOrFunctionHeader(Result,TPasFunctionType(Result),
@ -461,7 +461,7 @@ begin
end;
tkFunction:
begin
Result := Engine.CreateFunctionType('', nil, false, Scanner.CurFilename,
Result := Engine.CreateFunctionType('','result', nil, false, Scanner.CurFilename,
Scanner.CurRow);
ParseProcedureOrFunctionHeader(Result, TPasFunctionType(Result),
pt_function, true);
@ -479,7 +479,7 @@ end;
procedure TPasParser.ParseArrayType(Element: TPasArrayType);
Var
S : String;
S : string;
begin
NextToken;
@ -512,7 +512,7 @@ begin
end;
end;
function TPasParser.ParseExpression: String;
function TPasParser.ParseExpression: string;
var
BracketLevel: Integer;
MayAppendSpace, AppendSpace, NextAppendSpace: Boolean;
@ -603,7 +603,7 @@ end;
// Returns the parent for an element which is to be created
function TPasParser.CheckIfOverloaded(AOwner: TPasClassType;
const AName: String): TPasElement;
const AName: string): TPasElement;
var
i: Integer;
Member: TPasElement;
@ -782,7 +782,7 @@ end;
// Starts after the "uses" token
procedure TPasParser.ParseUsesList(ASection: TPasSection);
var
UnitName: String;
UnitName: string;
Element: TPasElement;
begin
while true do
@ -843,7 +843,7 @@ end;
// Starts after the type name
function TPasParser.ParseTypeDecl(Parent: TPasElement): TPasType;
var
TypeName: String;
TypeName: string;
procedure ParseRange;
begin
@ -861,7 +861,7 @@ var
var
EnumValue: TPasEnumValue;
Prefix : String;
Prefix : string;
HadPackedModifier : Boolean; // 12/04/04 - Dave - Added
begin
@ -962,7 +962,7 @@ begin
ParseRange;
end;
end;
{ _STRING, _FILE:
{ _string, _FILE:
begin
Result := TPasAliasType(CreateElement(TPasAliasType, TypeName, Parent));
UngetToken;
@ -1038,7 +1038,7 @@ begin
end;
tkFunction:
begin
Result := Engine.CreateFunctionType(TypeName, Parent, false,
Result := Engine.CreateFunctionType(TypeName, 'result', Parent, false,
Scanner.CurFilename, Scanner.CurRow);
try
ParseProcedureOrFunctionHeader(Result, TPasFunctionType(Result),
@ -1122,7 +1122,7 @@ procedure TPasParser.ParseVarDecl(Parent: TPasElement; List: TList);
var
i: Integer;
VarType: TPasType;
Value, S: String;
Value, S: string;
M: string;
begin
while true do
@ -1223,7 +1223,7 @@ procedure TPasParser.ParseArgList(Parent: TPasElement; Args: TList; EndToken: TT
var
ArgNames: TStringList;
IsUntyped: Boolean;
Name, Value: String;
Name, Value: string;
i: Integer;
Arg: TPasArgument;
Access: TArgumentAccess;
@ -1303,6 +1303,7 @@ end;
// will get the token after the final ";" as next token.
procedure TPasParser.ParseProcedureOrFunctionHeader(Parent: TPasElement;
Element: TPasProcedureType; proctype:Tproctype; OfObjectPossible: Boolean);
begin
NextToken;
case proctype of
@ -1331,11 +1332,11 @@ begin
end;
pt_operator:
begin
if CurToken = tkBraceOpen then
begin
ParseArgList(Parent, Element.Args, tkBraceClose);
ExpectToken(tkColon);
end else if CurToken <> tkColon then
ParseArgList(Parent, Element.Args, tkBraceClose);
TPasFunctionType(Element).ResultEl.name := ExpectIdentifier;
if CurToken <> tkColon then
ParseExc(SParserExpectedLBracketColon);
if Assigned(Element) then // !!!
TPasFunctionType(Element).ResultEl.ResultType := ParseType(Parent)
@ -1398,7 +1399,7 @@ end;
procedure TPasParser.ParseProperty(Element:TPasElement);
function GetAccessorName: String;
function GetAccessorName: string;
begin
ExpectIdentifier;
Result := CurTokenString;
@ -1519,14 +1520,14 @@ end;
function TPasParser.ParseProcedureOrFunctionDecl(Parent: TPasElement;
proctype: Tproctype): TPasProcedure;
var
Name: String;
Name: string;
begin
Name := ExpectIdentifier;
case proctype of
pt_function:
begin
Result := TPasFunction(CreateElement(TPasFunction, Name, Parent));
Result.ProcType := Engine.CreateFunctionType('', Result, true,
Result.ProcType := Engine.CreateFunctionType('', 'result', Result, true,
Scanner.CurFilename, Scanner.CurRow);
end;
pt_procedure:
@ -1538,7 +1539,7 @@ begin
pt_operator:
begin
Result := TPasOperator(CreateElement(TPasOperator, Name, Parent));
Result.ProcType := Engine.CreateFunctionType('', Result, true,
Result.ProcType := Engine.CreateFunctionType('', '__INVALID__', Result, true,
Scanner.CurFilename, Scanner.CurRow);
end;
end;
@ -1581,16 +1582,16 @@ end;
// Starts after the "class" token
function TPasParser.ParseClassDecl(Parent: TPasElement;
const AClassName: String; AObjKind: TPasObjKind): TPasType;
const AClassName: string; AObjKind: TPasObjKind): TPasType;
var
CurVisibility: TPasMemberVisibility;
pt: Tproctype;
procedure ProcessMethod(const MethodTypeName: String; HasReturnValue: Boolean);
procedure ProcessMethod(const MethodTypeName: string; HasReturnValue: Boolean);
var
Owner: TPasElement;
Proc: TPasProcedure;
s: String;
s: string;
begin
ExpectIdentifier;
Owner := CheckIfOverloaded(TPasClassType(Result), CurTokenString);
@ -1598,7 +1599,7 @@ var
begin
Proc := TPasFunction(CreateElement(TPasFunction, CurTokenString, Owner,
CurVisibility));
Proc.ProcType := Engine.CreateFunctionType( '', Proc, true,
Proc.ProcType := Engine.CreateFunctionType( '', 'result', Proc, true,
Scanner.CurFilename, Scanner.CurRow);
end else
begin
@ -1669,7 +1670,7 @@ var
end;
var
s, SourceFilename: String;
s, SourceFilename: string;
i, SourceLinenumber: Integer;
VarList: TList;
Element: TPasElement;
@ -1777,14 +1778,14 @@ begin
end;
end;
function TPasParser.CreateElement(AClass: TPTreeElement; const AName: String;
function TPasParser.CreateElement(AClass: TPTreeElement; const AName: string;
AParent: TPasElement): TPasElement;
begin
Result := Engine.CreateElement(AClass, AName, AParent,
Scanner.CurFilename, Scanner.CurRow);
end;
function TPasParser.CreateElement(AClass: TPTreeElement; const AName: String;
function TPasParser.CreateElement(AClass: TPTreeElement; const AName: string;
AParent: TPasElement; AVisibility: TPasMemberVisibility): TPasElement;
begin
Result := Engine.CreateElement(AClass, AName, AParent, AVisibility,
@ -1793,18 +1794,18 @@ end;
function ParseSource(AEngine: TPasTreeContainer;
const FPCCommandLine, OSTarget, CPUTarget: String): TPasModule;
const FPCCommandLine, OSTarget, CPUTarget: string): TPasModule;
var
FileResolver: TFileResolver;
Parser: TPasParser;
Start, CurPos: PChar;
Filename: String;
Filename: string;
Scanner: TPascalScanner;
procedure ProcessCmdLinePart;
var
l: Integer;
s: String;
s: string;
begin
l := CurPos - Start;
SetLength(s, l);
@ -1829,7 +1830,7 @@ var
end;
var
s: String;
s: string;
begin
Result := nil;
FileResolver := nil;