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.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475package scanner
import ( "git.urbach.dev/cli/q/src/errors" "git.urbach.dev/cli/q/src/fs" "git.urbach.dev/cli/q/src/token")
// scanFile scans a single file.func (s *scanner) scanFile(path string, pkg string) error { contents, err := fs.ReadFile(path)
if err != nil { return err }
file := fs.NewFile(path, pkg, contents) s.items <- file tokens := file.Tokens
for i := 0; i < len(tokens); i++ { switch tokens[i].Kind { case token.NewLine: case token.Comment: case token.Identifier: if i+1 >= len(tokens) { return errors.NewAt(InvalidFunctionDefinition, file, tokens[i].End()) }
next := tokens[i+1]
switch next.Kind { case token.GroupStart: i, err = s.scanFunction(file, tokens, i) case token.BlockStart: i, err = s.scanStruct(file, tokens, i) case token.GroupEnd: return errors.NewAt(MissingGroupStart, file, next.Position) case token.BlockEnd: return errors.NewAt(MissingBlockStart, file, next.Position) case token.Invalid: return errors.New(&InvalidCharacter{Character: next.StringFrom(file.Bytes)}, file, next) default: name := tokens[i].StringFrom(file.Bytes)
if name == "func" || name == "fn" || name == "def" { return errors.New(&UnexpectedIdentifier{Keyword: name, Name: next.StringFrom(file.Bytes)}, file, tokens[i]) }
return errors.NewAt(InvalidFunctionDefinition, file, next.Position) } case token.Const: i, err = s.scanConst(file, tokens, i) case token.Extern: i, err = s.scanExtern(file, tokens, i) case token.Import: i, err = s.scanImport(file, tokens, i) case token.Local, token.Global: i, err = s.scanGlobal(file, tokens, i) case token.EOF: return nil case token.Invalid: return errors.New(&InvalidCharacter{Character: tokens[i].StringFrom(file.Bytes)}, file, tokens[i]) case token.Script: default: return errors.New(InvalidTopLevel, file, tokens[i]) }
if err != nil { return err } }
return nil}