From 101a9f16b8e978ecabcb463652cb0fa4a25126bd Mon Sep 17 00:00:00 2001 From: Basile Burg Date: Sat, 30 Aug 2014 10:13:59 +0200 Subject: [PATCH] internal methods added for HL --- src/ce_d2syn.pas | 26 +++++++++++++--- src/ce_dlang.pas | 2 +- src/ce_dlangutils.pas | 71 ++++++++++++++++++++++++++++++++++--------- 3 files changed, 79 insertions(+), 20 deletions(-) diff --git a/src/ce_d2syn.pas b/src/ce_d2syn.pas index f3e9d8a6..2a4d683c 100644 --- a/src/ce_d2syn.pas +++ b/src/ce_d2syn.pas @@ -63,8 +63,8 @@ type // a terminal range kind, cannot be combined with another range kind. TPrimaryRange = (prString1, prString2, prBlockCom1, prBlockCom2, prBlockDoc1, prBlockDoc2); - // can be combined to an primary range - TSecondaryRange = (srTokenString, srActiveVersion, srInactiveVersion); + // can be combined to a primary range + TSecondaryRange = (srTokenString, srActiveVersion, srInactiveVersion, srAssembly); // used by the secondary ranges to transform the standard token attributes. TAttributeTransform = (taFontStyle, taFontColor, taBackColor); @@ -695,6 +695,22 @@ begin exit; end else readerReset; + + // hex litterals + {if readDelim(reader, fTokStop, '0x') then + begin + readWhile(reader, fTokStop, hexaChars); + if not tryReadDelim(reader, fTokStop, 'Lu') then + if not tryReadDelim(reader, fTokStop, 'LU') then + if not tryReadDelim(reader, fTokStop, 'uL') then + if not tryReadDelim(reader, fTokStop, 'UL') then + if not tryReadDelim(reader, fTokStop, 'L') then + if not tryReadDelim(reader, fTokStop, 'u') then + tryReadDelim(reader, fTokStop, 'U'); + fTokKind := tkNumbr; + exit; + end else readerReset;} + // numbers 1 if (isNumber(reader^)) then begin @@ -703,7 +719,7 @@ begin exit; end; - // symbols 1: ponctuation + // symbChars 1: ponctuation if isSymbol(reader^) then begin fTokKind := tkSymbl; @@ -715,7 +731,7 @@ begin exit; end; - // symbols 2: operators + // symbChars 2: operators if isOperator1(reader^) then begin fTokKind := tkSymbl; @@ -740,7 +756,7 @@ begin if not isOperator1(reader^) then exit; end; end; - fTokKind := tkIdent; + fTokKind := tkIdent; // invalid op not colorized. end; // Keyword - Identifier diff --git a/src/ce_dlang.pas b/src/ce_dlang.pas index e4b4de59..ae926812 100644 --- a/src/ce_dlang.pas +++ b/src/ce_dlang.pas @@ -617,7 +617,7 @@ begin continue; end; - // symbols + // symbChars if isSymbol(reader.head^) then begin identifier += reader.head^; diff --git a/src/ce_dlangutils.pas b/src/ce_dlangutils.pas index f4a37061..f575d13b 100644 --- a/src/ce_dlangutils.pas +++ b/src/ce_dlangutils.pas @@ -15,7 +15,8 @@ const stringPrefixes: TCharSet = ['r', 'x', '"']; stringStopChecks: TCharSet = ['\', '"']; charStopChecks: TCharSet = ['\', #39]; - symbols: TCharSet = [';', '{', '}', '(', ')', '[', ']', ',', '.', ':', '?', '$', '"', #39]; + symbChars: TCharSet = [';', '{', '}', '(', ')', '[', ']', ',', '.', ':', '?', '$', '"', #39]; + hexaChars: TCharSet = ['0'..'9', 'a'..'f', 'A'..'F', '_']; function isWhite(const c: Char): boolean; {$IFNDEF DEBUG}inline;{$ENDIF} function isSpace(const c: Char): boolean; {$IFNDEF DEBUG}inline;{$ENDIF} @@ -40,14 +41,18 @@ function readLine(var aReader: PChar; var aPosition: Integer): boolean; {$IFNDEF function readUntil(var aReader: PChar; var aPosition: Integer; const aDelim: Char): boolean; overload; {$IFNDEF DEBUG}inline;{$ENDIF} function readUntil(var aReader: PChar; var aPosition: Integer; const aDelim: string): boolean; overload; {$IFNDEF DEBUG}inline;{$ENDIF} -function readWhile(var aReader: PChar; var aPosition: Integer; const aDelim: Char): boolean; {$IFNDEF DEBUG}inline;{$ENDIF} +function readUntilAmong(var aReader: PChar; var aPosition: Integer; const aDelim: TCharSet): boolean; {$IFNDEF DEBUG}inline;{$ENDIF} -function readUntilAmong(var aReader: PChar; var aPosition: Integer; const aDelim: TCharSet): boolean; {$IFNDEF DEBUG}inline;{$ENDIF} +function readWhile(var aReader: PChar; var aPosition: Integer; const aDelim: Char): boolean; overload; {$IFNDEF DEBUG}inline;{$ENDIF} +function readWhile(var aReader: PChar; var aPosition: Integer; const aDelim: TCharSet): boolean; overload;{$IFNDEF DEBUG}inline;{$ENDIF} function readDelim(var aReader: PChar; var aPosition: Integer; const aDelim: Char): boolean; overload; {$IFNDEF DEBUG}inline;{$ENDIF} function readDelim(var aReader: PChar; var aPosition: Integer; const aDelim: string): boolean; overload; {$IFNDEF DEBUG}inline;{$ENDIF} function readDelim(var aReader: PChar; var aPosition: Integer; const aDelims: TCharSet): boolean; overload; {$IFNDEF DEBUG}inline;{$ENDIF} +function tryReadDelim(var aReader: PChar; var aPosition: Integer; const aDelim: Char): boolean; overload; {$IFNDEF DEBUG}inline;{$ENDIF} +function tryReadDelim(var aReader: PChar; var aPosition: Integer; const aDelim: string): boolean; overload; {$IFNDEF DEBUG}inline;{$ENDIF} + implementation {$BOOLEVAL ON} @@ -199,17 +204,6 @@ begin exit(true); end; -function readWhile(var aReader: PChar; var aPosition: Integer; const aDelim: Char): boolean; -begin - result := false; - while aReader^ = aDelim do - begin - inc(aReader); - inc(aPosition); - result := true; - end; -end; - function readUntilAmong(var aReader: PChar; var aPosition: Integer; const aDelim: TCharSet): boolean; begin while not (aReader^ in aDelim) do @@ -222,6 +216,29 @@ begin exit(true); end; +function readWhile(var aReader: PChar; var aPosition: Integer; const aDelim: Char): boolean; +begin + result := false; + while aReader^ = aDelim do + begin + inc(aReader); + inc(aPosition); + result := true; + end; +end; + +function readWhile(var aReader: PChar; var aPosition: Integer; const aDelim: TCharSet): boolean; +begin + result := false; + while aReader^ in aDelim do + begin + inc(aReader); + inc(aPosition); + result := true; + end; +end; + + function readDelim(var aReader: PChar; var aPosition: Integer; const aDelim: Char): boolean; begin if aReader^ <> aDelim then @@ -256,4 +273,30 @@ begin exit(true); end; +function tryReadDelim(var aReader: PChar; var aPosition: Integer; const aDelim: Char): boolean; +var + savedReader: PChar; + savedPos: Integer; +begin + savedReader := aReader; + savedPos := aPosition; + if readDelim(aReader, aPosition, aDelim) then exit(true); + aReader := savedReader; + aPosition := savedPos; + exit(false); +end; + +function tryReadDelim(var aReader: PChar; var aPosition: Integer; const aDelim: string): boolean; +var + savedReader: PChar; + savedPos: Integer; +begin + savedReader := aReader; + savedPos := aPosition; + if readDelim(aReader, aPosition, aDelim) then exit(true); + aReader := savedReader; + aPosition := savedPos; + exit(false); +end; + end.