diff --git a/file/error.go b/file/error.go index c5bd7c4..e7f72e4 100644 --- a/file/error.go +++ b/file/error.go @@ -63,6 +63,7 @@ func (err Error) Error () (formattedMessage string) { columnCountdown -- } for err.width > 1 { + // TODO: for tabs, print out 8 of these instead. formattedMessage += "-" } formattedMessage += "-\n" diff --git a/lexer/lexer.go b/lexer/lexer.go index 058e96f..1e543b4 100644 --- a/lexer/lexer.go +++ b/lexer/lexer.go @@ -59,8 +59,18 @@ func (lexer *LexingOperation) tokenizeSymbolBeginning () (err error) { } case '\t': // indent level - // TODO: throw error if tab is not at line beginning, or after - // other tab + previousToken := lexer.tokens[len(lexer.tokens) - 1] + + if !previousToken.Is(TokenKindNewline) || + !previousToken.Is(TokenKindNewline) { + + file.NewError ( + lexer.file.Location(), 1, + "tab not used as indent", + file.ErrorKindWarn) + break + } + for lexer.char == '\t' { lexer.addToken (Token { kind: TokenKindIndent, diff --git a/lexer/token.go b/lexer/token.go index d6d6e90..5454bab 100644 --- a/lexer/token.go +++ b/lexer/token.go @@ -62,6 +62,11 @@ func (token Token) Kind () (kind TokenKind) { return token.kind } +// Is returns whether or not the token is of kind kind. +func (token Token) Is (kind TokenKind) (match bool) { + return token.kind == kind +} + // Value returns the value of the token. Depending on what kind of token it is, // this value may be nil. func (token Token) Value () (value any) {