mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-20 21:29:26 +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 IsModifier(S : String; Out Pm : TProcedureModifier) : Boolean;
|
||||
Function IsCallingConvention(S : String; out CC : TCallingConvention) : Boolean;
|
||||
Function TokenToAssignKind( tk : TToken) : TAssignKind;
|
||||
|
||||
implementation
|
||||
|
||||
@ -327,6 +328,20 @@ begin
|
||||
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;
|
||||
const FPCCommandLine, OSTarget, CPUTarget: String;
|
||||
UseStreams : Boolean = False): TPasModule;
|
||||
@ -353,6 +368,10 @@ var
|
||||
case s[2] of
|
||||
'd': // -d define
|
||||
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
|
||||
if (length(s)>2) and (s[3] = 'i') then // -Fi include path
|
||||
FileResolver.AddIncludePath(Copy(s, 4, Length(s)));
|
||||
@ -2974,7 +2993,7 @@ var
|
||||
left: TPasExpr;
|
||||
right: TPasExpr;
|
||||
el : TPasImplElement;
|
||||
|
||||
ak : TAssignKind;
|
||||
begin
|
||||
NewImplElement:=nil;
|
||||
CurBlock := Parent;
|
||||
@ -3305,14 +3324,20 @@ begin
|
||||
else
|
||||
left:=DoParseExpression(nil);
|
||||
case CurToken of
|
||||
tkAssign:
|
||||
tkAssign,
|
||||
tkAssignPlus,
|
||||
tkAssignMinus,
|
||||
tkAssignMul,
|
||||
tkAssignDivision:
|
||||
begin
|
||||
// assign statement
|
||||
Ak:=TokenToAssignKind(CurToken);
|
||||
NextToken;
|
||||
right:=DoParseExpression(nil); // this may solve TPasImplWhileDo.AddElement BUG
|
||||
el:=TPasImplAssign(CreateElement(TPasImplAssign,'',CurBlock));
|
||||
TPasImplAssign(el).left:=Left;
|
||||
TPasImplAssign(el).right:=Right;
|
||||
TPasImplAssign(el).Kind:=ak;
|
||||
CurBlock.AddElement(el);
|
||||
CmdElem:=TPasImplAssign(el);
|
||||
UngetToken;
|
||||
|
@ -76,6 +76,10 @@ type
|
||||
tkGreaterEqualThan, // '>='
|
||||
tkPower, // '**'
|
||||
tkSymmetricalDifference, // '><'
|
||||
tkAssignPlus, // +=
|
||||
tkAssignMinus, // -=
|
||||
tkAssignMul, // *=
|
||||
tkAssignDivision, // /=
|
||||
// Reserved words
|
||||
tkabsolute,
|
||||
tkand,
|
||||
@ -288,7 +292,7 @@ type
|
||||
|
||||
TPascalScannerPPSkipMode = (ppSkipNone, ppSkipIfBranch, ppSkipElseBranch, ppSkipAll);
|
||||
|
||||
TPOption = (po_delphi);
|
||||
TPOption = (po_delphi,po_cassignments);
|
||||
TPOptions = set of TPOption;
|
||||
|
||||
{ TPascalScanner }
|
||||
@ -402,6 +406,10 @@ const
|
||||
'>=',
|
||||
'**',
|
||||
'><',
|
||||
'+=',
|
||||
'-=',
|
||||
'*=',
|
||||
'/=',
|
||||
// Reserved words
|
||||
'absolute',
|
||||
'and',
|
||||
@ -1368,13 +1376,30 @@ begin
|
||||
begin
|
||||
Inc(TokenStr);
|
||||
Result := tkPower;
|
||||
end else
|
||||
Result := tkMul;
|
||||
end else if not (po_cassignments in options) then
|
||||
Result := tkMul
|
||||
else
|
||||
begin
|
||||
if TokenStr[0]='=' then
|
||||
begin
|
||||
Inc(TokenStr);
|
||||
Result:=tkAssignMul;
|
||||
end;
|
||||
end
|
||||
end;
|
||||
'+':
|
||||
begin
|
||||
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;
|
||||
',':
|
||||
begin
|
||||
@ -1384,7 +1409,16 @@ begin
|
||||
'-':
|
||||
begin
|
||||
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;
|
||||
'.':
|
||||
begin
|
||||
@ -1412,8 +1446,16 @@ begin
|
||||
Move(TokenStart^, FCurTokenString[1], SectionLength);
|
||||
Result := tkComment;
|
||||
//WriteLn('Einzeiliger Kommentar: "', CurTokenString, '"');
|
||||
end else
|
||||
Result := tkDivision;
|
||||
end else if not (po_cassignments in options) then
|
||||
Result := tkDivision
|
||||
else
|
||||
begin
|
||||
if TokenStr[0]='=' then
|
||||
begin
|
||||
Inc(TokenStr);
|
||||
Result:=tkAssignDivision;
|
||||
end;
|
||||
end
|
||||
end;
|
||||
'0'..'9':
|
||||
begin
|
||||
|
Loading…
Reference in New Issue
Block a user