diff --git a/src/build/token/Tokenize.go b/src/build/token/Tokenize.go index 63ad4f7..52b3122 100644 --- a/src/build/token/Tokenize.go +++ b/src/build/token/Tokenize.go @@ -131,7 +131,15 @@ func Tokenize(buffer []byte) List { i++ } - tokens = append(tokens, Token{Kind: Number, Position: position, Length: Length(i - position)}) + last := len(tokens) - 1 + + if len(tokens) > 0 && tokens[last].Kind == Negate { + tokens[last].Kind = Number + tokens[last].Length = Length(i-position) + 1 + } else { + tokens = append(tokens, Token{Kind: Number, Position: position, Length: Length(i - position)}) + } + continue } diff --git a/src/build/token/Tokenize_test.go b/src/build/token/Tokenize_test.go index de67fbd..86ad7be 100644 --- a/src/build/token/Tokenize_test.go +++ b/src/build/token/Tokenize_test.go @@ -166,6 +166,19 @@ func TestNegateAfterOperator(t *testing.T) { } } +func TestNegateNumber(t *testing.T) { + tokens := token.Tokenize([]byte(`-1`)) + + expected := []token.Kind{ + token.Number, + token.EOF, + } + + for i, kind := range expected { + assert.Equal(t, tokens[i].Kind, kind) + } +} + func TestOperatorAssign(t *testing.T) { tokens := token.Tokenize([]byte(`a += b -= c *= d /= e &= f |= g ^= h <<= i >>= j`)) diff --git a/tests/programs/negative.q b/tests/programs/negative.q new file mode 100644 index 0000000..2bddfb7 --- /dev/null +++ b/tests/programs/negative.q @@ -0,0 +1,5 @@ +main() { + a := -32 + b := 64 + syscall(60, a + b) +} \ No newline at end of file diff --git a/tests/programs_test.go b/tests/programs_test.go index 1282e2e..82a9d42 100644 --- a/tests/programs_test.go +++ b/tests/programs_test.go @@ -42,6 +42,7 @@ var programs = []struct { {"loop", "", "", 0}, {"loop-lifetime", "", "", 0}, {"assert", "", "", 1}, + {"negative", "", "", 32}, } func TestPrograms(t *testing.T) {