From 2a36a73f226537d98a1021479014cc47c6619c94 Mon Sep 17 00:00:00 2001 From: Basile Burg Date: Mon, 28 Mar 2016 05:48:49 +0200 Subject: [PATCH] added a more or less common lexer for hex and bin literals --- src/ce_d2syn.pas | 25 +++++++++++++++++++++++++ src/ce_dlang.pas | 6 +++--- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/ce_d2syn.pas b/src/ce_d2syn.pas index a8190996..5f1bacb5 100644 --- a/src/ce_d2syn.pas +++ b/src/ce_d2syn.pas @@ -815,6 +815,31 @@ begin exit; end else readerReset; + // bin & hex literals + if reader^ = '0' then if readerNext^ in ['b','B', 'x', 'X'] then + begin + fTokKind:= tkNumbr; + readerNext; + if (reader-1)^ in ['b','B'] then + readWhile(reader, fTokStop, ['0','1','_']) + else + readWhile(reader, fTokStop, hexaChars + ['.']); + if not tryReadDelim(reader, fTokStop, 'uL') + then if not tryReadDelim(reader, fTokStop, 'UL') + then if not tryReadDelim(reader, fTokStop, 'Lu') + then if not tryReadDelim(reader, fTokStop, 'LU') + then if reader^ in ['U','L','u', 'p', 'P', 'i'] then + readerNext; + if not isWhite(reader^) and not isOperator1(reader^) and + not isSymbol(reader^) then + begin + fTokKind:= tkError; + readUntilAmong(reader, fTokStop, [#0..#32] + symbChars); + end; + exit; + end + else readerPrev; + // numbers if (isNumber(reader^)) then begin diff --git a/src/ce_dlang.pas b/src/ce_dlang.pas index 16255bbf..07c3b8c0 100644 --- a/src/ce_dlang.pas +++ b/src/ce_dlang.pas @@ -751,7 +751,7 @@ begin exit; continue; end; - if isOperator3(identifier[1..length(identifier)-1]) then + if isOperator3(identifier[1..3]) then begin reader.previous; addToken(ltkOperator); @@ -759,7 +759,7 @@ begin exit; continue; end; - if isOperator2(identifier[1..length(identifier)-2]) then + if isOperator2(identifier[1..2]) then begin reader.previous; reader.previous; @@ -788,7 +788,7 @@ begin exit; continue; end; - if isOperator2(identifier[1..length(identifier)-1]) then + if isOperator2(identifier[1..2]) then begin reader.previous; addToken(ltkOperator);