srctree

Robin Linden parent 099560a8 b8d4ea5f
css2: Handle integers w/ a +-prefix

inlinesplit
css2/tokenizer.cpp added: 35, removed: 5, total 30
@@ -63,6 +63,16 @@ void Tokenizer::run() {
case ')':
emit(CloseParenToken{});
continue;
case '+': {
// TODO(robinlinden): This only handles integers.
if (auto next_input = peek_input(0); next_input && util::is_digit(*next_input)) {
auto number = consume_number(*c);
emit(NumberToken{number.second, number.first});
} else {
emit(DelimToken{'+'});
}
continue;
}
case ',':
emit(CommaToken{});
continue;
@@ -319,10 +329,14 @@ std::pair<std::variant<int, double>, NumericType> Tokenizer::consume_number(char
std::variant<int, double> result{};
std::string repr{};
 
// TODO(robinlinden): Step 2
std::optional<char> next_input;
if (first_byte == '+') {
next_input = consume_next_input_character();
} else {
next_input = first_byte;
}
 
for (std::optional<char> next_input = first_byte; next_input && util::is_digit(*next_input);
next_input = consume_next_input_character()) {
for (; next_input && util::is_digit(*next_input); next_input = consume_next_input_character()) {
repr += *next_input;
}
 
 
css2/tokenizer_test.cpp added: 35, removed: 5, total 30
@@ -316,5 +316,21 @@ int main() {
expect_token(output, NumberToken{.data = 1});
});
 
etest::test("plus: number", [] {
auto output = run_tokenizer("+13");
expect_token(output, NumberToken{.data = 13});
});
 
etest::test("plus: number w/ leading 0", [] {
auto output = run_tokenizer("+00000001");
expect_token(output, NumberToken{.data = 1});
});
 
etest::test("plus: delim", [] {
auto output = run_tokenizer("+hello");
expect_token(output, DelimToken{'+'});
expect_token(output, IdentToken{"hello"});
});
 
return etest::run_all_tests();
}