* Support for C-style assignments (bug 22007)

git-svn-id: trunk@22136 -
This commit is contained in:
michael 2012-08-19 22:01:36 +00:00
parent c087aff3b2
commit c9e622b5a8
2 changed files with 76 additions and 9 deletions

View File

@ -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;

View File

@ -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