From 0ec2df58538bd986af0765fa36b0dc1ba9c15aa5 Mon Sep 17 00:00:00 2001 From: Kyle Gunger Date: Sun, 28 Jun 2020 16:48:22 -0400 Subject: [Bugfix] Literals and Comments + Fix literal value parsing + Remove comments from the tokenized result --- src/tparse/parse.go | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 74 insertions(+), 3 deletions(-) (limited to 'src/tparse/parse.go') diff --git a/src/tparse/parse.go b/src/tparse/parse.go index e9e1ee6..4f25fe3 100644 --- a/src/tparse/parse.go +++ b/src/tparse/parse.go @@ -40,6 +40,8 @@ func stringLiteral(r *bufio.Reader) Token { } b := strings.Builder{} + b.WriteRune(run) + run, _, err = r.ReadRune() for ; err == nil; run, _, err = r.ReadRune() { b.WriteRune(run) @@ -64,6 +66,8 @@ func charLiteral(r *bufio.Reader) Token { } b := strings.Builder{} + b.WriteRune(run) + run, _, err = r.ReadRune() for ; err == nil; run, _, err = r.ReadRune() { b.WriteRune(run) @@ -107,6 +111,31 @@ func splitResRunes(str string, max int) []Token { return out } +// Remove block comments +func stripBlockComments(t []Token) []Token { + out := []Token{} + bc := false + for _, tok := range t { + if tok.Type == DELIMIT && tok.Data == "/#" { + bc = true + continue + } + + if tok.Type == DELIMIT && tok.Data == "#/" { + bc = false + continue + } + + if bc { + continue + } + + out = append(out, tok) + } + + return out +} + // ParseFile tries to read a file and turn it into a series of tokens func ParseFile(path string) []Token { out := []Token{} @@ -123,7 +152,7 @@ func ParseFile(path string) []Token { max := maxResRunes() - for r := ' '; ; r, _, err = read.ReadRune() { + for r := rune(' '); ; r, _, err = read.ReadRune() { // If error in stream or EOF, break if err != nil { if err != io.EOF { @@ -141,6 +170,37 @@ func ParseFile(path string) []Token { continue } + if unicode.IsNumber(r) && b.String() == "" { + read.UnreadRune() + out = append(out, numericLiteral(read)) + + continue + } + + if r == '\'' { + if b.String() != "" { + out = append(out, Token{Type: checkToken(b.String()), Data: b.String()}) + b.Reset() + } + + read.UnreadRune() + out = append(out, charLiteral(read)) + + continue + } + + if r == '"' { + if b.String() != "" { + out = append(out, Token{Type: checkToken(b.String()), Data: b.String()}) + b.Reset() + } + + read.UnreadRune() + out = append(out, stringLiteral(read)) + + continue + } + // Checking for a rune group if checkResRune(r) != -1 { if b.String() != "" { @@ -157,7 +217,18 @@ func ParseFile(path string) []Token { read.UnreadRune() - out = append(out, splitResRunes(b.String(), max)...) + rgs := splitResRunes(b.String(), max) + + // Line Comments + for i, rg := range rgs { + if rg.Data == "#" { + rgs = rgs[:i] + read.ReadString('\n') + break + } + } + + out = append(out, rgs...) b.Reset() @@ -168,7 +239,7 @@ func ParseFile(path string) []Token { b.WriteRune(r) } - return out + return stripBlockComments(out) } // StringAsRunes returns a string as a rune slice -- cgit v1.2.3