|
- unit uengShaderFileTypes;
-
- {$mode objfpc}{$H+}
- {$I uengShaderFile.inc}
-
- interface
-
- uses
- Classes, SysUtils
-
- {$IFDEF USE_BITSPACE_UTILS}
- , uutlSerialization, uutlCommon
- {$ENDIF}
- ;
-
- type
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- {$IFDEF USE_BITSPACE_UTILS}
- IengShaderFileWriter = uutlSerialization.IutlFileWriter;
- IengShaderFileReader = uutlSerialization.IutlFileReader;
- TengShaderFileReader = uutlSerialization.TutlSimpleFileReader;
- TengShaderFileWriter = uutlSerialization.TutlSimpleFileWriter;
- TIntfObjNoRefCount = uutlCommon.TutlInterfaceNoRefCount;
- {$ENDIF}
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //Exceptions////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- EengShaderPart = class(Exception)
- protected
- function GenerateMessage: String; virtual;
- public
- Sender: TObject;
- Line: Integer;
- Col: Integer;
- Filename: String;
-
- procedure PrintTrace(const aLines: TStrings);
- function PrintTrace: String;
-
- constructor Create(const aSender: TObject); overload;
- constructor Create(const aLine, aCol: Integer; const aFilename: String; const aSender: TObject); overload;
- constructor Create(const aMsg: String; const aSender: TObject); overload;
- constructor Create(const aMsg: String; const aLine, aCol: Integer; const aFilename: String; const aSender: TObject); overload;
- end;
- EengShaderPartInternal = class(EengShaderPart);
- EengExpression = class(EengShaderPart);
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- EengInvalidToken = class(EengShaderPartInternal)
- protected
- function GenerateMessage: String; override;
- public
- SenderClassName: String;
- Token: String;
- constructor Create(const aSenderClassName: String; const aToken: String; const aSender: TObject); overload;
- constructor Create(const aSenderClassName: String; const aToken: String; const aLine, aCol: Integer; const aFilename: String; const aSender: TObject); overload;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- EengUnexpectedToken = class(EengShaderPart)
- protected
- function GenerateMessage: String; override;
- public
- Token: String;
- Expected: String;
- constructor Create(const aToken, aExpected: String; const aSender: TObject); overload;
- constructor Create(const aToken, aExpected: String; const aLine, aCol: Integer; const aFilename: String; const aSender: TObject); overload;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- EengInvalidParamter = class(EengShaderPart)
- protected
- function GenerateMessage: String; override;
- public
- Param: String;
- Expected: String;
- constructor Create(const aParam, aExpected: String; const aSender: TObject); overload;
- constructor Create(const aParam, aExpected: String; const aLine, aCol: Integer; const aFilename: String; const aSender: TObject); overload;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- EengInvalidParamterCount = class(EengShaderPart)
- protected
- function GenerateMessage: String; override;
- public
- Token: String;
- ExpectedMin: Integer;
- ExpectedMax: Integer;
- constructor Create(const aToken: String; const aExpected: Integer; const aSender: TObject); overload;
- constructor Create(const aToken: String; const aExpectedMin, aExpectedMax: Integer; const aSender: TObject); overload;
- constructor Create(const aToken: String; const aExpected, aLine, aCol: Integer; const aFilename: String; const aSender: TObject); overload;
- constructor Create(const aToken: String; const aExpectedMin, aExpectedMax, aLine, aCol: Integer; const aFilename: String; const aSender: TObject); overload;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- EengInvalidIdentifier = class(EengShaderPart)
- protected
- function GenerateMessage: String; override;
- public
- Identifier: String;
- constructor Create(const aIdentifier: String; const aSender: TObject); overload;
- constructor Create(const aIdentifier: String; const aLine, aCol: Integer; const aFilename: String; const aSender: TObject); overload;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- EengOutOfRange = class(EengShaderPartInternal)
- protected
- function GenerateMessage: String; override;
- public
- Min: Integer;
- Max: Integer;
- Index: Integer;
- constructor Create(const aMin, aMax, aIndex: Integer; const aSender: TObject); overload;
- constructor Create(const aMin, aMax, aIndex, aLine, aCol: Integer; const aFilename: String; const aSender: TObject); overload;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- EengDuplicateIdentifier = class(EengShaderPart)
- protected
- function GenerateMessage: String; override;
- public
- Name: String;
- New: TObject;
- Old: TObject;
- constructor Create(const aName: String; const aNew, aOld, aSender: TObject); overload;
- constructor Create(const aName: String; const aNew, aOld: TObject; aLine, aCol: Integer; const aFilename: String; const aSender: TObject); overload;
- end;
-
- implementation
-
- uses
- uengShaderPart;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //EengShaderPart////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function EengShaderPart.GenerateMessage: String;
- begin
- result := ''; // DUMMY
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- procedure EengShaderPart.PrintTrace(const aLines: TStrings);
-
- function GetName(const aPart: TengShaderPart): String;
- begin
- result := aPart.GetTokenName;
- if (result = '')
- then result := aPart.ClassName
- else result := result + ' (' + aPart.ClassName + ')';
- end;
-
- var
- p: TengShaderPart;
- begin
- if not Assigned(Sender) or not
- (Sender is TengShaderPart) then
- exit;
- p := (Sender as TengShaderPart);
- aLines.Text := Message;
- while Assigned(p) do begin
- aLines.Add(Format('%s (%d:%d): %s', [p.Filename, p.Line, p.Col, GetName(p)]));
- p := p.Parent;
- end;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function EengShaderPart.PrintTrace: String;
- var
- sl: TStringList;
- begin
- sl := TStringList.Create;
- try
- PrintTrace(sl);
- result := sl.Text;
- finally
- FreeAndNil(sl);
- end;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- constructor EengShaderPart.Create(const aSender: TObject);
- begin
- Create(GenerateMessage, aSender);
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- constructor EengShaderPart.Create(const aLine, aCol: Integer; const aFilename: String; const aSender: TObject);
- begin
- Create(GenerateMessage, aLine, aCol, aFilename, aSender);
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- constructor EengShaderPart.Create(const aMsg: String; const aSender: TObject);
- begin
- Sender := nil;
- if Assigned(aSender)
- then Create(
- aMsg,
- (aSender as TengShaderPart).Line,
- (aSender as TengShaderPart).Col,
- (aSender as TengShaderPart).Filename,
- aSender)
- else inherited Create(Format('%s: %s', [
- ClassName,
- aMsg]));
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- constructor EengShaderPart.Create(const aMsg: String; const aLine, aCol: Integer; const aFilename: String; const aSender: TObject);
- begin
- Sender := aSender;
- Line := aLine;
- Col := aCol;
- Filename := aFilename;
- inherited Create(Format('%s (%s %d:%d): %s',[
- ClassName,
- ExtractFileName(Filename),
- Line+1,
- Col,
- aMsg]))
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //EengInvalidToken//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function EengInvalidToken.GenerateMessage: String;
- begin
- result := 'invalid token: ' + SenderClassName + ' <> '+ Token;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- constructor EengInvalidToken.Create(const aSenderClassName: String; const aToken: String; const aSender: TObject);
- begin
- SenderClassName := aSenderClassName;
- Token := aToken;
- inherited Create(aSender);
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- constructor EengInvalidToken.Create(const aSenderClassName: String; const aToken: String; const aLine, aCol: Integer; const aFilename: String; const aSender: TObject);
- begin
- SenderClassName := aSenderClassName;
- Token := aToken;
- inherited Create(aLine, aCol, aFilename, aSender);
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //EengUnexpectedToken///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function EengUnexpectedToken.GenerateMessage: String;
- begin
- result := 'unexpected token: ' + Token;
- if (Expected <> '') then
- result := result + '(expected ' + Expected + ')';
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- constructor EengUnexpectedToken.Create(const aToken, aExpected: String; const aSender: TObject);
- begin
- Token := aToken;
- Expected := aExpected;
- inherited Create(aSender);
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- constructor EengUnexpectedToken.Create(const aToken, aExpected: String; const aLine, aCol: Integer; const aFilename: String; const aSender: TObject);
- begin
- Token := aToken;
- Expected := aExpected;
- inherited Create(aLine, aCol, aFilename, aSender);
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //EengInvalidParamter///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function EengInvalidParamter.GenerateMessage: String;
- begin
- result := 'invalid parameter: ' + Param;
- if (Expected <> '') then
- result := result + '(expected ' + Expected + ')';
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- constructor EengInvalidParamter.Create(const aParam, aExpected: String; const aSender: TObject);
- begin
- Param := aParam;
- Expected := aExpected;
- inherited Create(aSender);
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- constructor EengInvalidParamter.Create(const aParam, aExpected: String; const aLine, aCol: Integer; const aFilename: String; const aSender: TObject);
- begin
- Param := aParam;
- Expected := aExpected;
- inherited Create(aLine, aCol, aFilename, aSender);
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //EengInvalidParamterCount//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function EengInvalidParamterCount.GenerateMessage: String;
- begin
- result := 'invalid parameter count in ' + Token + '(expected ';
- if (ExpectedMin = ExpectedMax) then
- result := result + IntToStr(ExpectedMin)
- else if (ExpectedMax < 0) then
- result := result + ' at least ' + IntToStr(ExpectedMin)
- else
- result := IntToStr(ExpectedMin) + ' to ' + IntToStr(ExpectedMax);
- result := result + 'parameter)';
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- constructor EengInvalidParamterCount.Create(const aToken: String; const aExpected: Integer; const aSender: TObject);
- begin
- Token := aToken;
- ExpectedMin := aExpected;
- ExpectedMax := aExpected;
- inherited Create(aSender);
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- constructor EengInvalidParamterCount.Create(const aToken: String; const aExpectedMin, aExpectedMax: Integer; const aSender: TObject);
- begin
- Token := aToken;
- ExpectedMin := aExpectedMin;
- ExpectedMax := aExpectedMax;
- inherited Create(aSender);
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- constructor EengInvalidParamterCount.Create(const aToken: String; const aExpected, aLine, aCol: Integer; const aFilename: String; const aSender: TObject);
- begin
- Token := aToken;
- ExpectedMin := aExpected;
- ExpectedMax := aExpected;
- inherited Create(aLine, aCol, aFilename, aSender);
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- constructor EengInvalidParamterCount.Create(const aToken: String; const aExpectedMin, aExpectedMax, aLine, aCol: Integer; const aFilename: String; const aSender: TObject);
- begin
- Token := aToken;
- ExpectedMin := aExpectedMin;
- ExpectedMax := aExpectedMax;
- inherited Create(aLine, aCol, aFilename, aSender);
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //EengInvalidIdentifier/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function EengInvalidIdentifier.GenerateMessage: String;
- begin
- result := 'invalid identifier: ' + Identifier;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- constructor EengInvalidIdentifier.Create(const aIdentifier: String; const aSender: TObject);
- begin
- Identifier := aIdentifier;
- inherited Create(aSender);
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- constructor EengInvalidIdentifier.Create(const aIdentifier: String; const aLine, aCol: Integer; const aFilename: String; const aSender: TObject);
- begin
- Identifier := aIdentifier;
- inherited Create(aLine, aCol, aFilename, aSender);
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //EengOutOfRange////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function EengOutOfRange.GenerateMessage: String;
- begin
- result := format('index (%d) out of range (%d:%d)', [Index, Min, Max])
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- constructor EengOutOfRange.Create(const aMin, aMax, aIndex: Integer; const aSender: TObject);
- begin
- Min := aMin;
- Max := aMax;
- Index := aIndex;
- inherited Create(aSender);
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- constructor EengOutOfRange.Create(const aMin, aMax, aIndex, aLine, aCol: Integer; const aFilename: String; const aSender: TObject);
- begin
- Min := aMin;
- Max := aMax;
- Index := aIndex;
- inherited Create(aLine, aCol, aFilename, aSender);
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //EengDuplicateIdentifier///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function EengDuplicateIdentifier.GenerateMessage: String;
- begin
- result := 'duplicate identifier: ' + Name;
- if (New is TengShaderPart) then
- result := result + Format('(%s %d:%d)', [
- (New as TengShaderPart).Filename,
- (New as TengShaderPart).Line,
- (New as TengShaderPart).Col]);
- if (Old is TengShaderPart) then
- result := result + Format('(previously declared here %s %d:%d)', [
- (Old as TengShaderPart).Filename,
- (Old as TengShaderPart).Line,
- (Old as TengShaderPart).Col]);
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- constructor EengDuplicateIdentifier.Create(const aName: String; const aNew, aOld, aSender: TObject);
- begin
- Name := aName;
- New := aNew;
- Old := aOld;
- inherited Create(aSender);
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- constructor EengDuplicateIdentifier.Create(const aName: String; const aNew, aOld: TObject; aLine, aCol: Integer; const aFilename: String; const aSender: TObject);
- begin
- Name := aName;
- New := aNew;
- Old := aOld;
- inherited Create(aLine, aCol, aFilename, aSender);
- end;
-
- end.
|