diff --git a/pkg/saccharine/token/parse.go b/pkg/saccharine/token/parse.go index ef0ad15..d0e3065 100644 --- a/pkg/saccharine/token/parse.go +++ b/pkg/saccharine/token/parse.go @@ -77,6 +77,23 @@ func getToken(i *iterator.Iterator[rune]) (*Token, error) { } case letter == ';': return NewHardBreak(index), nil + case letter == '#': + // Skip everything until the next newline or EOF + for { + if i.Done() { + break + } + r, err := i.Next() + if err != nil { + return nil, trace.Wrap(err, "error while parsing comment") + } + if r == '\n' { + // Put the newline back so it can be processed as a soft break + i.Back() + break + } + } + return nil, nil case unicode.IsSpace(letter): return nil, nil case isVariable(letter): diff --git a/tests/comments.expected b/tests/comments.expected new file mode 100644 index 0000000..2dfe6a3 --- /dev/null +++ b/tests/comments.expected @@ -0,0 +1 @@ +VALUE diff --git a/tests/comments.test b/tests/comments.test new file mode 100644 index 0000000..11d25dd --- /dev/null +++ b/tests/comments.test @@ -0,0 +1,15 @@ +# This is a full-line comment at the start +# The following defines the identity function +identity := \x.x # This is an end-of-line comment + +# Define a simple function that applies a function twice +twice := \f.\x.(f (f x)) + +# Test that comments don't interfere with expressions +result := (twice identity VALUE) # Should just return VALUE + +# Multiple comments in a row +# can appear anywhere +# without breaking the code + +result # Final comment at the end