Skip to content

Commit 8975f02

Browse files
authored
some Token::flags() improvements (#285)
1 parent 9dc2c3d commit 8975f02

2 files changed

Lines changed: 62 additions & 2 deletions

File tree

simplecpp.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,8 @@ namespace simplecpp {
113113
name = (std::isalpha(static_cast<unsigned char>(string[0])) || string[0] == '_' || string[0] == '$')
114114
&& (std::memchr(string.c_str(), '\'', string.size()) == nullptr);
115115
comment = string.size() > 1U && string[0] == '/' && (string[1] == '/' || string[1] == '*');
116-
number = std::isdigit(static_cast<unsigned char>(string[0])) || (string.size() > 1U && string[0] == '-' && std::isdigit(static_cast<unsigned char>(string[1])));
117-
op = (string.size() == 1U) ? string[0] : '\0';
116+
number = std::isdigit(static_cast<unsigned char>(string[0])) || (string.size() > 1U && (string[0] == '-' || string[0] == '+') && std::isdigit(static_cast<unsigned char>(string[1])));
117+
op = (string.size() == 1U && !name && !comment && !number) ? string[0] : '\0';
118118
}
119119

120120
const TokenString& str() const {

test.cpp

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2440,6 +2440,64 @@ static void cpluscplusDefine()
24402440
ASSERT_EQUALS("\n201103L", preprocess(code, dui));
24412441
}
24422442

2443+
static void assertToken(const std::string& s, bool name, bool number, bool comment, char op, int line)
2444+
{
2445+
const std::vector<std::string> f;
2446+
const simplecpp::Location l(f);
2447+
const simplecpp::Token t(s, l);
2448+
assertEquals(name, t.name, line);
2449+
assertEquals(number, t.number, line);
2450+
assertEquals(comment, t.comment, line);
2451+
assertEquals(op, t.op, line);
2452+
}
2453+
2454+
#define ASSERT_TOKEN(s, na, nu, c) assertToken(s, na, nu, c, '\0', __LINE__)
2455+
#define ASSERT_TOKEN_OP(s, na, nu, c, o) assertToken(s, na, nu, c, o, __LINE__)
2456+
2457+
static void token()
2458+
{
2459+
// name
2460+
ASSERT_TOKEN("n", true, false, false);
2461+
ASSERT_TOKEN("name", true, false, false);
2462+
ASSERT_TOKEN("name_1", true, false, false);
2463+
ASSERT_TOKEN("name2", true, false, false);
2464+
ASSERT_TOKEN("name$", true, false, false);
2465+
2466+
// character literal
2467+
ASSERT_TOKEN("'n'", false, false, false);
2468+
ASSERT_TOKEN("'\\''", false, false, false);
2469+
ASSERT_TOKEN("'\\u0012'", false, false, false);
2470+
ASSERT_TOKEN("'\\xff'", false, false, false);
2471+
ASSERT_TOKEN("u8'\\u0012'", false, false, false);
2472+
ASSERT_TOKEN("u'\\u0012'", false, false, false);
2473+
ASSERT_TOKEN("L'\\u0012'", false, false, false);
2474+
ASSERT_TOKEN("U'\\u0012'", false, false, false);
2475+
2476+
// include
2477+
ASSERT_TOKEN("<include>", false, false, false);
2478+
2479+
// comment
2480+
ASSERT_TOKEN("/*comment*/", false, false, true);
2481+
ASSERT_TOKEN("// TODO", false, false, true);
2482+
2483+
// string literal
2484+
ASSERT_TOKEN("\"literal\"", false, false, false);
2485+
2486+
// op
2487+
ASSERT_TOKEN_OP("<", false, false, false, '<');
2488+
ASSERT_TOKEN_OP(">", false, false, false, '>');
2489+
ASSERT_TOKEN_OP("(", false, false, false, '(');
2490+
ASSERT_TOKEN_OP(")", false, false, false, ')');
2491+
2492+
// number
2493+
ASSERT_TOKEN("2", false, true, false);
2494+
ASSERT_TOKEN("22", false, true, false);
2495+
ASSERT_TOKEN("-2", false, true, false);
2496+
ASSERT_TOKEN("-22", false, true, false);
2497+
ASSERT_TOKEN("+2", false, true, false);
2498+
ASSERT_TOKEN("+22", false, true, false);
2499+
}
2500+
24432501
int main(int argc, char **argv)
24442502
{
24452503
TEST_CASE(backslash);
@@ -2648,5 +2706,7 @@ int main(int argc, char **argv)
26482706
TEST_CASE(stdcVersionDefine);
26492707
TEST_CASE(cpluscplusDefine);
26502708

2709+
TEST_CASE(token);
2710+
26512711
return numberOfFailedAssertions > 0 ? EXIT_FAILURE : EXIT_SUCCESS;
26522712
}

0 commit comments

Comments
 (0)