Files

1862 lines
65 KiB
ObjectPascal

{-------------------------------------------------------------------------------
The contents of this file are subject to the Mozilla Public License
Version 1.1 (the "License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.mozilla.org/MPL/
Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
the specific language governing rights and limitations under the License.
The Original Code is: SynGenUnit.pas, released 2000-04-19.
Description: Generator for skeletons of HighLighters to use in SynEdit,
drived by a simple grammar.
The Original Code is based on SynGenU.pas by Martin Waldenburg, part of
the mwEdit component suite.
Portions created by Martin Waldenburg are Copyright (C) 1998 Martin Waldenburg.
All Rights Reserved.
Portions created by Pieter Polak are Copyright (C) 2001 Pieter Polak.
All Rights Reserved.
Contributors to the SynEdit and mwEdit projects are listed in the
Contributors.txt file.
Alternatively, the contents of this file may be used under the terms of the
GNU General Public License Version 2 or later (the "GPL"), in which case
the provisions of the GPL are applicable instead of those above.
If you wish to allow use of your version of this file only under the terms
of the GPL and not to allow others to use your version of this file
under the MPL, indicate your decision by deleting the provisions above and
replace them with the notice and other provisions required by the GPL.
If you do not delete the provisions above, a recipient may use your version
of this file under either the MPL or the GPL.
$Id: SynGenUnit.pas,v 1.18 2003/04/30 13:09:15 etrusco Exp $
You may retrieve the latest version of this file at the SynEdit home page,
located at http://SynEdit.SourceForge.net
Todo:
- Remember the last opened MSG file
- Double-click a MSG file opens SynGen
- SynGen should not halt when TOpenFileDialog is cancelled
- Add user-defined default attributes to TSynXXXSyn.Create
- SynEdit to edit the MSG file (using the highlighter for MSG files)
- Store language names list and attribute names list in INI file
- SynEdit with Pascal highlighter to preview the created highlighter source
- Allow to define different type of keywords in MSG file
Known Issues:
-------------------------------------------------------------------------------}
unit SynGenUnit;
{$I SynEdit.inc}
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, GenLex, ComCtrls, Menus;
var
mKeyHashTable: array[#0..#255] of Integer;
mSKeyHashTable: array[#0..#255] of Integer;
type
TLexKeys = Class
public
KeyName: String;
Key: Integer;
TokenType: String;
end;
TLexCharsets = Class
public
SetName: String;
Charset: String;
ProcData: String;
FuncData: String;
end;
TLexEnclosedBy = class
public
TokenName: String;
ProcName: String;
StartsWith: String;
EndsWith: String;
MultiLine: Boolean;
constructor Create;
end;
TLexDefaultAttri = class
public
Style: String;
Foreground: String;
Background: String;
constructor Create;
end;
TFrmMain = class(TForm)
BtnStart: TButton;
OpenDialog: TOpenDialog;
PageControl: TPageControl;
TabLanguage: TTabSheet;
LblFilter: TLabel;
CboFilter: TComboBox;
LblLangName: TLabel;
CboLangName: TComboBox;
TabAttributes: TTabSheet;
GrpAttrNames: TGroupBox;
LblIdentifier: TLabel;
LblReservedWord: TLabel;
CboAttrIdentifier: TComboBox;
CboAttrReservedWord: TComboBox;
LblUnknownTokenAttr: TLabel;
CboUnknownTokenAttr: TComboBox;
TabFields: TTabSheet;
BtnAdd: TButton;
BtnDelete: TButton;
EditAddField: TEdit;
ListBoxFields: TListBox;
MainMenu: TMainMenu;
MnuFile: TMenuItem;
MnuOpen: TMenuItem;
MnuExit: TMenuItem;
TabHighlighter: TTabSheet;
LblAuthor: TLabel;
LblDescription: TLabel;
LblVersion: TLabel;
EditAuthor: TEdit;
EditDescription: TEdit;
EditVersion: TEdit;
MnuStart: TMenuItem;
ChkGetKeyWords: TCheckBox;
ChkGPLHeader: TCheckBox;
Hash1: TMenuItem;
procedure BtnStartClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure CboLangNameChange(Sender: TObject);
procedure ListBoxFieldsClick(Sender: TObject);
procedure BtnAddClick(Sender: TObject);
procedure BtnDeleteClick(Sender: TObject);
procedure EditAddFieldChange(Sender: TObject);
procedure EditAddFieldKeyPress(Sender: TObject; var Key: Char);
procedure MnuExitClick(Sender: TObject);
procedure MnuOpenClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Hash1Click(Sender: TObject);
private
LexName: String;
IdentPre: String;
IdentStart: String;
IdentContent: String;
FFileName: string;
IniFile: string;
OutFile: TextFile;
Sensitivity: Boolean;
Stream: TMemoryStream;
Lex: TGenLex;
KeyList: TList;
SetList: TList;
EnclosedList: TList;
SampleSourceList: TStringList;
IdentList: TStringList;
procedure ClearAll;
function GetFilterName: String;
function GetLangName: String;
function FilterInvalidChars(const Value: String): String;
procedure MakeHashTable;
procedure MakeSensitiveHashTable;
procedure FillKeyList;
procedure FillTokenTypeList;
procedure OutFileCreate(InName: String);
procedure ParseCharsets;
procedure ParseEnclosedBy;
procedure ParseSampleSource;
procedure RetrieveCharset;
procedure RetrieveEnclosedBy;
procedure RetrieveSampleSource;
procedure WriteSettings;
function PerformFileOpen: Boolean;
function KeyHash(ToHash: String): Integer;
function SensKeyHash(ToHash: String): Integer;
procedure WriteRest;
public
end;
var
FrmMain: TFrmMain;
implementation
uses
Registry;
{$R *.DFM}
function CompareKeys(Item1, Item2: Pointer): Integer;
begin
Result := 0;
if TLexKeys(Item1).Key < TLexKeys(Item2).Key then
Result := -1
else if TLexKeys(Item1).Key > TLexKeys(Item2).Key then
Result := 1;
end;
function CompareSets(Item1, Item2: Pointer): Integer;
begin
Result := 0;
if TLexCharsets(Item1).SetName < TLexCharsets(Item2).SetName then
Result := -1
else
if TLexCharsets(Item1).SetName > TLexCharsets(Item2).SetName then Result := 1;
end;
function AddInt(const aValue: Integer): String;
begin
if (aValue < 0) then
Result := ' - ' + IntToStr(Abs(aValue))
else if (aValue > 0) then
Result := ' + ' + IntToStr(aValue)
else
Result := '';
end;
function StuffString(const Value: String): String;
var
i: Integer;
begin
Result := '';
for i := 1 to Length(Value) do
begin
if (Value[i] = '''') then
Result := Result + ''''''
else
Result := Result + Value[i];
end;
end;
constructor TLexEnclosedBy.Create;
begin
inherited Create;
TokenName := '';
ProcName := '';
StartsWith := '';
EndsWith := '';
MultiLine := False;
end;
constructor TLexDefaultAttri.Create;
begin
inherited Create;
Style := '';
Foreground := '';
Background := '';
end;
procedure TFrmMain.MakeSensitiveHashTable;
var
I: Char;
begin
for I := #0 to #255 do
begin
case I in ['_', 'A'..'Z', 'a'..'z'] of
True:
begin
if (I > #64) and (I < #91) then mSKeyHashTable[I] := Ord(I) - 64 else
if (I > #96) then mSKeyHashTable[I] := Ord(I) - 95;
end;
else mSKeyHashTable[I] := 0;
end;
end;
end;
procedure TFrmMain.MakeHashTable;
var
I, J: Char;
begin
for I := #0 to #255 do
begin
J := UpperCase(I)[1];
Case I in ['_', 'A'..'Z', 'a'..'z'] of
True: mKeyHashTable[I] := Ord(J) - 64;
else
mKeyHashTable[I] := 0;
end;
end;
end;
function TFrmMain.SensKeyHash(ToHash: String): Integer;
var
I: Integer;
begin
Result := 0;
for I := 1 to Length(ToHash) do
inc(Result, mSKeyHashTable[ToHash[I]]);
end;
function TFrmMain.KeyHash(ToHash: String): Integer;
var
I: Integer;
begin
Result := 0;
for I := 1 to Length(ToHash) do
inc(Result, mKeyHashTable[ToHash[I]]);
end;
procedure TFrmMain.WriteSettings;
begin
with TRegIniFile.Create(IniFile) do
try
WriteString('General', 'OpenDir', OpenDialog.InitialDir);
WriteBool(FFileName, 'GetKeyWords', ChkGetKeyWords.Checked);
WriteBool(FFileName, 'ChkGPLHeader', ChkGPLHeader.Checked);
WriteString(FFileName, 'Author', EditAuthor.Text);
WriteString(FFileName, 'Description', EditDescription.Text);
WriteString(FFileName, 'Version', EditVersion.Text);
WriteString(FFileName, 'Filter', CboFilter.Text);
WriteString(FFileName, 'Language', CboLangName.Text);
WriteString(FFileName, 'AttrIdentifier', CboAttrIdentifier.Text);
WriteString(FFileName, 'AttrReservedWord', CboAttrReservedWord.Text);
WriteString(FFileName, 'UnknownTokenAttr', CboUnknownTokenAttr.Text);
WriteString(FFileName, 'Fields', ListBoxFields.Items.CommaText);
finally
Free;
end;
end;
function TFrmMain.PerformFileOpen: Boolean;
var
UserName: PChar;
{$IFDEF SYN_COMPILER_5_UP}
Count: Cardinal;
{$ELSE}
Count: Integer;
{$ENDIF}
begin
if OpenDialog.Execute then
begin
Count := 0;
Result := True;
FFileName := ExtractFileName(OpenDialog.FileName);
Caption := 'SynEdit Highlighter Generator - ' + FFileName;
OpenDialog.InitialDir := ExtractFilePath(OpenDialog.FileName);
GetUserName(nil, Count); // retrieve the required size of the user name buffer
UserName := StrAlloc(Count); // allocate memory for the user name
GetUserName(UserName, Count); // retrieve the user name
with TRegIniFile.Create(IniFile) do
try
EditAuthor.Text := ReadString(FFileName, 'Author', StrPas(UserName));
EditDescription.Text := ReadString(FFileName, 'Description', 'Syntax Parser/Highlighter');
EditVersion.Text := ReadString(FFileName, 'Version', '0.1');
CboFilter.Text := ReadString(FFileName, 'Filter', 'All files (*.*)|*.*');
CboLangName.Text := ReadString(FFileName, 'Language', '');
ChkGetKeyWords.Checked := ReadBool(FFileName, 'GetKeyWords', True);
ChkGPLHeader.Checked := ReadBool(FFileName, 'ChkGPLHeader', True);
CboAttrIdentifier.ItemIndex := CboAttrIdentifier.Items.IndexOf
(ReadString(FFileName, 'AttrIdentifier', 'SYNS_AttrIdentifier'));
CboAttrReservedWord.ItemIndex := CboAttrReservedWord.Items.IndexOf
(ReadString(FFileName, 'AttrReservedWord', 'SYNS_AttrReservedWord'));
CboUnknownTokenAttr.ItemIndex := CboUnknownTokenAttr.Items.IndexOf
(ReadString(FFileName, 'UnknownTokenAttr', 'Identifier'));
ListBoxFields.Items.CommaText := ReadString(FFileName, 'Fields', '');
finally
Free;
end;
StrDispose(UserName);
CboLangNameChange(Self);
end
else
Result := False;
end;
procedure TFrmMain.FormCreate(Sender: TObject);
var i: Integer;
begin
for i := FrmMain.ComponentCount - 1 downto 0 do
if FrmMain.Components[i] is TComboBox then
if TComboBox(FrmMain.Components[i]).Parent = GrpAttrNames then
begin
TComboBox(FrmMain.Components[i]).Items.Clear;
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrAsm');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrAsmComment');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrAsmKey');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrASP');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrAssembler');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrBlock');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrBrackets');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrCharacter');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrClass');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrComment');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrCondition');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrDir');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrDirective');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrDocumentation');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrEmbedSQL');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrEmbedText');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrEscapeAmpersand');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrForm');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrFunction');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrIcon');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrIdentifier');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrIllegalChar');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrIndirect');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrInvalidSymbol');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrInternalFunction');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrKey');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrLabel');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrMacro');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrMarker');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrMessage');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrMiscellaneous');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrNull');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrNumber');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrOperator');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrPragma');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrPreprocessor');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrQualifier');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrRegister');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrReservedWord');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrRpl');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrRplKey');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrRplComment');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrSASM');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrSASMComment');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrSASMKey');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrSecondReservedWord');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrSection');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrSpace');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrSpecialVariable');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrString');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrSymbol');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrSyntaxError');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrSystem');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrSystemValue');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrText');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrUnknownWord');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrUser');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrUserFunction');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrValue');
TComboBox(FrmMain.Components[i]).Items.Add('SYNS_AttrVariable');
end;
PageControl.ActivePage := PageControl.Pages[0];
Stream := TMemoryStream.Create;
Lex := TGenLex.Create;
KeyList := TList.Create;
SetList := TList.Create;
EnclosedList := TList.Create;
SampleSourceList := TStringList.Create;
IdentList := TStringList.Create;
// read ini file
IniFile := Copy(ExtractFileName(Application.ExeName), 0,
Length(ExtractFileName(Application.ExeName)) -
Length(ExtractFileExt(Application.ExeName))) + '.ini';
with TRegIniFile.Create(IniFile) do
try
OpenDialog.InitialDir := ReadString('General', 'OpenDir',
ExtractFilePath(Application.ExeName));
finally
Free;
end;
if PerformFileOpen then
begin
MakeHashTable;
MakeSensitiveHashTable;
end
else
Halt;
end;
procedure TFrmMain.ClearAll;
var
I: Integer;
begin
// Clear the contents of KeyList
for I := 0 to (KeyList.Count - 1) do
TObject(KeyList[I]).Free;
KeyList.Clear;
// Clear the contents of SetList
for I := 0 to (SetList.Count - 1) do
TObject(SetList[I]).Free;
SetList.Clear;
// Clear the contents of EnclosedList
for I := 0 to (EnclosedList.Count - 1) do
TObject(EnclosedList[I]).Free;
EnclosedList.Clear;
// Clear the contents of IdentList
for I := 0 to (IdentList.Count - 1) do
begin
if Assigned(IdentList.Objects[I]) then
TObject(IdentList.Objects[I]).Free;
end;
IdentList.Clear;
// Clear the contents of SampleSourceList
SampleSourceList.Clear;
end;
procedure TFrmMain.FormDestroy(Sender: TObject);
begin
ClearAll;
Lex.Free;
Stream.Free;
IdentList.Free;
KeyList.Free;
SetList.Free;
EnclosedList.Free;
end;
procedure TFrmMain.BtnStartClick(Sender: TObject);
begin
ClearAll;
Screen.Cursor := crHourGlass;
Stream.Clear;
Stream.LoadFromFile(OpenDialog.FileName);
Lex.Origin := Stream.Memory;
Lex.Tokenize;
while Lex.RunId <> IDIdentifier do Lex.Next;
LexName := Lex.RunToken;
Lex.Next;
while Lex.RunId <> IDIdentifier do Lex.Next;
IdentPre := Lex.RunToken;
OutFileCreate(OpenDialog.FileName);
try
while not (Lex.RunId in [IdSensitive, IdIdentStart]) do
Lex.Next;
if Lex.RunId = IdSensitive then
Sensitivity := True
else
Sensitivity := False;
Lex.Next;
while Lex.RunId <> IDCharSet do Lex.Next;
IdentContent := Lex.RunToken;
Lex.Next;
while Lex.RunId <> IDNull do
begin
case Lex.RunId of
IDCharSet : IdentStart := Lex.RunToken;
IDKeys : FillKeyList;
IDTokenTypes : FillTokenTypeList;
IDChars : ParseCharSets;
IDEnclosedBy : ParseEnclosedBy;
IDSampleSource : ParseSampleSource;
end;
Lex.Next;
end;
if (KeyList.Count = 0) then
raise Exception.Create('You should specify at least 1 keyword!');
if (IdentList.Count = 0) then
raise Exception.Create('You should specify at least 1 token type');
WriteRest;
while (Lex.RunId <> IdNull) do
begin
Lex.Next;
end;
finally
Screen.Cursor := crDefault;
CloseFile(OutFile);
end;
MessageDlg(LexName + ' created on ' + DateTimeToStr(Now), mtInformation, [mbOk], 0);
end;
procedure TFrmMain.FillKeyList;
var
aLexKey: TLexKeys;
aString: String;
aTokenType: String;
begin
Lex.Next;
aTokenType := '';
while Lex.RunId <> IdCRLF do
begin
if not (Lex.RunId in [IdSpace, IdBraceOpen]) then
aTokenType := aTokenType + Lex.RunToken;
Lex.Next;
end;
if (aTokenType = '') then
aTokenType := 'Key';
while Lex.RunId <> IdStop do
begin
while Lex.RunId in [IdSpace, IdBraceOpen, IdCRLF] do Lex.Next;
if Lex.RunId <> IdStop then
begin
aString:= '';
while not (Lex.RunId in [IdSpace, IdBraceOpen, IdCRLF]) do
begin
aString:= aString + Lex.RunToken;
Lex.Next;
end;
aLexKey := TLexKeys.Create;
aLexKey.TokenType := aTokenType;
aLexKey.KeyName := aString;
if Sensitivity then
aLexKey.Key := SensKeyHash(aLexKey.KeyName)
else
aLexKey.Key := KeyHash(aLexKey.KeyName);
KeyList.Add(aLexKey);
end
else
Break;
Lex.Next;
end;
KeyList.Sort(CompareKeys);
end;
procedure TFrmMain.FillTokenTypeList;
var
i: Integer;
List: TStringList;
sIdent: String;
sLine: String;
DefAttri: TLexDefaultAttri;
begin
Lex.Next;
IdentList.Add(IdentPre + 'Unknown');
IdentList.Add(IdentPre + 'Null');
while (Lex.RunId <> IdStop) do
begin
while Lex.RunId in [IdSpace, IdBraceOpen, IdCRLF, IDUnknown] do
Lex.Next;
if (Lex.RunId <> IdStop) then
begin
sIdent := IdentPre + Lex.RunToken;
if not IsValidIdent(sIdent) then
raise Exception.Create('Invalid identifier for token type: ' + sIdent);
if (IdentList.IndexOf(sIdent) < 0) then
IdentList.Add(sIdent);
Lex.Next;
sLine := '';
while (Lex.RunId = IdSpace) do
Lex.Next;
while not (Lex.RunId in [IdStop, IdCRLF]) do
begin { is there more data on this line? }
sLine := sLine + Lex.RunToken;
Lex.Next;
end;
if (sLine <> '') then { The Msg file specifies default attributes }
begin
List := TStringList.Create;
try
while (sLine <> '') do
begin
i := Pos('|', sLine);
if (i > 0) then
begin
List.Add(Copy(sLine, 1, i - 1));
Delete(sLine, 1, i);
end
else
begin
List.Add(sLine);
sLine := '';
end;
end;
i := IdentList.IndexOf(sIdent);
if (i >= 0) then
begin
DefAttri := TLexDefaultAttri.Create;
DefAttri.Style := List.Values['Style'];
DefAttri.Foreground := List.Values['Foreground'];
DefAttri.Background := List.Values['Background'];
IdentList.Objects[i] := DefAttri;
end;
finally
List.Free;
end;
end;
end
else
Break;
end;
end;
procedure TFrmMain.OutFileCreate(InName: String);
var
OutName, UName: String;
sysTime: TSystemTime;
ISODate: string;
begin
OutName := ExtractFileName(InName);
Delete(OutName, Length(OutName) - 3, 4);
Uname := OutName;
OutName := OutName + '.pas';
AssignFile(OutFile, OutName);
rewrite(OutFile);
GetSystemTime(sysTime);
ISODate := Format('%.4d-%.2d-%.2d', [sysTime.wYear, sysTime.wMonth, sysTime.wDay]);
if ChkGPLHeader.Checked then
begin
Writeln(OutFile, '{-------------------------------------------------------------------------------');
Writeln(OutFile, 'The contents of this file are subject to the Mozilla Public License');
Writeln(OutFile, 'Version 1.1 (the "License"); you may not use this file except in compliance');
Writeln(OutFile, 'with the License. You may obtain a copy of the License at');
Writeln(OutFile, 'http://www.mozilla.org/MPL/');
Writeln(OutFile);
Writeln(OutFile, 'Software distributed under the License is distributed on an "AS IS" basis,');
Writeln(OutFile, 'WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for');
Writeln(OutFile, 'the specific language governing rights and limitations under the License.');
Writeln(OutFile);
Writeln(OutFile, 'Code template generated with SynGen.');
Writeln(OutFile, 'The original code is: ' + OutName + ', released ' + ISODate + '.');
Writeln(OutFile, 'Description: ' + EditDescription.Text);
Writeln(OutFile, 'The initial author of this file is ' + EditAuthor.Text + '.');
Writeln(OutFile, 'Copyright (c) ' + Format('%d', [sysTime.wYear]) + ', all rights reserved.');
Writeln(OutFile);
Writeln(OutFile, 'Contributors to the SynEdit and mwEdit projects are listed in the');
Writeln(OutFile, 'Contributors.txt file.');
Writeln(OutFile);
Writeln(OutFile, 'Alternatively, the contents of this file may be used under the terms of the');
Writeln(OutFile, 'GNU General Public License Version 2 or later (the "GPL"), in which case');
Writeln(OutFile, 'the provisions of the GPL are applicable instead of those above.');
Writeln(OutFile, 'If you wish to allow use of your version of this file only under the terms');
Writeln(OutFile, 'of the GPL and not to allow others to use your version of this file');
Writeln(OutFile, 'under the MPL, indicate your decision by deleting the provisions above and');
Writeln(OutFile, 'replace them with the notice and other provisions required by the GPL.');
Writeln(OutFile, 'If you do not delete the provisions above, a recipient may use your version');
Writeln(OutFile, 'of this file under either the MPL or the GPL.');
Writeln(OutFile);
Writeln(OutFile, '$' + 'Id: ' + '$');
Writeln(OutFile);
Writeln(OutFile, 'You may retrieve the latest version of this file at the SynEdit home page,');
Writeln(OutFile, 'located at http://SynEdit.SourceForge.net');
Writeln(OutFile);
Writeln(OutFile, '-------------------------------------------------------------------------------}');
end
else
begin
Writeln(OutFile, '{+-----------------------------------------------------------------------------+');
Writeln(OutFile, ' | Class: ' + LexName);
Writeln(OutFile, ' | Created: ' + ISODate);
Writeln(OutFile, ' | Last change: ' + ISODate);
Writeln(OutFile, ' | Author: ' + EditAuthor.Text);
Writeln(OutFile, ' | Description: ' + EditDescription.Text);
Writeln(OutFile, ' | Version: ' + EditVersion.Text);
Writeln(OutFile, ' |');
Writeln(OutFile, ' | Copyright (c) ' + Format('%d', [sysTime.wYear]) + #32 +
EditAuthor.Text + '. All rights reserved.');
Writeln(OutFile, ' |');
Writeln(OutFile, ' | Generated with SynGen.');
Writeln(OutFile, ' +----------------------------------------------------------------------------+}');
end;
Writeln(OutFile);
Writeln(OutFile, 'unit ' + Uname + ';');
Writeln(OutFile);
Writeln(OutFile, '{$I SynEdit.inc}');
Writeln(OutFile);
Writeln(OutFile, 'interface');
Writeln(OutFile);
Writeln(OutFile, 'uses');
Writeln(OutFile, '{$IFDEF SYN_CLX}');
Writeln(OutFile, ' QGraphics,');
Writeln(OutFile, ' QSynEditTypes,');
Writeln(OutFile, ' QSynEditHighlighter,');
Writeln(OutFile, '{$ELSE}');
Writeln(OutFile, ' Graphics,');
Writeln(OutFile, ' SynEditTypes,');
Writeln(OutFile, ' SynEditHighlighter,');
Writeln(OutFile, '{$ENDIF}');
Writeln(OutFile, ' SysUtils,');
Writeln(OutFile, ' Classes;');
Writeln(OutFile);
Writeln(OutFile, 'type');
Writeln(OutFile, ' T' + IdentPre + 'TokenKind = (');
end;
procedure TFrmMain.ParseCharsets;
begin
Lex.Next;
while Lex.RunId <> IdStop do
begin
case Lex.RunId of
IdCharset: RetrieveCharset;
else
Lex.Next;
end;
end;
end;
procedure TFrmMain.ParseEnclosedBy;
begin
Lex.Next;
while not (Lex.RunId in [IdStop, IdNull]) do
RetrieveEnclosedBy;
end;
procedure TFrmMain.ParseSampleSource;
begin
Lex.Next;
if (Lex.RunId = IdCRLF) then
Lex.Next;
while not (Lex.RunId in [IdStop, IdNull]) do
RetrieveSampleSource;
end;
procedure TFrmMain.RetrieveCharset;
var
aSet: TLexCharsets;
begin
aSet := TLexCharsets.Create;
aSet.Charset := Lex.RunToken;
while Lex.RunId <> IDIdentifier do Lex.Next;
aSet.SetName := Lex.RunToken;
while Lex.RunId <> IDBeginProc do Lex.Next;
Lex.Next;
while Lex.RunId in [IdCRLF, IdSpace]do Lex.Next;
while not(Lex.RunId = IdEndProc) do
begin
aSet.ProcData:=aSet.ProcData+Lex.RunToken;
Lex.Next;
end;
SetList.Add(aSet);
Lex.Next;
end;
procedure TFrmMain.RetrieveSampleSource;
var
sLine: String;
begin
sLine := '';
while not (Lex.RunId in [IdCRLF, IdNull, IdStop]) do
begin
sLine := sLine + Lex.RunToken;
Lex.Next;
end;
if (Lex.RunId = IdCRLF) then
Lex.Next;
SampleSourceList.Add(sLine);
end;
procedure TFrmMain.RetrieveEnclosedBy;
var
aThing: TLexEnclosedBy;
sLine: String;
iPos: Integer;
begin
while Lex.RunId in [IdCRLF, IdSpace] do Lex.Next;
sLine := '';
while not (Lex.RunId in [IdCRLF, IdNull, IdStop]) do
begin
sLine := sLine + Lex.RunToken;
Lex.Next;
end;
if (sLine <> '') then
begin
aThing := TLexEnclosedBy.Create;
iPos := Pos(',', sLine);
aThing.TokenName := Copy(sLine, 1, iPos - 1);
Delete(sLine, 1, iPos);
iPos := Pos(',', sLine);
aThing.ProcName := Copy(sLine, 1, iPos - 1);
Delete(sLine, 1, iPos);
iPos := Pos(',', sLine);
aThing.StartsWith := Copy(sLine, 1, iPos - 1);
Delete(sLine, 1, iPos);
iPos := Pos(',', sLine);
if (iPos > 0) then
begin
aThing.EndsWith := Copy(sLine, 1, iPos - 1);
Delete(sLine, 1, iPos);
if (Pos('MULTILINE', UpperCase(sLine)) = 1) then
aThing.MultiLine := True;
end
else
aThing.EndsWith := sLine;
EnclosedList.Add(aThing);
end
else if (Lex.RunId <> IdStop) then
Lex.Next;
end; { RetrieveEnclosedBy }
function TFrmMain.FilterInvalidChars(const Value: String): String;
var
i: Integer;
begin
Result := '';
for i := 1 to Length(Value) do
begin
if IsValidIdent(Result + Value[i]) then
Result := Result + Value[i];
end;
end; { FilterInvalidChars }
function TFrmMain.GetFilterName: String;
var
FilterName: String;
begin
FilterName := '';
case CboFilter.ItemIndex of
-1: FilterName := 'SYNS_Filter' + FilterInvalidChars(CboLangName.Text);
0 : FilterName := 'SYNS_FilterPascal';
1 : FilterName := 'SYNS_FilterHP48';
2 : FilterName := 'SYNS_FilterCAClipper';
3 : FilterName := 'SYNS_FilterCPP';
4 : FilterName := 'SYNS_FilterJava';
5 : FilterName := 'SYNS_FilterPerl';
6 : FilterName := 'SYNS_FilterAWK';
7 : FilterName := 'SYNS_FilterHTML';
8 : FilterName := 'SYNS_FilterVBScript';
9 : FilterName := 'SYNS_FilterGalaxy';
10: FilterName := 'SYNS_FilterPython';
11: FilterName := 'SYNS_FilterSQL';
12: FilterName := 'SYNS_FilterTclTk';
13: FilterName := 'SYNS_FilterRTF';
14: FilterName := 'SYNS_FilterBatch';
15: FilterName := 'SYNS_FilterDFM';
16: FilterName := 'SYNS_FilterX86Asm';
17: FilterName := 'SYNS_FilterGembase';
18: FilterName := 'SYNS_FilterINI';
19: FilterName := 'SYNS_FilterML';
20: FilterName := 'SYNS_FilterVisualBASIC';
21: FilterName := 'SYNS_FilterADSP21xx';
22: FilterName := 'SYNS_FilterPHP';
23: FilterName := 'SYNS_FilterCache';
24: FilterName := 'SYNS_FilterCSS';
25: FilterName := 'SYNS_FilterJScript';
26: FilterName := 'SYNS_FilterKIX';
27: FilterName := 'SYNS_FilterBaan';
28: FilterName := 'SYNS_FilterFoxpro';
29: FilterName := 'SYNS_FilterFortran';
30: FilterName := 'SYNS_FilterAsm68HC11';
end;
Result := FilterName;
end;
function TFrmMain.GetLangName: String;
var
LangName: String;
begin
case CboLangName.ItemIndex of
-1: LangName := 'SYNS_Lang' + FilterInvalidChars(CboLangName.Text);
0 : LangName := 'SYNS_LangHP48';
1 : LangName := 'SYNS_LangCAClipper';
2 : LangName := 'SYNS_LangCPP';
3 : LangName := 'SYNS_LangJava';
4 : LangName := 'SYNS_LangPerl';
5 : LangName := 'SYNS_LangBatch';
6 : LangName := 'SYNS_LangDfm';
7 : LangName := 'SYNS_LangAWK';
8 : LangName := 'SYNS_LangHTML';
9 : LangName := 'SYNS_LangVBSScript';
10 : LangName := 'SYNS_LangGalaxy';
11 : LangName := 'SYNS_LangGeneral';
12 : LangName := 'SYNS_LangPascal';
13 : LangName := 'SYNS_LangX86Asm';
14 : LangName := 'SYNS_LangPython';
15 : LangName := 'SYNS_LangTclTk';
16 : LangName := 'SYNS_LangSQL';
17 : LangName := 'SYNS_LangGembase';
18 : LangName := 'SYNS_LangINI';
19 : LangName := 'SYNS_LangML';
20 : LangName := 'SYNS_LangVisualBASIC';
21 : LangName := 'SYNS_LangADSP21xx';
22 : LangName := 'SYNS_LangPHP';
23 : LangName := 'SYNS_LangSybaseSQL';
24 : LangName := 'SYNS_LangGeneralMulti';
25 : LangName := 'SYNS_LangCache';
26 : LangName := 'SYNS_LangCSS';
27 : LangName := 'SYNS_LangJScript';
28 : LangName := 'SYNS_LangKIX';
29 : LangName := 'SYNS_LangBaan';
30 : LangName := 'SYNS_LangFoxpro';
31 : LangName := 'SYNS_LangFortran';
32 : LangName := 'SYNS_Lang68HC11';
end;
Result := LangName;
end;
procedure TFrmMain.WriteRest;
var
I, J: Integer;
LineLength: Integer;
KeyString: String;
NameString: String;
AttrName: String;
AttrTemp: String;
TempStringList: TStringList;
sPrefix: String;
DefAttri: TLexDefaultAttri;
begin
IdentList.Sort;
SetList.Sort(CompareSets);
I := 0;
while I < IdentList.Count - 1 do
begin
Writeln(OutFile, ' ' + IdentList[I] + ',');
inc(I);
end;
Writeln(OutFile, ' ' + IdentList[I] + ');');
Writeln(OutFile);
Write(OutFile, ' TRangeState = (rsUnKnown');
for I := 0 to (EnclosedList.Count - 1) do
Write(OutFile, ', rs' + TLexEnclosedBy(EnclosedList[I]).ProcName);
Writeln(OutFile, ');');
Writeln(OutFile);
Writeln(OutFile, ' TProcTableProc = procedure of object;');
Writeln(OutFile);
Writeln(OutFile, ' PIdentFuncTableFunc = ^TIdentFuncTableFunc;');
Writeln(OutFile, ' TIdentFuncTableFunc = function: T' + IdentPre + 'TokenKind of object;');
Writeln(OutFile);
KeyString := IntToStr(TLexKeys(KeyList[KeyList.Count - 1]).Key);
Writeln(OutFile, 'const');
Writeln(OutFile, ' MaxKey = ' + KeyString + ';');
Writeln(OutFile);
Writeln(OutFile, 'type');
Writeln(OutFile, ' ' + LexName + ' = class(TSynCustomHighlighter)');
Writeln(OutFile, ' private');
Writeln(OutFile, ' fLineRef: string;');
Writeln(OutFile, ' fLine: PChar;');
Writeln(OutFile, ' fLineNumber: Integer;');
Writeln(OutFile, ' fProcTable: array[#0..#255] of TProcTableProc;');
Writeln(OutFile, ' fRange: TRangeState;');
Writeln(OutFile, ' Run: LongInt;');
if ListBoxFields.Items.Count > 0 then
for i := 0 to ListBoxFields.Items.Count - 1 do
Writeln(OutFile, ' ' + ListBoxFields.Items[i] + ';');
Writeln(OutFile, ' fStringLen: Integer;');
Writeln(OutFile, ' fToIdent: PChar;');
Writeln(OutFile, ' fTokenPos: Integer;');
Writeln(OutFile, ' fTokenID: TtkTokenKind;');
Writeln(OutFile, ' fIdentFuncTable: array[0 .. MaxKey] of TIdentFuncTableFunc;');
I := 0;
while I < IdentList.Count do
begin
if (IdentList[I] <> IdentPre + 'Null') and (IdentList[I] <> IdentPre + 'Unknown') then
Writeln(OutFile, ' f' + Copy(IdentList[I], Length(IdentPre) + 1, Length(IdentList[I])) + 'Attri: TSynHighlighterAttributes;');
inc(I);
end;
Writeln(OutFile, ' function KeyHash(ToHash: PChar): Integer;');
Writeln(OutFile, ' function KeyComp(const aKey: string): Boolean;');
I := 0;
while I < KeyList.Count do
begin
if I = 0 then
Writeln(OutFile, ' function Func' + IntToStr(TLexKeys(KeyList[I]).Key) + ': T' + IdentPre + 'TokenKind;') else
if (TLexKeys(KeyList[I - 1]).Key <> TLexKeys(KeyList[I]).Key) then
Writeln(OutFile, ' function Func' + IntToStr(TLexKeys(KeyList[I]).Key) + ': T' + IdentPre + 'TokenKind;');
inc(I);
end;
I := 0;
while I < SetList.Count do
begin
Writeln(OutFile, ' procedure ' + TLexCharsets(SetList[I]).SetName + 'Proc;');
inc(I);
end;
Writeln(OutFile, ' procedure UnknownProc;');
Writeln(OutFile, ' function AltFunc: T' + IdentPre + 'TokenKind;');
Writeln(OutFile, ' procedure InitIdent;');
Writeln(OutFile, ' function IdentKind(MayBe: PChar): T' + IdentPre + 'TokenKind;');
Writeln(OutFile, ' procedure MakeMethodTables;');
Writeln(OutFile, ' procedure NullProc;');
if (IdentList.IndexOf(IdentPre + 'Space') >= 0) then
Writeln(OutFile, ' procedure SpaceProc;');
Writeln(OutFile, ' procedure CRProc;');
Writeln(OutFile, ' procedure LFProc;');
for I := 0 to (EnclosedList.Count - 1) do
begin
Writeln(OutFile, ' procedure ' + TLexEnclosedBy(EnclosedList[I]).ProcName + 'OpenProc;');
Writeln(OutFile, ' procedure ' + TLexEnclosedBy(EnclosedList[I]).ProcName + 'Proc;');
end;
Writeln(OutFile, ' protected');
Writeln(OutFile, ' function GetIdentChars: TSynIdentChars; override;');
Writeln(OutFile, ' function GetSampleSource: string; override;');
Writeln(OutFile, ' function IsFilterStored: Boolean; override;');
Writeln(OutFile, ' public');
Writeln(OutFile, ' constructor Create(AOwner: TComponent); override;');
Writeln(OutFile, ' {$IFNDEF SYN_CPPB_1} class {$ENDIF}');
Writeln(OutFile, ' function GetLanguageName: string; override;');
Writeln(OutFile, ' function GetRange: Pointer; override;');
Writeln(OutFile, ' procedure ResetRange; override;');
Writeln(OutFile, ' procedure SetRange(Value: Pointer); override;');
Writeln(OutFile, ' function GetDefaultAttribute(Index: integer): TSynHighlighterAttributes; override;');
Writeln(OutFile, ' function GetEol: Boolean; override;');
if ChkGetKeyWords.Checked then
Writeln(OutFile, ' function GetKeyWords: string;');
Writeln(OutFile, ' function GetTokenID: TtkTokenKind;');
Writeln(OutFile, ' procedure SetLine(NewValue: String; LineNumber: Integer); override;');
Writeln(OutFile, ' function GetToken: String; override;');
Writeln(OutFile, ' function GetTokenAttribute: TSynHighlighterAttributes; override;');
Writeln(OutFile, ' function GetTokenKind: integer; override;');
Writeln(OutFile, ' function GetTokenPos: Integer; override;');
Writeln(OutFile, ' procedure Next; override;');
Writeln(OutFile, ' published');
I := 0;
while I < IdentList.Count do
begin
if (IdentList[I] <> IdentPre + 'Null') and (IdentList[I] <> IdentPre + 'Unknown') then
Writeln(OutFile, ' property ' + Copy(IdentList[I], Length(IdentPre) + 1, Length(IdentList[I]))
+ 'Attri: TSynHighlighterAttributes read f' + Copy(IdentList[I], Length(IdentPre) + 1, Length(IdentList[I])) +
'Attri write f' + Copy(IdentList[I], Length(IdentPre) + 1, Length(IdentList[I]))+ 'Attri;');
inc(I);
end;
Writeln(OutFile, ' end;');
Writeln(OutFile);
Writeln(OutFile, 'implementation');
Writeln(OutFile);
Writeln(OutFile, 'uses');
Writeln(OutFile, '{$IFDEF SYN_CLX}');
Writeln(OutFile, ' QSynEditStrConst;');
Writeln(OutFile, '{$ELSE}');
Writeln(OutFile, ' SynEditStrConst;');
Writeln(OutFile, '{$ENDIF}');
Writeln(OutFile);
if (CboFilter.ItemIndex = -1) or (CboLangName.ItemIndex = -1) then
begin
Writeln(OutFile, '{$IFDEF SYN_COMPILER_3_UP}');
Writeln(OutFile, 'resourcestring');
Writeln(OutFile, '{$ELSE}');
Writeln(OutFile, 'const');
Writeln(OutFile, '{$ENDIF}');
if (CboFilter.ItemIndex = -1) then
Writeln(OutFile, ' SYNS_Filter' + FilterInvalidChars(CboLangName.Text) + ' = ''' + CboFilter.Text + ''';');
if (CboLangName.ItemIndex = -1) then
Writeln(OutFile, ' SYNS_Lang' + FilterInvalidChars(CboLangName.Text) + ' = ''' + CboLangName.Text + ''';');
I := 0;
while I < IdentList.Count do
begin
AttrTemp := Copy(IdentList[I], Length(IdentPre) + 1, Length(IdentList[I]));
if (CboAttrIdentifier.Items.IndexOf('SYNS_Attr' + AttrTemp) < 0) and (AttrTemp <> 'Unknown') then
Writeln(OutFile, ' SYNS_Attr' + FilterInvalidChars(AttrTemp) + ' = ''' + AttrTemp + ''';');
Inc(i);
end;
Writeln(OutFile);
end;
Writeln(OutFile, 'var');
Writeln(OutFile, ' Identifiers: array[#0..#255] of ByteBool;');
Writeln(OutFile, ' mHashTable : array[#0..#255] of Integer;'#13#10);
if Sensitivity then
begin
Writeln(OutFile, 'procedure MakeIdentTable;');
Writeln(OutFile, 'var');
Writeln(OutFile, ' I: Char;');
Writeln(OutFile, 'begin');
Writeln(OutFile, ' for I := #0 to #255 do');
Writeln(OutFile, ' begin');
Writeln(OutFile, ' case I of');
Writeln(OutFile, ' ' + IdentContent + ': Identifiers[I] := True;');
Writeln(OutFile, ' else');
Writeln(OutFile, ' Identifiers[I] := False;');
Writeln(OutFile, ' end;');
Writeln(OutFile, ' case I in [''_'', ''A''..''Z'', ''a''..''z''] of');
Writeln(OutFile, ' True:');
Writeln(OutFile, ' begin');
Writeln(OutFile, ' if (I > #64) and (I < #91) then');
Writeln(OutFile, ' mHashTable[I] := Ord(I) - 64');
Writeln(OutFile, ' else if (I > #96) then');
Writeln(OutFile, ' mHashTable[I] := Ord(I) - 95;');
Writeln(OutFile, ' end;');
Writeln(OutFile, ' else');
Writeln(OutFile, ' mHashTable[I] := 0;');
Writeln(OutFile, ' end;');
Writeln(OutFile, ' end;');
Writeln(OutFile, 'end;');
Writeln(OutFile);
end
else
begin
Writeln(OutFile, 'procedure MakeIdentTable;');
Writeln(OutFile, 'var');
Writeln(OutFile, ' I, J: Char;');
Writeln(OutFile, 'begin');
Writeln(OutFile, ' for I := #0 to #255 do');
Writeln(OutFile, ' begin');
Writeln(OutFile, ' case I of');
Writeln(OutFile, ' ' + IdentContent + ': Identifiers[I] := True;');
Writeln(OutFile, ' else');
Writeln(OutFile, ' Identifiers[I] := False;');
Writeln(OutFile, ' end;');
Writeln(OutFile, ' J := UpCase(I);');
Writeln(OutFile, ' case I in [''_'', ''A''..''Z'', ''a''..''z''] of');
Writeln(OutFile, ' True: mHashTable[I] := Ord(J) - 64');
Writeln(OutFile, ' else');
Writeln(OutFile, ' mHashTable[I] := 0;');
Writeln(OutFile, ' end;');
Writeln(OutFile, ' end;');
Writeln(OutFile, 'end;');
Writeln(OutFile);
end;
Writeln(OutFile, 'procedure ' + LexName + '.InitIdent;');
Writeln(OutFile, 'var');
Writeln(OutFile, ' I: Integer;');
Writeln(OutFile, ' pF: PIdentFuncTableFunc;');
Writeln(OutFile, 'begin');
Writeln(OutFile, ' pF := PIdentFuncTableFunc(@fIdentFuncTable);');
Writeln(OutFile, ' for I := Low(fIdentFuncTable) to High(fIdentFuncTable) do');
Writeln(OutFile, ' begin');
Writeln(OutFile, ' pF^ := AltFunc;');
Writeln(OutFile, ' Inc(pF);');
Writeln(OutFile, ' end;');
I := 0;
while I < KeyList.Count do
begin
if I < KeyList.Count - 1 then
while TLexKeys(KeyList[I]).Key = TLexKeys(KeyList[I + 1]).Key do
begin
inc(I);
if I >= KeyList.Count - 1 then break;
end;
KeyString := IntToStr(TLexKeys(KeyList[I]).Key);
Writeln(OutFile, ' fIdentFuncTable[' + KeyString + '] := Func' + KeyString + ';');
inc(I);
end;
Writeln(OutFile, 'end;');
Writeln(OutFile);
Writeln(OutFile, 'function ' + LexName + '.KeyHash(ToHash: PChar): Integer;');
Writeln(OutFile, 'begin');
Writeln(OutFile, ' Result := 0;');
Writeln(OutFile, ' while ToHash^ in [' + IdentContent + '] do');
Writeln(OutFile, ' begin');
Writeln(OutFile, ' inc(Result, mHashTable[ToHash^]);');
Writeln(OutFile, ' inc(ToHash);');
Writeln(OutFile, ' end;');
Writeln(OutFile, ' fStringLen := ToHash - fToIdent;');
Writeln(OutFile, 'end;');
Writeln(OutFile);
if Sensitivity then
begin
Writeln(OutFile, 'function ' + LexName + '.KeyComp(const aKey: String): Boolean;');
Writeln(OutFile, 'var');
Writeln(OutFile, ' I: Integer;');
Writeln(OutFile, ' Temp: PChar;');
Writeln(OutFile, 'begin');
Writeln(OutFile, ' Temp := fToIdent;');
Writeln(OutFile, ' if Length(aKey) = fStringLen then');
Writeln(OutFile, ' begin');
Writeln(OutFile, ' Result := True;');
Writeln(OutFile, ' for i := 1 to fStringLen do');
Writeln(OutFile, ' begin');
Writeln(OutFile, ' if Temp^ <> aKey[i] then');
Writeln(OutFile, ' begin');
Writeln(OutFile, ' Result := False;');
Writeln(OutFile, ' break;');
Writeln(OutFile, ' end;');
Writeln(OutFile, ' inc(Temp);');
Writeln(OutFile, ' end;');
Writeln(OutFile, ' end else Result := False;');
Writeln(OutFile, 'end;');
Writeln(OutFile);
end else
begin
Writeln(OutFile, 'function ' + LexName + '.KeyComp(const aKey: String): Boolean;');
Writeln(OutFile, 'var');
Writeln(OutFile, ' I: Integer;');
Writeln(OutFile, ' Temp: PChar;');
Writeln(OutFile, 'begin');
Writeln(OutFile, ' Temp := fToIdent;');
Writeln(OutFile, ' if Length(aKey) = fStringLen then');
Writeln(OutFile, ' begin');
Writeln(OutFile, ' Result := True;');
Writeln(OutFile, ' for i := 1 to fStringLen do');
Writeln(OutFile, ' begin');
Writeln(OutFile, ' if mHashTable[Temp^] <> mHashTable[aKey[i]] then');
Writeln(OutFile, ' begin');
Writeln(OutFile, ' Result := False;');
Writeln(OutFile, ' break;');
Writeln(OutFile, ' end;');
Writeln(OutFile, ' inc(Temp);');
Writeln(OutFile, ' end;');
Writeln(OutFile, ' end');
Writeln(OutFile, ' else');
Writeln(OutFile, ' Result := False;');
Writeln(OutFile, 'end;');
Writeln(OutFile);
end;
I := 0;
while I < KeyList.Count do
begin
KeyString := IntToStr(TLexKeys(KeyList[I]).Key);
Writeln(OutFile, 'function ' + LexName + '.Func' + KeyString + ': T' + IdentPre + 'TokenKind;');
Writeln(OutFile, 'begin');
KeyString := '';
if I < KeyList.Count - 1 then
while TLexKeys(KeyList[I]).Key = TLexKeys(KeyList[I + 1]).Key do
begin
NameString := TLexKeys(KeyList[I]).KeyName;
Writeln(OutFile, KeyString + ' if KeyComp(' + #39 + NameString + #39 + ') then Result := ' + IdentPre + TLexKeys(KeyList[I]).TokenType + ' else');
inc(I);
KeyString := KeyString + ' ';
if I >= KeyList.Count - 1 then break;
end;
NameString := TLexKeys(KeyList[I]).KeyName;
Writeln(OutFile, KeyString + ' if KeyComp(' + #39 + NameString + #39 + ') then Result := ' + IdentPre + TLexKeys(KeyList[I]).TokenType + ' else Result := ' + IdentPre + 'Identifier;');
Writeln(OutFile, 'end;');
Writeln(OutFile);
inc(I);
end;
Writeln(OutFile, 'function ' + LexName + '.AltFunc: T' + IdentPre + 'TokenKind;');
Writeln(OutFile, 'begin');
Writeln(OutFile, ' Result := ' + IdentPre + 'Identifier;');
Writeln(OutFile, 'end;');
Writeln(OutFile);
KeyString := IntToStr(TLexKeys(KeyList[KeyList.Count - 1]).Key + 1);
Writeln(OutFile, 'function ' + LexName + '.IdentKind(MayBe: PChar): T' + IdentPre + 'TokenKind;');
Writeln(OutFile, 'var');
Writeln(OutFile, ' HashKey: Integer;');
Writeln(OutFile, 'begin');
Writeln(OutFile, ' fToIdent := MayBe;');
Writeln(OutFile, ' HashKey := KeyHash(MayBe);');
Writeln(OutFile, ' if HashKey <= MaxKey then');
Writeln(OutFile, ' Result := fIdentFuncTable[HashKey]');
Writeln(OutFile, ' else');
Writeln(OutFile, ' Result := ' + IdentPre + 'Identifier;');
Writeln(OutFile, 'end;');
Writeln(OutFile);
Writeln(OutFile, 'procedure ' + LexName + '.MakeMethodTables;');
Writeln(OutFile, 'var');
Writeln(OutFile, ' I: Char;');
Writeln(OutFile, 'begin');
Writeln(OutFile, ' for I := #0 to #255 do');
Writeln(OutFile, ' case I of');
Writeln(OutFile, ' #0: fProcTable[I] := NullProc;');
Writeln(OutFile, ' #10: fProcTable[I] := LFProc;');
Writeln(OutFile, ' #13: fProcTable[I] := CRProc;');
for I := 0 to (EnclosedList.Count - 1) do
begin
if (TLexEnclosedBy(EnclosedList[I]).StartsWith <> '') then
begin
Writeln(OutFile, ' ''' +
StuffString(TLexEnclosedBy(EnclosedList[I]).StartsWith[1]) + ''': fProcTable[I] := ' +
TLexEnclosedBy(EnclosedList[I]).ProcName + 'OpenProc;');
end;
end;
if (IdentList.IndexOf(IdentPre + 'Space') >= 0) then
begin
Writeln(OutFile, ' #1..#9,');
Writeln(OutFile, ' #11,');
Writeln(OutFile, ' #12,');
Writeln(OutFile, ' #14..#32 : fProcTable[I] := SpaceProc;');
end;
I := 0;
while I < SetList.Count do
begin
Writeln(OutFile, ' ' + TLexCharsets(SetList[I]).Charset + ': fProcTable[I] := '+
TLexCharsets(SetList[I]).SetName + 'Proc;');
Inc(I);
end;
Writeln(OutFile, ' else');
Writeln(OutFile, ' fProcTable[I] := UnknownProc;');
Writeln(OutFile, ' end;');
Writeln(OutFile, 'end;');
Writeln(OutFile);
if (IdentList.IndexOf(IdentPre + 'Space') >= 0) then
begin
Writeln(OutFile, 'procedure ' + LexName + '.SpaceProc;');
Writeln(OutFile, 'begin');
Writeln(OutFile, ' fTokenID := ' + IdentPre + 'Space;');
Writeln(OutFile, ' repeat');
Writeln(OutFile, ' inc(Run);');
Writeln(OutFile, ' until not (fLine[Run] in [#1..#32]);');
Writeln(OutFile, 'end;');
Writeln(OutFile);
end;
Writeln(OutFile, 'procedure ' + LexName + '.NullProc;');
Writeln(OutFile, 'begin');
Writeln(OutFile, ' fTokenID := ' + IdentPre + 'Null;');
Writeln(OutFile, 'end;');
Writeln(OutFile);
Writeln(OutFile, 'procedure ' + LexName + '.CRProc;');
Writeln(OutFile, 'begin');
if (IdentList.IndexOf(IdentPre + 'Space') >= 0) then
Writeln(OutFile, ' fTokenID := ' + IdentPre + 'Space;')
else
Writeln(OutFile, ' fTokenID := ' + IdentPre + 'Unknown;');
Writeln(OutFile, ' inc(Run);');
Writeln(OutFile, ' if fLine[Run] = #10 then');
Writeln(OutFile, ' inc(Run);');
Writeln(OutFile, 'end;');
Writeln(OutFile);
Writeln(OutFile, 'procedure ' + LexName + '.LFProc;');
Writeln(OutFile, 'begin');
if (IdentList.IndexOf(IdentPre + 'Space') >= 0) then
Writeln(OutFile, ' fTokenID := ' + IdentPre + 'Space;')
else
Writeln(OutFile, ' fTokenID := ' + IdentPre + 'Unknown;');
Writeln(OutFile, ' inc(Run);');
Writeln(OutFile, 'end;');
Writeln(OutFile);
for I := 0 to (EnclosedList.Count - 1) do
begin
Writeln(OutFile, 'procedure ' + LexName + '.' + TLexEnclosedBy(EnclosedList[I]).ProcName + 'OpenProc;');
Writeln(OutFile, 'begin');
Writeln(OutFile, ' Inc(Run);');
if (Length(TLexEnclosedBy(EnclosedList[I]).StartsWith) > 1) then
begin
Write(OutFile, ' if ');
for J := 2 to Length(TLexEnclosedBy(EnclosedList[I]).StartsWith) do
begin
if (J > 2) then
begin
Writeln(OutFile, ' and');
Write(OutFile, ' ');
end;
Write(OutFile, '(fLine[Run' + AddInt(J - 2) + '] = ''' + StuffString(TLexEnclosedBy(EnclosedList[I]).StartsWith[J]) + ''')');
end;
Writeln(OutFile, ' then');
Writeln(OutFile, ' begin');
Writeln(OutFile, ' fRange := rs' + TLexEnclosedBy(EnclosedList[I]).ProcName + ';');
Writeln(OutFile, ' ' + TLexEnclosedBy(EnclosedList[I]).ProcName + 'Proc;');
Writeln(OutFile, ' fTokenID := ' + IdentPre + TLexEnclosedBy(EnclosedList[I]).TokenName + ';');
Writeln(OutFile, ' end');
Writeln(OutFile, ' else');
if (IdentList.IndexOf(IdentPre + 'Symbol') >= 0) then
Writeln(OutFile, ' fTokenID := ' + IdentPre + 'Symbol;')
else
Writeln(OutFile, ' fTokenID := ' + IdentPre + 'Identifier;');
end
else
begin
Writeln(OutFile, ' fRange := rs' + TLexEnclosedBy(EnclosedList[I]).ProcName + ';');
Writeln(OutFile, ' ' + TLexEnclosedBy(EnclosedList[I]).ProcName + 'Proc;');
Writeln(OutFile, ' fTokenID := ' + IdentPre + TLexEnclosedBy(EnclosedList[I]).TokenName + ';');
end;
Writeln(OutFile, 'end;');
Writeln(OutFile);
Writeln(OutFile, 'procedure ' + LexName + '.' + TLexEnclosedBy(EnclosedList[I]).ProcName + 'Proc;');
Writeln(OutFile, 'begin');
if TLexEnclosedBy(EnclosedList[I]).MultiLine then
begin
Writeln(OutFile, ' case fLine[Run] of');
Writeln(OutFile, ' #0: NullProc;');
Writeln(OutFile, ' #10: LFProc;');
Writeln(OutFile, ' #13: CRProc;');
Writeln(OutFile, ' else');
Writeln(OutFile, ' begin');
sPrefix := ' ';
end
else
sPrefix := '';
Writeln(OutFile, sPrefix, ' fTokenID := ' + IdentPre + TLexEnclosedBy(EnclosedList[I]).TokenName + ';');
Writeln(OutFile, sPrefix, ' repeat');
Write(OutFile, sPrefix, ' if ');
for J := 1 to Length(TLexEnclosedBy(EnclosedList[I]).EndsWith) do
begin
if (J > 1) then
begin
Writeln(OutFile, ' and');
Write(OutFile, sPrefix, ' ');
end;
Write(OutFile, '(fLine[Run' + AddInt(J - 1) + '] = ''' + StuffString(TLexEnclosedBy(EnclosedList[I]).EndsWith[J]) + ''')');
end;
Writeln(OutFile, ' then');
Writeln(OutFile, sPrefix, ' begin');
Writeln(OutFile, sPrefix, ' Inc(Run, ' + IntToStr(Length(TLexEnclosedBy(EnclosedList[I]).EndsWith)) + ');');
Writeln(OutFile, sPrefix, ' fRange := rsUnKnown;');
Writeln(OutFile, sPrefix, ' Break;');
Writeln(OutFile, sPrefix, ' end;');
Writeln(OutFile, sPrefix, ' if not (fLine[Run] in [#0, #10, #13]) then');
Writeln(OutFile, sPrefix, ' Inc(Run);');
Writeln(OutFile, sPrefix, ' until fLine[Run] in [#0, #10, #13];');
Writeln(OutFile, sPrefix, 'end;');
if TLexEnclosedBy(EnclosedList[I]).MultiLine then
begin
Writeln(OutFile, ' end;');
Writeln(OutFile, 'end;');
end;
Writeln(OutFile);
end;
Writeln(OutFile, 'constructor ' + LexName + '.Create(AOwner: TComponent);');
Writeln(OutFile, 'begin');
Writeln(OutFile, ' inherited Create(AOwner);');
I := 0;
while I < IdentList.Count do
begin
AttrTemp := Copy(IdentList[I], Length(IdentPre) + 1, Length(IdentList[I]));
if AttrTemp = 'Key' then
AttrName := CboAttrReservedWord.Text
else if AttrTemp = 'Identifier' then
AttrName := CboAttrIdentifier.Text
else
AttrName := 'SYNS_Attr' + FilterInvalidChars(AttrTemp);
if (IdentList[I] <> IdentPre + 'Null') and (IdentList[I] <> IdentPre + 'Unknown') then
begin
AttrTemp := 'f' + AttrTemp + 'Attri';
Writeln(OutFile, ' ' + AttrTemp + ' := TSynHighLighterAttributes.Create(' + AttrName + ');');
if Assigned(IdentList.Objects[i]) then
begin
DefAttri := TLexDefaultAttri(IdentList.Objects[i]);
if (DefAttri.Style <> '') then
Writeln(OutFile, ' ' + AttrTemp + '.Style := ' + DefAttri.Style + ';');
if (DefAttri.Foreground <> '') then
Writeln(OutFile, ' ' + AttrTemp + '.Foreground := ' + DefAttri.Foreground + ';');
if (DefAttri.Background <> '') then
Writeln(OutFile, ' ' + AttrTemp + '.Background := ' + DefAttri.Background + ';');
end
else if (IdentList[I] = IdentPre + 'Key') then
Writeln(OutFile, ' ' + AttrTemp + '.Style := [fsBold];')
else if (IdentList[I] = IdentPre + 'Comment') then
begin
Writeln(OutFile, ' ' + AttrTemp + '.Style := [fsItalic];');
Writeln(OutFile, ' ' + AttrTemp + '.Foreground := clNavy;');
end;
Writeln(OutFile, ' AddAttribute(' + AttrTemp + ');');
Writeln(OutFile);
end;
Inc(I);
end;
Writeln(OutFile, ' SetAttributesOnChange(DefHighlightChange);');
Writeln(OutFile, ' InitIdent;');
Writeln(OutFile, ' MakeMethodTables;');
Writeln(OutFile, ' fDefaultFilter := ' + GetFilterName + ';');
Writeln(OutFile, ' fRange := rsUnknown;');
Writeln(OutFile, 'end;');
Writeln(OutFile);
Writeln(OutFile, 'procedure ' + LexName + '.SetLine(NewValue: String; LineNumber: Integer);');
Writeln(OutFile, 'begin');
Writeln(OutFile, ' fLineRef := NewValue;' );
Writeln(OutFile, ' fLine := PChar(fLineRef);');
Writeln(OutFile, ' Run := 0;');
Writeln(OutFile, ' fLineNumber := LineNumber;');
Writeln(OutFile, ' Next;');
Writeln(OutFile, 'end;');
Writeln(OutFile);
I := 0;
while I < SetList.Count do
begin
Writeln(OutFile, 'procedure '+LexName+'.'+TLexCharsets(SetList[I]).SetName + 'Proc;');
Writeln(OutFile, 'begin');
Write(OutFile, ' ' + TLexCharsets(SetList[I]).ProcData);
Writeln(OutFile, 'end;');
Writeln(OutFile);
inc(I);
end;
Writeln(OutFile, 'procedure ' + LexName + '.UnknownProc;');
Writeln(OutFile, 'begin');
Writeln(OutFile, '{$IFDEF SYN_MBCSSUPPORT}');
Writeln(OutFile, ' if FLine[Run] in LeadBytes then');
Writeln(OutFile, ' Inc(Run,2)');
Writeln(OutFile, ' else');
Writeln(OutFile, '{$ENDIF}');
Writeln(OutFile, ' inc(Run);');
Writeln(OutFile, ' fTokenID := ' + IdentPre + 'Unknown;');
Writeln(OutFile, 'end;');
Writeln(OutFile);
Writeln(OutFile, 'procedure ' + LexName + '.Next;');
Writeln(OutFile, 'begin');
Writeln(OutFile, ' fTokenPos := Run;');
if (EnclosedList.Count > 0) then
begin
Writeln(OutFile, ' case fRange of');
for I := 0 to (EnclosedList.Count - 1) do
begin
if TLexEnclosedBy(EnclosedList[I]).MultiLine then
begin
Writeln(OutFile, ' rs' + TLexEnclosedBy(EnclosedList[I]).ProcName +
': ' + TLexEnclosedBy(EnclosedList[I]).ProcName + 'Proc;');
end;
end;
Writeln(OutFile, ' else');
Writeln(OutFile, ' begin');
Writeln(OutFile, ' fRange := rsUnknown;');
Writeln(OutFile, ' fProcTable[fLine[Run]];');
Writeln(OutFile, ' end;');
Writeln(OutFile, ' end;');
end
else
Writeln(OutFile, ' fProcTable[fLine[Run]];');
Writeln(OutFile, 'end;');
Writeln(OutFile);
Writeln(OutFile, 'function ' + LexName + '.GetDefaultAttribute(Index: integer): TSynHighLighterAttributes;');
Writeln(OutFile, 'begin');
Writeln(OutFile, ' case Index of');
if (IdentList.IndexOf(IdentPre + 'Comment') >= 0) then
Writeln(OutFile, ' SYN_ATTR_COMMENT : Result := fCommentAttri;');
if (IdentList.IndexOf(IdentPre + 'Identifier') >= 0) then
Writeln(OutFile, ' SYN_ATTR_IDENTIFIER : Result := fIdentifierAttri;');
if (IdentList.IndexOf(IdentPre + 'Key') >= 0) then
Writeln(OutFile, ' SYN_ATTR_KEYWORD : Result := fKeyAttri;');
if (IdentList.IndexOf(IdentPre + 'String') >= 0) then
Writeln(OutFile, ' SYN_ATTR_STRING : Result := fStringAttri;');
if (IdentList.IndexOf(IdentPre + 'Space') >= 0) then
Writeln(OutFile, ' SYN_ATTR_WHITESPACE : Result := fSpaceAttri;');
if (IdentList.IndexOf(IdentPre + 'Symbol') >= 0) then
Writeln(OutFile, ' SYN_ATTR_SYMBOL : Result := fSymbolAttri;');
Writeln(OutFile, ' else');
Writeln(OutFile, ' Result := nil;');
Writeln(OutFile, ' end;');
Writeln(OutFile, 'end;');
Writeln(OutFile);
Writeln(OutFile, 'function ' + LexName + '.GetEol: Boolean;');
Writeln(OutFile, 'begin');
Writeln(OutFile, ' Result := fTokenID = tkNull;');
Writeln(OutFile, 'end;');
Writeln(OutFile);
if ChkGetKeyWords.Checked then
begin
Writeln(OutFile, 'function ' + LexName + '.GetKeyWords: string;');
Writeln(OutFile, 'begin');
TempStringList := TStringList.Create;
try
TempStringList.Sorted := True;
for I := 0 to KeyList.Count - 1 do
TempStringList.Add(TLexKeys(KeyList[I]).KeyName);
if TempStringList.Count > 0 then
begin
Writeln(OutFile, ' Result := ');
for I := 0 to Trunc(Int(Length(TempStringList.CommaText) div 70)) - 1 do
begin
if I = 0 then LineLength := 69 else LineLength := 70;
Writeln(OutFile, ' ' + #39 + Copy(TempStringList.CommaText,
I * 70, LineLength) + #39 + #32 + #43);
end;
I := Trunc(Int(Length(TempStringList.CommaText) div 70));
Writeln(OutFile, ' ' + #39 + Copy(TempStringList.CommaText,
I * 70, Length(TempStringList.CommaText)) + #39 + ';')
end else
Writeln(OutFile, ' Result := ' + #39 + #39 + ';');
finally
TempStringList.Free;
end;
Writeln(OutFile, 'end;');
Writeln(OutFile);
end;
Writeln(OutFile, 'function ' + LexName + '.GetToken: String;');
Writeln(OutFile, 'var');
Writeln(OutFile, ' Len: LongInt;');
Writeln(OutFile, 'begin');
Writeln(OutFile, ' Len := Run - fTokenPos;');
Writeln(OutFile, ' SetString(Result, (FLine + fTokenPos), Len);');
Writeln(OutFile, 'end;');
Writeln(OutFile);
Writeln(OutFile, 'function ' + LexName + '.GetTokenID: TtkTokenKind;');
Writeln(OutFile, 'begin');
Writeln(OutFile, ' Result := fTokenId;');
Writeln(OutFile, 'end;');
Writeln(OutFile);
Writeln(OutFile, 'function ' + LexName + '.GetTokenAttribute: TSynHighLighterAttributes;');
Writeln(OutFile, 'begin');
Writeln(OutFile, ' case GetTokenID of');
I := 0;
while I < IdentList.Count do
begin
if (IdentList[I] <> IdentPre + 'Null') and (IdentList[I] <> IdentPre + 'Unknown') then
Writeln(OutFile, ' ' + IdentList[I] + ': Result := f' +
Copy(IdentList[I], Length(IdentPre) + 1, Length(IdentList[I])) + 'Attri;');
inc(I);
end;
Writeln(OutFile, ' ' + IdentPre + 'Unknown: Result := f' + CboUnknownTokenAttr.Text + 'Attri;');
Writeln(OutFile, ' else');
Writeln(OutFile, ' Result := nil;');
Writeln(OutFile, ' end;');
Writeln(OutFile, 'end;');
Writeln(OutFile);
Writeln(OutFile, 'function ' + LexName + '.GetTokenKind: integer;');
Writeln(OutFile, 'begin');
Writeln(OutFile, ' Result := Ord(fTokenId);');
Writeln(OutFile, 'end;');
Writeln(OutFile);
Writeln(OutFile, 'function ' + LexName + '.GetTokenPos: Integer;');
Writeln(OutFile, 'begin');
Writeln(OutFile, ' Result := fTokenPos;');
Writeln(OutFile, 'end;');
Writeln(OutFile);
Writeln(OutFile, 'function ' + LexName + '.GetIdentChars: TSynIdentChars;');
Writeln(OutFile, 'begin');
Writeln(OutFile, ' Result := [' + IdentContent + '];');
Writeln(OutFile, 'end;');
Writeln(OutFile);
Writeln(OutFile, 'function ' + LexName + '.GetSampleSource: string;');
Writeln(OutFile, 'begin');
if (SampleSourceList.Count = 0) then
begin
Writeln(OutFile, ' Result := ''Sample source for: ''#13#10 +');
Writeln(OutFile, ' ''' + EditDescription.Text + ''';');
end
else
begin
Write(OutFile, ' Result := ');
for i := 0 to (SampleSourceList.Count - 1) do
begin
if (i > 0) then
begin
Writeln(OutFile, '#13#10 +');
Write(OutFile, ' ');
end;
if (SampleSourceList[i] <> '') then
Write(OutFile, '''', StuffString(SampleSourceList[i]), '''');
end;
Writeln(OutFile, ';');
end;
Writeln(OutFile, 'end;');
Writeln(OutFile);
Writeln(OutFile, 'function ' + LexName + '.IsFilterStored: Boolean;');
Writeln(OutFile, 'begin');
Writeln(OutFile, ' Result := fDefaultFilter <> ' + GetFilterName + ';');
Writeln(OutFile, 'end;');
Writeln(OutFile);
Writeln(OutFile, '{$IFNDEF SYN_CPPB_1} class {$ENDIF}');
Writeln(OutFile, 'function ' + LexName + '.GetLanguageName: string;');
Writeln(OutFile, 'begin');
Writeln(OutFile, ' Result := ' + GetLangName + ';');
Writeln(OutFile, 'end;');
Writeln(OutFile);
Writeln(OutFile, 'procedure ' + LexName + '.ResetRange;');
Writeln(OutFile, 'begin');
Writeln(OutFile, ' fRange := rsUnknown;');
Writeln(OutFile, 'end;');
Writeln(OutFile);
Writeln(OutFile, 'procedure ' + LexName + '.SetRange(Value: Pointer);');
Writeln(OutFile, 'begin');
Writeln(OutFile, ' fRange := TRangeState(Value);');
Writeln(OutFile, 'end;');
Writeln(OutFile);
Writeln(OutFile, 'function ' + LexName + '.GetRange: Pointer;');
Writeln(OutFile, 'begin');
Writeln(OutFile, ' Result := Pointer(fRange);');
Writeln(OutFile, 'end;');
Writeln(OutFile);
Writeln(OutFile, 'initialization');
Writeln(OutFile, ' MakeIdentTable;');
Writeln(OutFile, '{$IFNDEF SYN_CPPB_1}');
Writeln(OutFile, ' RegisterPlaceableHighlighter(' + LexName + ');');
Writeln(OutFile, '{$ENDIF}');
Writeln(OutFile, 'end.');
end;
procedure TFrmMain.CboLangNameChange(Sender: TObject);
begin
if (CboLangName.Text <> '') and (CboFilter.Text <> '') then
BtnStart.Enabled := True
else
BtnStart.Enabled := False;
end;
procedure TFrmMain.ListBoxFieldsClick(Sender: TObject);
begin
BtnDelete.Enabled := True;
end;
procedure TFrmMain.BtnAddClick(Sender: TObject);
begin
ListBoxFields.Items.Add(EditAddField.Text);
EditAddField.Clear;
end;
procedure TFrmMain.BtnDeleteClick(Sender: TObject);
begin
BtnDelete.Enabled := False;
ListBoxFields.Items.Delete(ListBoxFields.ItemIndex);
end;
procedure TFrmMain.EditAddFieldChange(Sender: TObject);
begin
BtnAdd.Enabled := EditAddField.Text <> '';
end;
procedure TFrmMain.EditAddFieldKeyPress(Sender: TObject; var Key: Char);
begin
if (Key = ';') or (Key = #32) then Key := #0;
end;
procedure TFrmMain.MnuExitClick(Sender: TObject);
begin
Close;
end;
procedure TFrmMain.MnuOpenClick(Sender: TObject);
begin
WriteSettings;
PerformFileOpen;
end;
procedure TFrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
WriteSettings;
end;
procedure TFrmMain.Hash1Click(Sender: TObject);
var
Keyword: String;
begin
Keyword := '';
if InputQuery('Calculate hash code', 'Enter keyword', Keyword) then
MessageDlg('The hash code for keyword ''' + Keyword + ''': '#13#10#13#10 +
' Case sensitive: ' + IntToStr(SensKeyHash(Keyword)) + #13#10 +
' Case in-sensitive: ' + IntToStr(KeyHash(Keyword)),
mtInformation, [mbOk], 0);
end;
end.