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

View File

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