fsprojects / FsLexYacc

Lexer and parser generators for F#
http://fsprojects.github.io/FsLexYacc/
MIT License
203 stars 68 forks source link

LexBuffer<char>.LexemeSpan #172

Open bent-rasmussen opened 11 months ago

bent-rasmussen commented 11 months ago

LexBuffer<'char> has this static method:

static member LexemeString(lexbuf: LexBuffer<char>) =
    System.String(lexbuf.Buffer, lexbuf.BufferScanStart, lexbuf.LexemeLength)

See https://github.com/fsprojects/FsLexYacc/blob/master/src/FsLexYacc.Runtime/Lexing.fs#L178C58-L178C58

We would like to try and get access to the buffer, without necessarily allocating a string, e.g.:

#if NETSTANDARD2_1
static member LexemeSpan(lexbuf: LexBuffer<char>) =
    new ReadOnlySpan<char>(lexbuf.Buffer, lexbuf.BufferScanStart, lexbuf.LexemeLength)
#endif

For example, we could use a StringPool to reuse prior allocations of equivalent strings:

let ident = StringPool.Shared.GetOrAdd(lexemeSpan)