added a more or less common lexer for int and float literals

This commit is contained in:
Basile Burg 2016-03-28 23:17:36 +02:00
parent e03fd44777
commit 5199c15838
1 changed files with 77 additions and 15 deletions

View File

@ -465,7 +465,8 @@ var
reader: PChar = nil; reader: PChar = nil;
label label
_postString1; _postString1,
_notDotFloat;
procedure readerReset; procedure readerReset;
begin begin
@ -669,7 +670,7 @@ begin
exit; exit;
end; end;
// string 1 // double quoted strings | raw double quoted strings
if (fCurrRange.rangeKinds = []) or (fCurrRange.rangeKinds = [rkTokString]) if (fCurrRange.rangeKinds = []) or (fCurrRange.rangeKinds = [rkTokString])
then if readDelim(reader, fTokStop, stringPrefixes) then then if readDelim(reader, fTokStop, stringPrefixes) then
begin begin
@ -739,7 +740,7 @@ begin
exit; exit;
end; end;
// string 2 // backticks strings
if (fCurrRange.rangeKinds = []) or (fCurrRange.rangeKinds = [rkTokString]) then if (fCurrRange.rangeKinds = []) or (fCurrRange.rangeKinds = [rkTokString]) then
if readDelim(reader, fTokStop, '`') then if readDelim(reader, fTokStop, '`') then
begin begin
@ -768,7 +769,7 @@ begin
exit; exit;
end; end;
//token string // token string
if readDelim(reader, fTokStop, 'q{') then if readDelim(reader, fTokStop, 'q{') then
begin begin
fTokKind := tkSymbl; fTokKind := tkSymbl;
@ -811,11 +812,17 @@ begin
readWhile(reader, fTokStop, ['0','1','_']) readWhile(reader, fTokStop, ['0','1','_'])
else else
readWhile(reader, fTokStop, hexaChars + ['.']); readWhile(reader, fTokStop, hexaChars + ['.']);
if not tryReadDelim(reader, fTokStop, 'uL') // exponent, sign tokenized later as op then value as number
if reader^ in ['P','p'] then
begin
readerNext;
exit;
end;
if not tryReadDelim(reader, fTokStop, 'uL')
then 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 not tryReadDelim(reader, fTokStop, 'LU') then if not tryReadDelim(reader, fTokStop, 'LU')
then if reader^ in ['U','L','u', 'p', 'P', 'i'] then then if reader^ in ['U', 'L', 'u', 'i'] then
readerNext; readerNext;
if not isWhite(reader^) and not isOperator1(reader^) and if not isWhite(reader^) and not isOperator1(reader^) and
not isSymbol(reader^) then not isSymbol(reader^) then
@ -827,17 +834,72 @@ begin
end end
else readerPrev; else readerPrev;
// numbers // int and float literals
if (isNumber(reader^)) then if (reader^ = '.') or (isNumber(reader^)) then
begin begin
while isHex(readerNext^) or (reader^ = '_') or (reader^ = '.') if (reader^= '.') then
or (reader^ in ['x', 'X', 'u', 'U', 'L', 'i']) do (*!*); begin
if isWhite(reader^) or isSymbol(reader^) or isOperator1(reader^) then readerNext;
fTokKind := tkNumbr if not isNumber(reader^) then
else begin
fTokKind := tkError; readerPrev;
goto _notDotFloat;
end else
readerPrev;
end;
fTokKind:= tkNumbr;
if reader^ <> '.' then
while isNumber(readerNext^) or (reader^ = '_') do (*!*);
if reader^ = '.' then
while isNumber(readerNext^) or (reader^ = '_') do (*!*);
if reader^= '.' then
begin
readerNext;
// .init .min .max etc.
if not isNumber(reader^) then
begin
readerPrev;
exit;
end;
readerPrev;
end;
// exponent, sign tokenized later as op then value as number
if reader^ in ['E','e'] then
begin
readerNext;
exit;
end;
// try valid suffixes
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 not tryReadDelim(reader, fTokStop, 'fi')
then if not tryReadDelim(reader, fTokStop, 'Fi')
then if not tryReadDelim(reader, fTokStop, 'Li')
then if reader^ in ['U','L','u', 'i', 'f','F'] then
readerNext;
if not isWhite(reader^) and not isOperator1(reader^) and
(not isSymbol(reader^) or (reader^ = '.')) then
begin
fTokKind:= tkError;
readUntilAmong(reader, fTokStop, [#0..#32] + symbChars - ['.']);
end;
exit; exit;
end; end;
_notDotFloat:
// generic number literals
//if (isNumber(reader^)) then
//begin
// while isHex(readerNext^) or (reader^ = '_') or (reader^ = '.')
// or (reader^ in ['x', 'X', 'u', 'U', 'L', 'i']) do (*!*);
// if isWhite(reader^) or isSymbol(reader^) or isOperator1(reader^) then
// fTokKind := tkNumbr
// else
// fTokKind := tkError;
// exit;
//end;
// symbols // symbols
if isSymbol(reader^) then if isSymbol(reader^) then
@ -926,7 +988,7 @@ begin
exit; exit;
end; end;
//Keyword - identifiers // Keywords & identifiers
if isFirstIdentifier(reader^) then if isFirstIdentifier(reader^) then
begin begin
fTokKind := tkIdent; fTokKind := tkIdent;