aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMel <einebeere@gmail.com>2022-12-18 01:33:22 +0100
committerMel <einebeere@gmail.com>2022-12-18 01:33:22 +0100
commitacb34cc0edcff326654714ebb19907e51562b384 (patch)
tree0b67b3490a6394786cf4aec234ca5f6cc4d0100e
parenta43f374ffed8ab5d64acd122702826c9c41b8954 (diff)
downloadjinx-main.tar.zst
jinx-main.zip
Skip comments in scannerHEADmain
-rw-r--r--pkg/lang/scanner/scanner.go13
-rw-r--r--pkg/lang/scanner/scanner_test.go23
2 files changed, 33 insertions, 3 deletions
diff --git a/pkg/lang/scanner/scanner.go b/pkg/lang/scanner/scanner.go
index eb7da89..e1f8edf 100644
--- a/pkg/lang/scanner/scanner.go
+++ b/pkg/lang/scanner/scanner.go
@@ -48,7 +48,7 @@ func (s *Scanner) scanToken() (token.Token, error) {
return token.Token{}, ErrScannerFinished
}
- hadNewline, firstNewline, err := s.skipWhitespace()
+ hadNewline, firstNewline, err := s.skipNonCode()
if err != nil {
return token.Token{}, err
}
@@ -314,7 +314,8 @@ func (s *Scanner) scanNumber() (token.Token, error) {
return token.New(token.Int, loc, num), nil
}
-func (s *Scanner) skipWhitespace() (bool, source.Loc, error) {
+func (s *Scanner) skipNonCode() (bool, source.Loc, error) {
+ isInComment := false
hadNewline := false
firstNewline := source.Loc{}
@@ -329,7 +330,13 @@ func (s *Scanner) skipWhitespace() (bool, source.Loc, error) {
hadNewline = true
}
- if eof || !unicode.IsSpace(c) {
+ if isInComment {
+ if c == '\n' {
+ isInComment = false
+ }
+ } else if c == '#' {
+ isInComment = true
+ } else if eof || !unicode.IsSpace(c) {
break
}
diff --git a/pkg/lang/scanner/scanner_test.go b/pkg/lang/scanner/scanner_test.go
index 4df4b23..fa46152 100644
--- a/pkg/lang/scanner/scanner_test.go
+++ b/pkg/lang/scanner/scanner_test.go
@@ -179,3 +179,26 @@ func TestEmojiInStrings(t *testing.T) {
require.Equal(t, expected, tokens)
}
+
+func TestComments(t *testing.T) {
+ src := `
+ # Assignment to 'x'
+ x = 1 # x will be equal to 1
+ `
+
+ s := scanner.New(strings.NewReader(src))
+
+ tokens, err := s.Scan()
+ require.NoError(t, err)
+
+ expected := []token.Token{
+ token.Simple(token.EOL, source.NewLoc(0, 0)),
+ token.New(token.Ident, source.NewLoc(2, 1), "x"),
+ token.Simple(token.Assign, source.NewLoc(2, 3)),
+ token.New(token.Int, source.NewLoc(2, 5), uint64(1)),
+ token.Simple(token.EOL, source.NewLoc(2, 29)),
+ token.Simple(token.EOF, source.NewLoc(3, 1)),
+ }
+
+ require.Equal(t, expected, tokens)
+}