func runFile(name string) *parser.Block { os.Chdir(filepath.Dir(name)) file, err := util.NewFile(filepath.Base(name) + "." + util.FileExtension) if err != nil { reportError(err.Error(), false) } lex := lexer.NewLexerFromFile(file) err = lex.Lex() if err != nil { reportError(err.Error(), false) } nodes, err := parser.Nodes(lex.Tokens) if err != nil { reportError(err.Error(), false) } block := parser.NewBlock(nodes, nil, file) setDefaults(block.Scope) err = block.Exec() if err != nil { reportError(err.Error(), false) } return block }
func useFile(context *parser.FunctionCallContext) error { values, err := parser.ValidateArguments(context, "use-file", parser.VALUE_STRING) if err != nil { return err } file, err := util.NewFile(values[0].S) if err != nil { return err } lex := lexer.NewLexerFromFile(file) err = lex.Lex() if err != nil { return err } nodes, err := parser.Nodes(lex.Tokens) if err != nil { return err } fileBlock := parser.NewBlock(nodes, context.Block, file) err = fileBlock.Exec() if err != nil { return err } for key, value := range fileBlock.Scope.Symbols { if value.Exported { context.Block.Scope.SetSymbol(key, value) } } fileBlock.Stack.PopAllToOtherStack(context.Block.Stack) return nil }
func runRepl() *parser.Block { var tokens []*lexer.Token depth := 0 block := parser.NewBlock(nil, nil, nil) setDefaults(block.Scope) for { reader := bufio.NewReader(os.Stdin) fmt.Print("> ") data, _ := reader.ReadString('\n') lex := lexer.NewLexer([]rune(data)) err := lex.Lex() if err != nil { reportError(err.Error(), true) } else { for _, token := range lex.Tokens { tokens = append(tokens, token) } for _, token := range lex.Tokens { if token.IsOpening() { depth++ } else if token.IsClosing() { depth-- } } if depth <= 0 { nodes, err := parser.Nodes(tokens) tokens = nil depth = 0 if err != nil { reportError(err.Error(), true) } else { block.Nodes = nodes err := block.Exec() if err != nil { reportError(err.Error(), true) } if block.Stack.Len() > 0 { fmt.Print(util.COLOR_YELLOW) for i := 0; i < block.Stack.Len(); i++ { fmt.Print(block.Stack.Peek(i).(*parser.Value).String() + " ") } fmt.Print(util.COLOR_RESET + "\n") } } } } } return block }