Fixed build tokens not unwrapping when both EOL and EOF occur

This commit is contained in:
Emile Clark-Boman 2025-06-18 02:35:51 +10:00
parent 3ce9390be4
commit 90ca138904
4 changed files with 32 additions and 8 deletions

View file

@ -8,7 +8,8 @@ when isMainModule:
if paramCount() > 0: if paramCount() > 0:
let filename = paramStr(1) let filename = paramStr(1)
var tokStream = newTokStream(filename, isFile=true) var tokStream = newTokStream(filename, isFile=true)
# DumpTok
var tok: nlTok var tok: nlTok
while tokStream.nextTok(tok): while tokStream.nextTok(tok):
echo tok echo tok

View file

@ -6,6 +6,7 @@ type
nlTokStream = object nlTokStream = object
lstream: nlLStream lstream: nlLStream
build: nlTok # the build token build: nlTok # the build token
closed: bool # EOF + all tokens built
# Generates an EOL token for the nlTokStream's state # Generates an EOL token for the nlTokStream's state
proc EOLTok*(tokStream: nlTokStream): nlTok = proc EOLTok*(tokStream: nlTokStream): nlTok =

View file

@ -4,6 +4,7 @@ include tokbuilding
proc newTokStream*(content: string, isFile: bool = false): nlTokStream = proc newTokStream*(content: string, isFile: bool = false): nlTokStream =
result = nlTokStream( result = nlTokStream(
lstream: newLStream(content, isFile=isFile), lstream: newLStream(content, isFile=isFile),
closed: false,
) )
# 1. initialise an empty build token # 1. initialise an empty build token
# 2. progress to the first line # 2. progress to the first line
@ -27,12 +28,20 @@ proc progChar(tokStream: var nlTokStream): bool =
# NOTE: progBuild adds lstream's current char to the build token # NOTE: progBuild adds lstream's current char to the build token
# NOTE: progChar progresses to lstream's next char # NOTE: progChar progresses to lstream's next char
proc nextTok*(tokStream: var nlTokStream, tok: var nlTok): bool = proc nextTok*(tokStream: var nlTokStream, tok: var nlTok): bool =
# Return prematurely if already closed
if tokStream.closed:
return false
while true: while true:
var buildTok: Option[nlTok] var buildTok: Option[nlTok]
let canProgress = tokStream.progBuild(buildTok) let
# canProgress & progression failed => EOF reached canProgress = tokStream.progBuild(buildTok)
if canProgress and not tokStream.progChar(): tokBuilt = buildTok.isSome
return false # canProgress & EOF reached => no more tokens to build :)
elif buildTok.isSome: # NOTE: reachedEOF and not canProgress => more tokens unwrapping
if tokBuilt:
tok = buildTok.get() tok = buildTok.get()
if canProgress and not tokStream.progChar():
tokStream.closed = true
return tokBuilt
elif tokBuilt:
return true return true

View file

@ -1,7 +1,20 @@
import ../lexer/tokstream
# Greed will consume anything except a punishment
proc greed(tokStream: nlTokStream, toks: var seq[nlTok], punish: str) =
proc parse_strl(tokStream: nlTokStream): nlNode =
# Attempt to form an nlAST from a nlTokStream # Attempt to form an nlAST from a nlTokStream
proc arborise(tokStream: nlTokStream): nlNode = proc parse(tokStream: nlTokStream): nlNode =
for tok in toks(tokStream): var tok: nlTok
while true:
case tok.tokType: case tok.tokType:
of nlTokType.DQUO: of nlTokType.DQUO:
# Attempt to parse string literal # Attempt to parse string literal
parse_strl() parse_strl()
if not tokStream.nextTok(tok):
break