While playing around with the compiler source to familiarize myself I've produced the attached patch. While I didn't set out to produce anything for inclusion into the official codebase at least some of the changes might be generally useful.
a) now modeswitch: m_ident_escape Allows escaping of identifiers which might otherwise be recognized as keywords. This mirrors Delphi's (and Chrome's) implementation. type TMyRecord = record &unit: Integer; end; No space is allowed betweehn & and identifier. As identifiers are not allowed to start with digits there is no collision with the &123 support for base 8 integer constants. b) new modeswitch: m_always_ident_after_dot There are no valid cases in the pascal grammer where a keyword follows a single dot. As a) makes it now possible to declare identifiers which are identical to keywords qualified access to these fields can now be simplified by always recognizing an identifier/keyword following a dot as a simple identifier, no matter if it matches a keyword or not. I'm not sure if Delphi implements this. Chrome does. var myRecord: TMyRecord; begin myRecord.unit := 123; end; These 2 switches should not affect compatibility to existing code. I can run a complete make all / make install with both of these generally active. It could be considered to add them to {$mode objfpc} c) new $mode: m_chrome Currently baseed on objfpc with the addition of all 3 new mode switches. In addition to a) and b) m_chrome allows the use of "method" as an alternative to both procedure and function (if the method is a procedure or function can simply be determined by the presence of a defined result type). A slightly extreme example follows: >>>> {$mode chrome} program ChromeTest; type TMyObject = class method Foo; method Bar: Integer; class method ClassFoo; class method ClassBar: Integer; method &class; method &method(&string: string):string; end; type &method = method(&string: string):string of object; { TMyObject } method TMyObject.Bar: Integer; begin WriteLn('TMyObject.Bar'); Result := 0; end; method TMyObject.Foo; begin WriteLn('TMyObject.Foo'); end; class method TMyObject.ClassBar: Integer; begin WriteLn('TMyObject.ClassBar'); Result := 0; end; class method TMyObject.ClassFoo; begin WriteLn('TMyObject.ClassFoo'); end; method TMyObject.class; begin WriteLn('Class'); end; method TMyObject.method(&string: string):string; begin Result := '*** ' + &string + ' ***'; end; method Foo; begin WriteLn('Foo'); end; method Bar: Integer; begin WriteLn('Bar'); Result := 0; end; var &object: TMyObject; amethod: &method; begin Foo; Bar; TMyObject.ClassFoo; TMyObject.ClassBar; &object := TMyObject.Create; &object.Class; amethod := @&object.method; WriteLn(amethod('method')); with &object do try Foo; Bar; &class; finally Free; end; end. <<<< Cheers, Thorsten
chrome.patch
Description: Binary data
_______________________________________________ fpc-devel maillist - fpc-devel@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-devel