|
@@ -131,7 +131,7 @@ type
|
|
FTokenBufferSize: Integer; // maximum valid index in FTokenBuffer
|
|
FTokenBufferSize: Integer; // maximum valid index in FTokenBuffer
|
|
function CheckOverloadList(AList: TFPList; AName: String; out OldMember: TPasElement): TPasOverloadedProc;
|
|
function CheckOverloadList(AList: TFPList; AName: String; out OldMember: TPasElement): TPasOverloadedProc;
|
|
procedure DumpCurToken(Const Msg : String);
|
|
procedure DumpCurToken(Const Msg : String);
|
|
- function GetVariableModifiers(Parent: TPasElement): string;
|
|
|
|
|
|
+ function GetVariableModifiers(Parent: TPasElement; Out VarMods : TVariableModifiers; Out Libname,ExportName : string): string;
|
|
function GetVariableValueAndLocation(Parent : TPasElement; out Value, Location: String): Boolean;
|
|
function GetVariableValueAndLocation(Parent : TPasElement; out Value, Location: String): Boolean;
|
|
procedure ParseVarList(Parent: TPasElement; VarList: TFPList; AVisibility: TPasMemberVisibility; Full: Boolean);
|
|
procedure ParseVarList(Parent: TPasElement; VarList: TFPList; AVisibility: TPasMemberVisibility; Full: Boolean);
|
|
protected
|
|
protected
|
|
@@ -1373,7 +1373,7 @@ begin
|
|
expstack.Add(x);
|
|
expstack.Add(x);
|
|
end
|
|
end
|
|
else
|
|
else
|
|
- expstack.Add( TUnaryExpr.Create(AParent, PopExp, TokenToExprOp(tempop) ));
|
|
|
|
|
|
+ expstack.Add( TUnaryExpr.Create(AParent, x, TokenToExprOp(tempop) ));
|
|
end;
|
|
end;
|
|
|
|
|
|
end else
|
|
end else
|
|
@@ -1864,7 +1864,7 @@ begin
|
|
while True do
|
|
while True do
|
|
begin
|
|
begin
|
|
NextToken;
|
|
NextToken;
|
|
- //writeln('TPasParser.ParseSection Token=',Scanner.CurTokenString,' ',CurToken);
|
|
|
|
|
|
+ // writeln('TPasParser.ParseSection Token=',CurTokenString,' ',CurToken, ' ',scanner.CurFilename);
|
|
case CurToken of
|
|
case CurToken of
|
|
tkend:
|
|
tkend:
|
|
begin
|
|
begin
|
|
@@ -2218,6 +2218,8 @@ Var
|
|
E : TPasExportSymbol;
|
|
E : TPasExportSymbol;
|
|
begin
|
|
begin
|
|
Repeat
|
|
Repeat
|
|
|
|
+ if List.Count<>0 then
|
|
|
|
+ ExpectIdentifier;
|
|
E:=TPasExportSymbol(CreateElement(TPasExportSymbol,CurtokenString,Parent));
|
|
E:=TPasExportSymbol(CreateElement(TPasExportSymbol,CurtokenString,Parent));
|
|
List.Add(E);
|
|
List.Add(E);
|
|
NextToken;
|
|
NextToken;
|
|
@@ -2304,16 +2306,18 @@ begin
|
|
UngetToken;
|
|
UngetToken;
|
|
end;
|
|
end;
|
|
|
|
|
|
-Function TPasParser.GetVariableModifiers(Parent : TPasElement) : string;
|
|
|
|
|
|
+Function TPasParser.GetVariableModifiers(Parent : TPasElement; Out Varmods : TVariableModifiers; Out Libname,ExportName : string) : string;
|
|
|
|
|
|
Var
|
|
Var
|
|
S : String;
|
|
S : String;
|
|
begin
|
|
begin
|
|
Result := '';
|
|
Result := '';
|
|
|
|
+ VarMods := [];
|
|
NextToken;
|
|
NextToken;
|
|
If CurTokenIsIdentifier('cvar') then
|
|
If CurTokenIsIdentifier('cvar') then
|
|
begin
|
|
begin
|
|
Result:=';cvar';
|
|
Result:=';cvar';
|
|
|
|
+ Include(VarMods,vmcvar);
|
|
ExpectToken(tkSemicolon);
|
|
ExpectToken(tkSemicolon);
|
|
NextToken;
|
|
NextToken;
|
|
end;
|
|
end;
|
|
@@ -2322,16 +2326,24 @@ begin
|
|
UngetToken
|
|
UngetToken
|
|
else
|
|
else
|
|
begin
|
|
begin
|
|
|
|
+ if s='external' then
|
|
|
|
+ Include(VarMods,vmexternal)
|
|
|
|
+ else if (s='public') then
|
|
|
|
+ Include(varMods,vmpublic)
|
|
|
|
+ else if (s='export') then
|
|
|
|
+ Include(varMods,vmexport);
|
|
Result:=Result+';'+CurTokenText;
|
|
Result:=Result+';'+CurTokenText;
|
|
NextToken;
|
|
NextToken;
|
|
if (Curtoken<>tksemicolon) then
|
|
if (Curtoken<>tksemicolon) then
|
|
begin
|
|
begin
|
|
if (s='external') then
|
|
if (s='external') then
|
|
begin
|
|
begin
|
|
|
|
+ Include(VarMods,vmexternal);
|
|
if (CurToken in [tkString,tkIdentifier])
|
|
if (CurToken in [tkString,tkIdentifier])
|
|
and Not (CurTokenIsIdentifier('name')) then
|
|
and Not (CurTokenIsIdentifier('name')) then
|
|
begin
|
|
begin
|
|
Result := Result + ' ' + CurTokenText;
|
|
Result := Result + ' ' + CurTokenText;
|
|
|
|
+ LibName:=CurTokenText;
|
|
NextToken;
|
|
NextToken;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
@@ -2343,6 +2355,7 @@ begin
|
|
Result := Result + CurTokenText
|
|
Result := Result + CurTokenText
|
|
else
|
|
else
|
|
ParseExc(SParserSyntaxError);
|
|
ParseExc(SParserSyntaxError);
|
|
|
|
+ ExportName:=CurTokenText;
|
|
NextToken;
|
|
NextToken;
|
|
end
|
|
end
|
|
else
|
|
else
|
|
@@ -2361,7 +2374,8 @@ var
|
|
VarType: TPasType;
|
|
VarType: TPasType;
|
|
VarEl: TPasVariable;
|
|
VarEl: TPasVariable;
|
|
H : TPasMemberHints;
|
|
H : TPasMemberHints;
|
|
- Mods,Value,Loc : string;
|
|
|
|
|
|
+ varmods: TVariableModifiers;
|
|
|
|
+ Mods,Value,Loc,alibname,aexpname : string;
|
|
|
|
|
|
begin
|
|
begin
|
|
VarNames := TStringList.Create;
|
|
VarNames := TStringList.Create;
|
|
@@ -2382,16 +2396,24 @@ begin
|
|
GetVariableValueAndLocation(Parent,Value,Loc);
|
|
GetVariableValueAndLocation(Parent,Value,Loc);
|
|
H:=CheckHint(Nil,Full);
|
|
H:=CheckHint(Nil,Full);
|
|
if full then
|
|
if full then
|
|
- Mods:=GetVariableModifiers(Parent)
|
|
|
|
|
|
+ Mods:=GetVariableModifiers(Parent,varmods,alibname,aexpname)
|
|
else
|
|
else
|
|
NextToken;
|
|
NextToken;
|
|
for i := 0 to VarNames.Count - 1 do
|
|
for i := 0 to VarNames.Count - 1 do
|
|
begin
|
|
begin
|
|
VarEl:=TPasVariable(CreateElement(TPasVariable,VarNames[i],Parent,AVisibility));
|
|
VarEl:=TPasVariable(CreateElement(TPasVariable,VarNames[i],Parent,AVisibility));
|
|
VarEl.VarType := VarType;
|
|
VarEl.VarType := VarType;
|
|
- VarEl.Hints:=H;
|
|
|
|
|
|
+ // Procedure declaration eats the hints.
|
|
|
|
+ if Assigned(VarType) and (VarType is TPasprocedureType) then
|
|
|
|
+ VarEl.Hints:=VarType.Hints
|
|
|
|
+ else
|
|
|
|
+ VarEl.Hints:=H;
|
|
|
|
+ Varel.Modifiers:=Mods;
|
|
|
|
+ Varel.VarModifiers:=VarMods;
|
|
VarEl.Value:=Value;
|
|
VarEl.Value:=Value;
|
|
VarEl.AbsoluteLocation:=Loc;
|
|
VarEl.AbsoluteLocation:=Loc;
|
|
|
|
+ VarEl.LibraryName:=alibName;
|
|
|
|
+ VarEl.ExportName:=aexpname;
|
|
if (i>0) then
|
|
if (i>0) then
|
|
VarType.AddRef;
|
|
VarType.AddRef;
|
|
VarList.Add(VarEl);
|
|
VarList.Add(VarEl);
|
|
@@ -2942,12 +2964,12 @@ var
|
|
BeginBlock: TPasImplBeginBlock;
|
|
BeginBlock: TPasImplBeginBlock;
|
|
SubBlock: TPasImplElement;
|
|
SubBlock: TPasImplElement;
|
|
begin
|
|
begin
|
|
- //writeln('TPasParser.ParseProcBeginBlock ');
|
|
|
|
|
|
|
|
BeginBlock := TPasImplBeginBlock(CreateElement(TPasImplBeginBlock, '', Parent));
|
|
BeginBlock := TPasImplBeginBlock(CreateElement(TPasImplBeginBlock, '', Parent));
|
|
Parent.Body := BeginBlock;
|
|
Parent.Body := BeginBlock;
|
|
repeat
|
|
repeat
|
|
NextToken;
|
|
NextToken;
|
|
|
|
+// writeln('TPasParser.ParseProcBeginBlock ',curtokenstring);
|
|
if CurToken=tkend then
|
|
if CurToken=tkend then
|
|
break
|
|
break
|
|
else if CurToken<>tkSemiColon then
|
|
else if CurToken<>tkSemiColon then
|
|
@@ -2959,6 +2981,7 @@ begin
|
|
end;
|
|
end;
|
|
until false;
|
|
until false;
|
|
ExpectToken(tkSemicolon);
|
|
ExpectToken(tkSemicolon);
|
|
|
|
+// writeln('TPasParser.ParseProcBeginBlock ended ',curtokenstring);
|
|
end;
|
|
end;
|
|
|
|
|
|
// Next token is start of (compound) statement
|
|
// Next token is start of (compound) statement
|
|
@@ -3159,7 +3182,9 @@ begin
|
|
tkelse:
|
|
tkelse:
|
|
begin
|
|
begin
|
|
// create case-else block
|
|
// create case-else block
|
|
- CurBlock:=TPasImplCaseOf(CurBlock).AddElse;
|
|
|
|
|
|
+ el:=TPasImplCaseElse(CreateElement(TPasImplCaseElse,'',CurBlock));
|
|
|
|
+ TPasImplCaseOf(CurBlock).ElseBranch:=TPasImplCaseElse(el);
|
|
|
|
+ CreateBlock(TPasImplCaseElse(el));
|
|
break;
|
|
break;
|
|
end
|
|
end
|
|
else
|
|
else
|
|
@@ -3224,7 +3249,6 @@ begin
|
|
begin
|
|
begin
|
|
el:=TPasImplTryFinally(CreateElement(TPasImplTryFinally,'',Curblock));
|
|
el:=TPasImplTryFinally(CreateElement(TPasImplTryFinally,'',Curblock));
|
|
TPasImplTry(CurBlock).FinallyExcept:=TPasImplTryFinally(el);
|
|
TPasImplTry(CurBlock).FinallyExcept:=TPasImplTryFinally(el);
|
|
- CurBlock.AddElement(el);
|
|
|
|
CurBlock:=TPasImplTryFinally(el);
|
|
CurBlock:=TPasImplTryFinally(el);
|
|
end else
|
|
end else
|
|
ParseExc(SParserSyntaxError);
|
|
ParseExc(SParserSyntaxError);
|
|
@@ -3241,7 +3265,6 @@ begin
|
|
//writeln(i,'EXCEPT');
|
|
//writeln(i,'EXCEPT');
|
|
el:=TPasImplTryExcept(CreateElement(TPasImplTryExcept,'',CurBlock));
|
|
el:=TPasImplTryExcept(CreateElement(TPasImplTryExcept,'',CurBlock));
|
|
TPasImplTry(CurBlock).FinallyExcept:=TPasImplTryExcept(el);
|
|
TPasImplTry(CurBlock).FinallyExcept:=TPasImplTryExcept(el);
|
|
-// CurBlock.AddElement(el);
|
|
|
|
CurBlock:=TPasImplTryExcept(el);
|
|
CurBlock:=TPasImplTryExcept(el);
|
|
end else
|
|
end else
|
|
ParseExc(SParserSyntaxError);
|
|
ParseExc(SParserSyntaxError);
|