Something went wrong. Try again.
🌱 A minimal programming language and compiler. git.urbach.dev/cli/q
high-performance programming-language compiler
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566package scanner
import ( "git.urbach.dev/cli/q/src/errors" "git.urbach.dev/cli/q/src/fs" "git.urbach.dev/cli/q/src/token")
// scanExtern scans a block of external libraries.func (s *scanner) scanExtern(file *fs.File, tokens token.List, i int) (int, error) { i++
if tokens[i].Kind != token.BlockStart { return i, errors.NewAt(MissingBlockStart, file, tokens[i].Position) }
for i < len(tokens) { switch tokens[i].Kind { case token.Identifier: var err error i, err = s.scanExternLibrary(file, tokens, i)
if err != nil { return i, err } case token.BlockEnd: return i, nil }
i++ }
return i, errors.NewAt(MissingBlockEnd, file, tokens[i-1].End())}
// scanExternLibrary scans a block of external function declarations.func (s *scanner) scanExternLibrary(file *fs.File, tokens token.List, i int) (int, error) { dllName := tokens[i].StringFrom(file.Bytes) i++
if tokens[i].Kind != token.BlockStart { return i, errors.NewAt(MissingBlockStart, file, tokens[i].Position) }
i++
for i < len(tokens) { switch tokens[i].Kind { case token.Identifier: function, j, err := scanFunctionSignature(file, dllName, tokens, i, token.NewLine)
if err != nil { return j, err }
i = j s.items <- function case token.BlockEnd: return i, nil }
i++ }
return i, errors.NewAt(MissingBlockEnd, file, tokens[i-1].End())}