Skip to content

Commit 29f781e

Browse files
authored
Fix issues with "-". (#6)
Scan "-2" as two tokens: "-" and "2". This fixes issues with parsing "1 -2" etc.
1 parent 300c112 commit 29f781e

File tree

3 files changed

+10
-7
lines changed

3 files changed

+10
-7
lines changed

kalcy/src/scanner.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ auto Scanner::next() -> Token {
2424
if (at_end()) { return {}; }
2525

2626
auto out = Token{};
27-
if (match_number(out)) { return out; }
2827
if (match_single(out)) { return out; }
28+
if (match_number(out)) { return out; }
2929
if (match_identifier(out)) { return out; }
3030

3131
return {};

tests/tests/test_parser.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ ADD_TEST(ParseUnary) {
3434
}
3535

3636
ADD_TEST(ParseBinary) {
37-
auto result = parse("3+2");
37+
auto result = parse("3 -2");
3838
ASSERT(result != nullptr);
3939
ASSERT(std::holds_alternative<expr::Binary>(*result));
4040
auto const& binary = std::get<expr::Binary>(*result);
@@ -45,7 +45,7 @@ ADD_TEST(ParseBinary) {
4545
EXPECT(literal.token.type == Token::Type::eNumber);
4646
EXPECT(literal.token.value == 3.0); // NOLINT
4747

48-
EXPECT(binary.op.type == Token::Type::ePlus);
48+
EXPECT(binary.op.type == Token::Type::eMinus);
4949

5050
ASSERT(binary.right != nullptr);
5151
ASSERT(std::holds_alternative<expr::Literal>(*binary.right));
@@ -77,8 +77,12 @@ ADD_TEST(ParseCall) {
7777
ASSERT(std::holds_alternative<expr::Literal>(*pow_call.arguments[0]));
7878
EXPECT(std::get<expr::Literal>(*pow_call.arguments[0]).token.value == 42); // NOLINT
7979
ASSERT(pow_call.arguments[1] != nullptr);
80-
ASSERT(std::holds_alternative<expr::Literal>(*pow_call.arguments[1]));
81-
EXPECT(std::get<expr::Literal>(*pow_call.arguments[1]).token.value == -5); // NOLINT
80+
ASSERT(std::holds_alternative<expr::Unary>(*pow_call.arguments[1]));
81+
auto const& minus_5 = std::get<expr::Unary>(*pow_call.arguments[1]);
82+
EXPECT(minus_5.op.type == Token::Type::eMinus);
83+
ASSERT(minus_5.right != nullptr);
84+
ASSERT(std::holds_alternative<expr::Literal>(*minus_5.right));
85+
EXPECT(std::get<expr::Literal>(*minus_5.right).token.value == 5); // NOLINT
8286
}
8387

8488
ADD_TEST(ParseErrorOnExtraneous) {

tests/tests/test_scanner.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,7 @@ ADD_TEST(ScanIdentifiers) {
3636

3737
ADD_TEST(ScanNumbers) {
3838
EXPECT(match_number("3", 3));
39-
EXPECT(match_number("-42", -42));
40-
EXPECT(match_number("-4.2", -4.2)); // NOLINT
39+
EXPECT(match_number("4.2", 4.2)); // NOLINT
4140
}
4241

4342
ADD_TEST(ScanMultiple) {

0 commit comments

Comments
 (0)