mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-24 15:49:21 +02:00
* Support for C-style assignments (bug 22007)
git-svn-id: trunk@22136 -
This commit is contained in:
parent
c087aff3b2
commit
c9e622b5a8
@ -245,6 +245,7 @@ function ParseSource(AEngine: TPasTreeContainer;
|
|||||||
Function IsHintToken(T : String; Out AHint : TPasMemberHint) : boolean;
|
Function IsHintToken(T : String; Out AHint : TPasMemberHint) : boolean;
|
||||||
Function IsModifier(S : String; Out Pm : TProcedureModifier) : Boolean;
|
Function IsModifier(S : String; Out Pm : TProcedureModifier) : Boolean;
|
||||||
Function IsCallingConvention(S : String; out CC : TCallingConvention) : Boolean;
|
Function IsCallingConvention(S : String; out CC : TCallingConvention) : Boolean;
|
||||||
|
Function TokenToAssignKind( tk : TToken) : TAssignKind;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
@ -327,6 +328,20 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
Function TokenToAssignKind( tk : TToken) : TAssignKind;
|
||||||
|
|
||||||
|
begin
|
||||||
|
case tk of
|
||||||
|
tkAssign : Result:=akDefault;
|
||||||
|
tkAssignPlus : Result:=akAdd;
|
||||||
|
tkAssignMinus : Result:=akMinus;
|
||||||
|
tkAssignMul : Result:=akMul;
|
||||||
|
tkAssignDivision : Result:=akDivision;
|
||||||
|
else
|
||||||
|
Raise Exception.CreateFmt('Not an assignment token : %s',[TokenInfos[tk]]);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
function ParseSource(AEngine: TPasTreeContainer;
|
function ParseSource(AEngine: TPasTreeContainer;
|
||||||
const FPCCommandLine, OSTarget, CPUTarget: String;
|
const FPCCommandLine, OSTarget, CPUTarget: String;
|
||||||
UseStreams : Boolean = False): TPasModule;
|
UseStreams : Boolean = False): TPasModule;
|
||||||
@ -353,6 +368,10 @@ var
|
|||||||
case s[2] of
|
case s[2] of
|
||||||
'd': // -d define
|
'd': // -d define
|
||||||
Scanner.AddDefine(UpperCase(Copy(s, 3, Length(s))));
|
Scanner.AddDefine(UpperCase(Copy(s, 3, Length(s))));
|
||||||
|
'S': // -d define
|
||||||
|
case S[3] of
|
||||||
|
'c' :Scanner.Options:=Scanner.Options+[c_assignments];
|
||||||
|
end;
|
||||||
'F': // -F
|
'F': // -F
|
||||||
if (length(s)>2) and (s[3] = 'i') then // -Fi include path
|
if (length(s)>2) and (s[3] = 'i') then // -Fi include path
|
||||||
FileResolver.AddIncludePath(Copy(s, 4, Length(s)));
|
FileResolver.AddIncludePath(Copy(s, 4, Length(s)));
|
||||||
@ -2974,7 +2993,7 @@ var
|
|||||||
left: TPasExpr;
|
left: TPasExpr;
|
||||||
right: TPasExpr;
|
right: TPasExpr;
|
||||||
el : TPasImplElement;
|
el : TPasImplElement;
|
||||||
|
ak : TAssignKind;
|
||||||
begin
|
begin
|
||||||
NewImplElement:=nil;
|
NewImplElement:=nil;
|
||||||
CurBlock := Parent;
|
CurBlock := Parent;
|
||||||
@ -3305,14 +3324,20 @@ begin
|
|||||||
else
|
else
|
||||||
left:=DoParseExpression(nil);
|
left:=DoParseExpression(nil);
|
||||||
case CurToken of
|
case CurToken of
|
||||||
tkAssign:
|
tkAssign,
|
||||||
|
tkAssignPlus,
|
||||||
|
tkAssignMinus,
|
||||||
|
tkAssignMul,
|
||||||
|
tkAssignDivision:
|
||||||
begin
|
begin
|
||||||
// assign statement
|
// assign statement
|
||||||
|
Ak:=TokenToAssignKind(CurToken);
|
||||||
NextToken;
|
NextToken;
|
||||||
right:=DoParseExpression(nil); // this may solve TPasImplWhileDo.AddElement BUG
|
right:=DoParseExpression(nil); // this may solve TPasImplWhileDo.AddElement BUG
|
||||||
el:=TPasImplAssign(CreateElement(TPasImplAssign,'',CurBlock));
|
el:=TPasImplAssign(CreateElement(TPasImplAssign,'',CurBlock));
|
||||||
TPasImplAssign(el).left:=Left;
|
TPasImplAssign(el).left:=Left;
|
||||||
TPasImplAssign(el).right:=Right;
|
TPasImplAssign(el).right:=Right;
|
||||||
|
TPasImplAssign(el).Kind:=ak;
|
||||||
CurBlock.AddElement(el);
|
CurBlock.AddElement(el);
|
||||||
CmdElem:=TPasImplAssign(el);
|
CmdElem:=TPasImplAssign(el);
|
||||||
UngetToken;
|
UngetToken;
|
||||||
|
@ -76,6 +76,10 @@ type
|
|||||||
tkGreaterEqualThan, // '>='
|
tkGreaterEqualThan, // '>='
|
||||||
tkPower, // '**'
|
tkPower, // '**'
|
||||||
tkSymmetricalDifference, // '><'
|
tkSymmetricalDifference, // '><'
|
||||||
|
tkAssignPlus, // +=
|
||||||
|
tkAssignMinus, // -=
|
||||||
|
tkAssignMul, // *=
|
||||||
|
tkAssignDivision, // /=
|
||||||
// Reserved words
|
// Reserved words
|
||||||
tkabsolute,
|
tkabsolute,
|
||||||
tkand,
|
tkand,
|
||||||
@ -288,7 +292,7 @@ type
|
|||||||
|
|
||||||
TPascalScannerPPSkipMode = (ppSkipNone, ppSkipIfBranch, ppSkipElseBranch, ppSkipAll);
|
TPascalScannerPPSkipMode = (ppSkipNone, ppSkipIfBranch, ppSkipElseBranch, ppSkipAll);
|
||||||
|
|
||||||
TPOption = (po_delphi);
|
TPOption = (po_delphi,po_cassignments);
|
||||||
TPOptions = set of TPOption;
|
TPOptions = set of TPOption;
|
||||||
|
|
||||||
{ TPascalScanner }
|
{ TPascalScanner }
|
||||||
@ -402,6 +406,10 @@ const
|
|||||||
'>=',
|
'>=',
|
||||||
'**',
|
'**',
|
||||||
'><',
|
'><',
|
||||||
|
'+=',
|
||||||
|
'-=',
|
||||||
|
'*=',
|
||||||
|
'/=',
|
||||||
// Reserved words
|
// Reserved words
|
||||||
'absolute',
|
'absolute',
|
||||||
'and',
|
'and',
|
||||||
@ -1368,13 +1376,30 @@ begin
|
|||||||
begin
|
begin
|
||||||
Inc(TokenStr);
|
Inc(TokenStr);
|
||||||
Result := tkPower;
|
Result := tkPower;
|
||||||
end else
|
end else if not (po_cassignments in options) then
|
||||||
Result := tkMul;
|
Result := tkMul
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
if TokenStr[0]='=' then
|
||||||
|
begin
|
||||||
|
Inc(TokenStr);
|
||||||
|
Result:=tkAssignMul;
|
||||||
|
end;
|
||||||
|
end
|
||||||
end;
|
end;
|
||||||
'+':
|
'+':
|
||||||
begin
|
begin
|
||||||
Inc(TokenStr);
|
Inc(TokenStr);
|
||||||
Result := tkPlus;
|
if not (po_cassignments in options) then
|
||||||
|
Result := tkPlus
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
if TokenStr[0]='=' then
|
||||||
|
begin
|
||||||
|
Inc(TokenStr);
|
||||||
|
Result:=tkAssignPlus;
|
||||||
|
end;
|
||||||
|
end
|
||||||
end;
|
end;
|
||||||
',':
|
',':
|
||||||
begin
|
begin
|
||||||
@ -1384,7 +1409,16 @@ begin
|
|||||||
'-':
|
'-':
|
||||||
begin
|
begin
|
||||||
Inc(TokenStr);
|
Inc(TokenStr);
|
||||||
Result := tkMinus;
|
if not (po_cassignments in options) then
|
||||||
|
Result := tkMinus
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
if TokenStr[0]='=' then
|
||||||
|
begin
|
||||||
|
Inc(TokenStr);
|
||||||
|
Result:=tkAssignMinus;
|
||||||
|
end;
|
||||||
|
end
|
||||||
end;
|
end;
|
||||||
'.':
|
'.':
|
||||||
begin
|
begin
|
||||||
@ -1412,8 +1446,16 @@ begin
|
|||||||
Move(TokenStart^, FCurTokenString[1], SectionLength);
|
Move(TokenStart^, FCurTokenString[1], SectionLength);
|
||||||
Result := tkComment;
|
Result := tkComment;
|
||||||
//WriteLn('Einzeiliger Kommentar: "', CurTokenString, '"');
|
//WriteLn('Einzeiliger Kommentar: "', CurTokenString, '"');
|
||||||
end else
|
end else if not (po_cassignments in options) then
|
||||||
Result := tkDivision;
|
Result := tkDivision
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
if TokenStr[0]='=' then
|
||||||
|
begin
|
||||||
|
Inc(TokenStr);
|
||||||
|
Result:=tkAssignDivision;
|
||||||
|
end;
|
||||||
|
end
|
||||||
end;
|
end;
|
||||||
'0'..'9':
|
'0'..'9':
|
||||||
begin
|
begin
|
||||||
|
Loading…
Reference in New Issue
Block a user