|
@@ -4,8 +4,9 @@ import (
|
|
|
"bufio"
|
|
"bufio"
|
|
|
"fmt"
|
|
"fmt"
|
|
|
"github/runnignwater/monkey/lexer"
|
|
"github/runnignwater/monkey/lexer"
|
|
|
- "github/runnignwater/monkey/token"
|
|
|
|
|
|
|
+ "github/runnignwater/monkey/parser"
|
|
|
"io"
|
|
"io"
|
|
|
|
|
+ "log"
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -27,11 +28,35 @@ func Start(in io.Reader, out io.Writer) {
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
line := scanner.Text()
|
|
line := scanner.Text()
|
|
|
-
|
|
|
|
|
l := lexer.New(line)
|
|
l := lexer.New(line)
|
|
|
|
|
+ p := parser.New(l)
|
|
|
|
|
+
|
|
|
|
|
+ program := p.ParseProgram()
|
|
|
|
|
+ if len(p.Errors()) != 0 {
|
|
|
|
|
+ printParserErrors(out, p.Errors())
|
|
|
|
|
+ continue
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- for tok := l.NextToken(); tok.Type != token.EOF; tok = l.NextToken() {
|
|
|
|
|
- fmt.Printf("%+v\n", tok)
|
|
|
|
|
|
|
+ if _, err := io.WriteString(out, program.String()); err != nil {
|
|
|
|
|
+ log.Fatal(err)
|
|
|
|
|
+ }
|
|
|
|
|
+ if _, err := io.WriteString(out, "\n"); err != nil {
|
|
|
|
|
+ log.Fatal(err)
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func printParserErrors(out io.Writer, errors []string) {
|
|
|
|
|
+ if _, err := io.WriteString(out, "Woops! we ran into some monkey business here!\n"); err != nil {
|
|
|
|
|
+ log.Fatal(err)
|
|
|
|
|
+ }
|
|
|
|
|
+ if _, err := io.WriteString(out, " parser errors:\n"); err != nil {
|
|
|
|
|
+ log.Fatal(err)
|
|
|
|
|
+ }
|
|
|
|
|
+ for _, msg := range errors {
|
|
|
|
|
+ _, err := io.WriteString(out, "\t"+msg+"\n")
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ return
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|