|
@@ -85,7 +85,7 @@ uses Classes;
|
|
|
|
|
|
type
|
|
|
|
|
|
- TDeclType = (declNone, declConst, declResourcestring, declType, declVar);
|
|
|
+ TDeclType = (declNone, declConst, declResourcestring, declType, declVar, declThreadvar);
|
|
|
|
|
|
TProcType = (ptProcedure, ptFunction, ptOperator);
|
|
|
|
|
@@ -703,6 +703,8 @@ begin
|
|
|
CurBlock := declType;
|
|
|
tkVar:
|
|
|
CurBlock := declVar;
|
|
|
+ tkThreadVar:
|
|
|
+ CurBlock := declThreadVar;
|
|
|
tkProcedure:
|
|
|
begin
|
|
|
AddProcOrFunction(Section, ParseProcedureOrFunctionDecl(Section, ptProcedure));
|
|
@@ -770,7 +772,7 @@ begin
|
|
|
Section.Types.Add(TypeEl);
|
|
|
end;
|
|
|
end;
|
|
|
- declVar:
|
|
|
+ declVar, declThreadVar:
|
|
|
begin
|
|
|
List := TList.Create;
|
|
|
try
|
|
@@ -1369,8 +1371,7 @@ begin
|
|
|
begin
|
|
|
ParseArgList(Element, Element.Args, tkBraceClose);
|
|
|
TPasFunctionType(Element).ResultEl.Name := ExpectIdentifier;
|
|
|
- if CurToken <> tkColon then
|
|
|
- ParseExc(SParserExpectedLBracketColon);
|
|
|
+ ExpectToken(tkColon);
|
|
|
if Assigned(Element) then // !!!
|
|
|
TPasFunctionType(Element).ResultEl.ResultType := ParseType(Parent)
|
|
|
else
|
|
@@ -1387,7 +1388,8 @@ begin
|
|
|
UngetToken;
|
|
|
|
|
|
NextToken;
|
|
|
- if CurToken = tkEqual then begin
|
|
|
+ if CurToken = tkEqual then
|
|
|
+ begin
|
|
|
// for example: const p: procedure = nil;
|
|
|
UngetToken;
|
|
|
exit;
|
|
@@ -1407,6 +1409,10 @@ begin
|
|
|
begin
|
|
|
{ El['calling-conv'] := 'stdcall';}
|
|
|
ExpectToken(tkSemicolon);
|
|
|
+ end else if (CurToken = tkInline) then
|
|
|
+ begin
|
|
|
+{ TPasProcedure(Parent).IsInline := True;}
|
|
|
+ ExpectToken(tkSemicolon);
|
|
|
end else if (CurToken = tkIdentifier) and (UpperCase(CurTokenString) = 'DEPRECATED') then
|
|
|
begin
|
|
|
{ El['calling-conv'] := 'cdecl';}
|
|
@@ -1416,6 +1422,12 @@ begin
|
|
|
repeat
|
|
|
NextToken
|
|
|
until CurToken = tkSemicolon;
|
|
|
+ end else if (CurToken = tkSquaredBraceOpen) then
|
|
|
+ begin
|
|
|
+ repeat
|
|
|
+ NextToken
|
|
|
+ until CurToken = tkSquaredBraceClose;
|
|
|
+ ExpectToken(tkSemicolon);
|
|
|
end else if Parent.InheritsFrom(TPasProcedure) and
|
|
|
(CurToken = tkIdentifier) and (UpperCase(CurTokenString) = 'OVERLOAD') then
|
|
|
begin
|
|
@@ -1554,6 +1566,7 @@ function TPasParser.ParseProcedureOrFunctionDecl(Parent: TPasElement;
|
|
|
ProcType: TProcType): TPasProcedure;
|
|
|
var
|
|
|
Name: String;
|
|
|
+ i: Integer;
|
|
|
begin
|
|
|
case ProcType of
|
|
|
ptFunction:
|
|
@@ -1572,7 +1585,8 @@ begin
|
|
|
end;
|
|
|
ptOperator:
|
|
|
begin
|
|
|
- Name := TokenInfos[CurToken];
|
|
|
+ NextToken;
|
|
|
+ Name := 'operator ' + TokenInfos[CurToken];
|
|
|
Result := TPasOperator(CreateElement(TPasOperator, Name, Parent));
|
|
|
Result.ProcType := Engine.CreateFunctionType('', '__INVALID__', Result,
|
|
|
True, Scanner.CurFilename, Scanner.CurRow);
|
|
@@ -1580,6 +1594,20 @@ begin
|
|
|
end;
|
|
|
|
|
|
ParseProcedureOrFunctionHeader(Result, Result.ProcType, ProcType, False);
|
|
|
+
|
|
|
+ if ProcType = ptOperator then
|
|
|
+ begin
|
|
|
+ Result.Name := Result.Name + '(';
|
|
|
+ for i := 0 to Result.ProcType.Args.Count - 1 do
|
|
|
+ begin
|
|
|
+ if i > 0 then
|
|
|
+ Result.Name := Result.Name + ', ';
|
|
|
+ Result.Name := Result.Name +
|
|
|
+ TPasArgument(Result.ProcType.Args[i]).ArgType.Name;
|
|
|
+ end;
|
|
|
+ Result.Name := Result.Name + '): ' +
|
|
|
+ TPasFunctionType(Result.ProcType).ResultEl.ResultType.Name;
|
|
|
+ end;
|
|
|
end;
|
|
|
|
|
|
|
|
@@ -1646,9 +1674,10 @@ begin
|
|
|
Variant.Members.Free;
|
|
|
raise;
|
|
|
end;
|
|
|
- ExpectToken(tkSemicolon);
|
|
|
NextToken;
|
|
|
- if CurToken = tkEnd then
|
|
|
+ if CurToken = tkSemicolon then
|
|
|
+ NextToken;
|
|
|
+ if (CurToken = tkEnd) or (CurToken = tkBraceClose) then
|
|
|
break
|
|
|
else
|
|
|
UngetToken;
|
|
@@ -1817,10 +1846,6 @@ begin
|
|
|
VarList := TList.Create;
|
|
|
try
|
|
|
ParseInlineVarDecl(Result, VarList, CurVisibility, False);
|
|
|
- NextToken;
|
|
|
- // Records may be terminated with end, no semicolon
|
|
|
- if (CurToken <> tkEnd) and (CurToken <> tkSemicolon) then
|
|
|
- ParseExc(SParserExpectedSemiColonEnd);
|
|
|
for i := 0 to VarList.Count - 1 do
|
|
|
begin
|
|
|
Element := TPasElement(VarList[i]);
|