From 0f19b677a256ed698ae7371f105b5e392b178c4b Mon Sep 17 00:00:00 2001 From: hellerve Date: Tue, 15 May 2018 04:05:25 +0200 Subject: [PATCH] all: getting closer to being able to read the stdlib --- main.go | 41 ++++++++++++++++++++--------------------- parser/parser.go | 24 +++++++++++++++++++++++- 2 files changed, 43 insertions(+), 22 deletions(-) diff --git a/main.go b/main.go index 0458fd0..5d0475c 100644 --- a/main.go +++ b/main.go @@ -70,40 +70,39 @@ func runRepl() { func runFile(path string) { e := eval.RootEnv() m := macro.NewMacroEnv() - input, err := ioutil.ReadFile(path) + inp, err := ioutil.ReadFile(path) if err != nil { fmt.Println(err) return } - parsed, err, unconsumed := parser.Parse(string(input)) + input := string(inp) + + parsed, err := parser.ParseAll(input) if err != nil { fmt.Println(err) return } - if len(unconsumed) != 0 { - fmt.Println("Unconsumed input:", strings.Join(unconsumed, " ")) - return + for _, statement := range parsed { + expanded, err := macro.Expand(statement, m) + + if err != nil { + fmt.Println(err) + return + } + + evald, err := eval.Eval(expanded, e) + + if err != nil { + fmt.Println(err) + return + } + + fmt.Println(evald.Pretty()) } - - expanded, err := macro.Expand(parsed, m) - - if err != nil { - fmt.Println(err) - return - } - - evald, err := eval.Eval(expanded, e) - - if err != nil { - fmt.Println(err) - return - } - - fmt.Println(evald.Pretty()) } func main() { diff --git a/parser/parser.go b/parser/parser.go index 2190fe5..4211e1d 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -30,6 +30,7 @@ func tokenize(input string) []string { withoutComments := string(comments.ReplaceAll([]byte(input), []byte(""))) explodedParens := explode(withoutComments, "(", ")") explodedBrackets := explode(explodedParens, "[", "]") + // TODO this consumes multiple spaces return withoutEmpty(whitespace.Split(explodedBrackets, -1)) } @@ -75,7 +76,8 @@ func parseValue(input []string) (*ast.AST, error, []string) { } if input[0][0] == '"' { - var agg []string + agg := []string{input[0]} + input = input[1:] for { if len(input) == 0 { return nil, errors.New("Unmatched \""), input @@ -233,3 +235,23 @@ func parseToken(input []string) (*ast.AST, error, []string) { func Parse(input string) (*ast.AST, error, []string) { return parseToken(tokenize(input)) } + +func ParseAll(input string) ([]*ast.AST, error) { + tokens := tokenize(input) + var res []*ast.AST + for { + if len(tokens) == 0 { + break + } + + parsed, err, unconsumed := parseToken(tokens) + + if err != nil { + return res, err + } + + res = append(res, parsed) + tokens = unconsumed + } + return res, nil +}