|
@@ -19,7 +19,7 @@ unit PParser;
|
|
|
|
|
|
interface
|
|
interface
|
|
|
|
|
|
-uses SysUtils, PasTree;
|
|
|
|
|
|
+uses SysUtils, PasTree, PScanner;
|
|
|
|
|
|
resourcestring
|
|
resourcestring
|
|
SErrNoSourceGiven = 'No source file specified';
|
|
SErrNoSourceGiven = 'No source file specified';
|
|
@@ -82,7 +82,7 @@ function ParseSource(AEngine: TPasTreeContainer;
|
|
|
|
|
|
implementation
|
|
implementation
|
|
|
|
|
|
-uses Classes, PScanner;
|
|
|
|
|
|
+uses Classes;
|
|
|
|
|
|
type
|
|
type
|
|
|
|
|
|
@@ -109,6 +109,7 @@ type
|
|
function CreateElement(AClass: TPTreeElement; const AName: String;
|
|
function CreateElement(AClass: TPTreeElement; const AName: String;
|
|
AParent: TPasElement; AVisibility: TPasMemberVisibility): TPasElement;
|
|
AParent: TPasElement; AVisibility: TPasMemberVisibility): TPasElement;
|
|
public
|
|
public
|
|
|
|
+ Options : set of TPOptions;
|
|
constructor Create(AScanner: TPascalScanner; AFileResolver: TFileResolver;
|
|
constructor Create(AScanner: TPascalScanner; AFileResolver: TFileResolver;
|
|
AEngine: TPasTreeContainer);
|
|
AEngine: TPasTreeContainer);
|
|
function CurTokenName: String;
|
|
function CurTokenName: String;
|
|
@@ -315,9 +316,19 @@ var
|
|
Name, s: String;
|
|
Name, s: String;
|
|
EnumValue: TPasEnumValue;
|
|
EnumValue: TPasEnumValue;
|
|
Ref: TPasElement;
|
|
Ref: TPasElement;
|
|
|
|
+ HadPackedModifier : Boolean; // 12/04/04 - Dave - Added
|
|
begin
|
|
begin
|
|
Result := nil; // !!!: Remove in the future
|
|
Result := nil; // !!!: Remove in the future
|
|
|
|
+ HadPackedModifier := False; { Assume not present }
|
|
NextToken;
|
|
NextToken;
|
|
|
|
+ if CurToken = tkPacked then { If PACKED modifier }
|
|
|
|
+ begin { Handle PACKED modifier for all situations }
|
|
|
|
+ NextToken; { Move to next token for rest of parse }
|
|
|
|
+ if CurToken in [tkArray, tkRecord, tkObject, tkClass] then { If allowed }
|
|
|
|
+ HadPackedModifier := True { rememeber for later }
|
|
|
|
+ else { otherwise, syntax error }
|
|
|
|
+ ParseExc(Format(SParserExpectTokenError,['ARRAY, RECORD, OBJECT or CLASS']))
|
|
|
|
+ end;
|
|
case CurToken of
|
|
case CurToken of
|
|
tkIdentifier:
|
|
tkIdentifier:
|
|
begin
|
|
begin
|
|
@@ -377,6 +388,7 @@ begin
|
|
tkArray:
|
|
tkArray:
|
|
begin
|
|
begin
|
|
Result := TPasArrayType(CreateElement(TPasArrayType, '', Parent));
|
|
Result := TPasArrayType(CreateElement(TPasArrayType, '', Parent));
|
|
|
|
+ TPasArrayType(Result).IsPacked := HadPackedModifier;
|
|
ParseArrayType(TPasArrayType(Result));
|
|
ParseArrayType(TPasArrayType(Result));
|
|
end;
|
|
end;
|
|
tkBraceOpen:
|
|
tkBraceOpen:
|
|
@@ -418,6 +430,7 @@ begin
|
|
tkRecord:
|
|
tkRecord:
|
|
begin
|
|
begin
|
|
Result := TPasRecordType(CreateElement(TPasRecordType, '', Parent));
|
|
Result := TPasRecordType(CreateElement(TPasRecordType, '', Parent));
|
|
|
|
+ TPasRecordType(Result).IsPacked := HadPackedModifier;
|
|
try
|
|
try
|
|
ParseRecordDecl(TPasRecordType(Result), False);
|
|
ParseRecordDecl(TPasRecordType(Result), False);
|
|
except
|
|
except
|
|
@@ -1324,7 +1337,13 @@ begin
|
|
begin
|
|
begin
|
|
if CurToken = tkBraceOpen then
|
|
if CurToken = tkBraceOpen then
|
|
begin
|
|
begin
|
|
- ParseArgList(Parent, Element.Args, tkBraceClose);
|
|
|
|
|
|
+ NextToken;
|
|
|
|
+ if (CurToken = tkBraceClose) then
|
|
|
|
+ else
|
|
|
|
+ begin
|
|
|
|
+ UngetToken;
|
|
|
|
+ ParseArgList(Parent, Element.Args, tkBraceClose);
|
|
|
|
+ end;
|
|
ExpectToken(tkColon);
|
|
ExpectToken(tkColon);
|
|
end else if CurToken <> tkColon then
|
|
end else if CurToken <> tkColon then
|
|
ParseExc(SParserExpectedLBracketColon);
|
|
ParseExc(SParserExpectedLBracketColon);
|
|
@@ -1337,7 +1356,13 @@ begin
|
|
begin
|
|
begin
|
|
if CurToken = tkBraceOpen then
|
|
if CurToken = tkBraceOpen then
|
|
begin
|
|
begin
|
|
- ParseArgList(Element, Element.Args, tkBraceClose);
|
|
|
|
|
|
+ NextToken;
|
|
|
|
+ if (CurToken = tkBraceClose) then
|
|
|
|
+ else
|
|
|
|
+ begin
|
|
|
|
+ UngetToken;
|
|
|
|
+ ParseArgList(Element, Element.Args, tkBraceClose);
|
|
|
|
+ end
|
|
end else if (CurToken = tkSemicolon) or (OfObjectPossible and (CurToken = tkOf)) then
|
|
end else if (CurToken = tkSemicolon) or (OfObjectPossible and (CurToken = tkOf)) then
|
|
UngetToken
|
|
UngetToken
|
|
else
|
|
else
|
|
@@ -1914,6 +1939,12 @@ var
|
|
'F':
|
|
'F':
|
|
if s[3] = 'i' then
|
|
if s[3] = 'i' then
|
|
FileResolver.AddIncludePath(Copy(s, 4, Length(s)));
|
|
FileResolver.AddIncludePath(Copy(s, 4, Length(s)));
|
|
|
|
+ 'S':
|
|
|
|
+ if s[3]='d' then
|
|
|
|
+ begin
|
|
|
|
+ include(Scanner.Options,po_delphi);
|
|
|
|
+ include(Parser.Options,po_delphi);
|
|
|
|
+ end;
|
|
end;
|
|
end;
|
|
end else
|
|
end else
|
|
if Filename <> '' then
|
|
if Filename <> '' then
|