فهرست منبع

finish parser

simon 3 سال پیش
والد
کامیت
cb6a65d8f7
1فایلهای تغییر یافته به همراه29 افزوده شده و 4 حذف شده
  1. 29 4
      repl/repl.go

+ 29 - 4
repl/repl.go

@@ -4,8 +4,9 @@ import (
 	"bufio"
 	"fmt"
 	"github/runnignwater/monkey/lexer"
-	"github/runnignwater/monkey/token"
+	"github/runnignwater/monkey/parser"
 	"io"
+	"log"
 )
 
 /**
@@ -27,11 +28,35 @@ func Start(in io.Reader, out io.Writer) {
 			return
 		}
 		line := scanner.Text()
-
 		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
 		}
 	}
 }