Skip to content

Commit 2d407ce

Browse files
committed
fix: Avoid splitting >= and >>= tokens
1 parent 85aee66 commit 2d407ce

File tree

4 files changed

+28
-136
lines changed

4 files changed

+28
-136
lines changed

src/parser/cxx/lexer.cc

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -457,29 +457,20 @@ auto Lexer::readToken() -> TokenKind {
457457
return TokenKind::T_LESS;
458458

459459
case '>':
460-
if (preprocessing_) {
461-
if (pos_ != end_ && LA() == '=') {
462-
consume();
463-
return TokenKind::T_GREATER_EQUAL;
464-
}
465-
if (pos_ != end_ && LA() == '>') {
460+
if (pos_ != end_ && LA() == '=') {
461+
consume();
462+
return TokenKind::T_GREATER_EQUAL;
463+
} else if (pos_ != end_ && LA() == '>') {
464+
if (LA(1) == '=') {
465+
consume(2);
466+
return TokenKind::T_GREATER_GREATER_EQUAL;
467+
} else if (preprocessing_) {
466468
consume();
467-
if (pos_ != end_ && LA() == '=') {
468-
consume();
469-
return TokenKind::T_GREATER_GREATER_EQUAL;
470-
}
471469
return TokenKind::T_GREATER_GREATER;
472470
}
473-
} else if (LA() == '>') {
474-
TokenKind k = TokenKind::T_GREATER_GREATER;
475471

476-
if (LA(1) == '=') k = TokenKind::T_GREATER_GREATER_EQUAL;
477-
478-
tokenValue_.tokenKindValue = k;
479-
} else if (LA() == '=') {
480-
tokenValue_.tokenKindValue = TokenKind::T_GREATER_EQUAL;
472+
tokenValue_.tokenKindValue = TokenKind::T_GREATER_GREATER;
481473
}
482-
483474
return TokenKind::T_GREATER;
484475

485476
case '/': {

src/parser/cxx/parser.cc

Lines changed: 18 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,8 @@ void Parser::setCheckTypes(bool checkTypes) { checkTypes_ = checkTypes; }
112112
auto Parser::prec(TokenKind tk) -> Parser::Prec {
113113
switch (tk) {
114114
default:
115-
cxx_runtime_error("expected a binary operator");
115+
cxx_runtime_error(fmt::format("expected a binary operator, found {}",
116+
Token::spell(tk)));
116117

117118
case TokenKind::T_DOT_STAR:
118119
case TokenKind::T_MINUS_GREATER_STAR:
@@ -331,40 +332,6 @@ auto Parser::parse_greater_greater() -> bool {
331332
return false;
332333
}
333334

334-
auto Parser::parse_greater_greater_equal() -> bool {
335-
const auto saved = currentLocation();
336-
337-
SourceLocation greaterLoc;
338-
SourceLocation secondGreaterLoc;
339-
SourceLocation equalLoc;
340-
341-
if (match(TokenKind::T_GREATER, greaterLoc) && parse_nospace() &&
342-
match(TokenKind::T_GREATER, secondGreaterLoc) && parse_nospace() &&
343-
match(TokenKind::T_EQUAL, equalLoc)) {
344-
return true;
345-
}
346-
347-
rewind(saved);
348-
349-
return false;
350-
}
351-
352-
auto Parser::parse_greater_equal() -> bool {
353-
const auto saved = currentLocation();
354-
355-
SourceLocation greaterLoc;
356-
SourceLocation equalLoc;
357-
358-
if (match(TokenKind::T_GREATER, greaterLoc) && parse_nospace() &&
359-
match(TokenKind::T_EQUAL, equalLoc)) {
360-
return true;
361-
}
362-
363-
rewind(saved);
364-
365-
return false;
366-
}
367-
368335
auto Parser::parse_header_name(SourceLocation& loc) -> bool {
369336
if (match(TokenKind::T_STRING_LITERAL, loc)) return true;
370337

@@ -1298,21 +1265,11 @@ auto Parser::parse_fold_operator(SourceLocation& loc, TokenKind& op) -> bool {
12981265

12991266
switch (TokenKind(LA())) {
13001267
case TokenKind::T_GREATER: {
1301-
if (parse_greater_greater_equal()) {
1302-
op = TokenKind::T_GREATER_GREATER_EQUAL;
1303-
return true;
1304-
}
1305-
13061268
if (parse_greater_greater()) {
13071269
op = TokenKind::T_GREATER_GREATER;
13081270
return true;
13091271
}
13101272

1311-
if (parse_greater_equal()) {
1312-
op = TokenKind::T_GREATER_EQUAL;
1313-
return true;
1314-
}
1315-
13161273
op = TokenKind::T_GREATER;
13171274

13181275
consumeToken();
@@ -2492,11 +2449,6 @@ auto Parser::parse_binary_operator(SourceLocation& loc, TokenKind& tk,
24922449
return true;
24932450
}
24942451

2495-
if (parse_greater_equal()) {
2496-
tk = TokenKind::T_GREATER_EQUAL;
2497-
return true;
2498-
}
2499-
25002452
if (exprContext.templArg || exprContext.templParam) {
25012453
rewind(start);
25022454
return false;
@@ -2507,24 +2459,25 @@ auto Parser::parse_binary_operator(SourceLocation& loc, TokenKind& tk,
25072459
return true;
25082460
}
25092461

2510-
case TokenKind::T_STAR:
2511-
case TokenKind::T_SLASH:
2512-
case TokenKind::T_PLUS:
2513-
case TokenKind::T_PERCENT:
2514-
case TokenKind::T_MINUS_GREATER_STAR:
2515-
case TokenKind::T_MINUS:
2516-
case TokenKind::T_LESS_LESS:
2462+
case TokenKind::T_AMP_AMP:
2463+
case TokenKind::T_AMP:
2464+
case TokenKind::T_BAR_BAR:
2465+
case TokenKind::T_BAR:
2466+
case TokenKind::T_CARET:
2467+
case TokenKind::T_DOT_STAR:
2468+
case TokenKind::T_EQUAL_EQUAL:
2469+
case TokenKind::T_EXCLAIM_EQUAL:
2470+
case TokenKind::T_GREATER_EQUAL:
25172471
case TokenKind::T_LESS_EQUAL_GREATER:
25182472
case TokenKind::T_LESS_EQUAL:
2473+
case TokenKind::T_LESS_LESS:
25192474
case TokenKind::T_LESS:
2520-
case TokenKind::T_EXCLAIM_EQUAL:
2521-
case TokenKind::T_EQUAL_EQUAL:
2522-
case TokenKind::T_DOT_STAR:
2523-
case TokenKind::T_CARET:
2524-
case TokenKind::T_BAR_BAR:
2525-
case TokenKind::T_BAR:
2526-
case TokenKind::T_AMP_AMP:
2527-
case TokenKind::T_AMP:
2475+
case TokenKind::T_MINUS_GREATER_STAR:
2476+
case TokenKind::T_MINUS:
2477+
case TokenKind::T_PERCENT:
2478+
case TokenKind::T_PLUS:
2479+
case TokenKind::T_SLASH:
2480+
case TokenKind::T_STAR:
25282481
tk = LA().kind();
25292482
consumeToken();
25302483
return true;
@@ -2728,13 +2681,6 @@ auto Parser::parse_assignment_operator(SourceLocation& loc, TokenKind& op)
27282681
return true;
27292682
}
27302683

2731-
case TokenKind::T_GREATER: {
2732-
loc = currentLocation();
2733-
if (!parse_greater_greater_equal()) return false;
2734-
op = TokenKind::T_GREATER_GREATER_EQUAL;
2735-
return true;
2736-
}
2737-
27382684
default:
27392685
return false;
27402686
} // switch
@@ -7540,18 +7486,10 @@ auto Parser::parse_operator(TokenKind& op, SourceLocation& opLoc,
75407486

75417487
case TokenKind::T_GREATER: {
75427488
opLoc = currentLocation();
7543-
if (parse_greater_greater_equal()) {
7544-
op = TokenKind::T_GREATER_GREATER_EQUAL;
7545-
return true;
7546-
}
75477489
if (parse_greater_greater()) {
75487490
op = TokenKind::T_GREATER_GREATER;
75497491
return true;
75507492
}
7551-
if (parse_greater_equal()) {
7552-
op = TokenKind::T_GREATER_EQUAL;
7553-
return true;
7554-
}
75557493
consumeToken();
75567494
return true;
75577495
}

src/parser/cxx/parser.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,6 @@ class Parser final {
8484
-> bool;
8585
[[nodiscard]] auto parse_nospace() -> bool;
8686
[[nodiscard]] auto parse_greater_greater() -> bool;
87-
[[nodiscard]] auto parse_greater_greater_equal() -> bool;
88-
[[nodiscard]] auto parse_greater_equal() -> bool;
8987
[[nodiscard]] auto parse_header_name(SourceLocation& loc) -> bool;
9088
[[nodiscard]] auto parse_export_keyword(SourceLocation& loc) -> bool;
9189
[[nodiscard]] auto parse_import_keyword(SourceLocation& loc) -> bool;

src/parser/cxx/preprocessor.cc

Lines changed: 1 addition & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1860,35 +1860,7 @@ void Preprocessor::preprocess(std::string source, std::string fileName,
18601860
break;
18611861
} // switch
18621862

1863-
if (tk->kind == TokenKind::T_GREATER_EQUAL) {
1864-
value.tokenKindValue = tk->kind;
1865-
1866-
Token token(TokenKind::T_GREATER, tk->offset, 1, value);
1867-
token.setFileId(fileId);
1868-
token.setLeadingSpace(tk->space);
1869-
token.setStartOfLine(tk->bol);
1870-
tokens.push_back(token);
1871-
1872-
token = Token(TokenKind::T_EQUAL, tk->offset + 1, 1);
1873-
token.setFileId(fileId);
1874-
token.setLeadingSpace(false);
1875-
token.setStartOfLine(false);
1876-
tokens.push_back(token);
1877-
} else if (tk->kind == TokenKind::T_GREATER_GREATER) {
1878-
value.tokenKindValue = tk->kind;
1879-
1880-
Token token(TokenKind::T_GREATER, tk->offset, 1);
1881-
token.setFileId(fileId);
1882-
token.setLeadingSpace(tk->space);
1883-
token.setStartOfLine(tk->bol);
1884-
tokens.push_back(token);
1885-
1886-
token = Token(TokenKind::T_GREATER, tk->offset + 1, 1);
1887-
token.setFileId(fileId);
1888-
token.setLeadingSpace(false);
1889-
token.setStartOfLine(false);
1890-
tokens.push_back(token);
1891-
} else if (tk->kind == TokenKind::T_GREATER_GREATER_EQUAL) {
1863+
if (tk->kind == TokenKind::T_GREATER_GREATER) {
18921864
value.tokenKindValue = tk->kind;
18931865

18941866
Token token(TokenKind::T_GREATER, tk->offset, 1);
@@ -1902,13 +1874,6 @@ void Preprocessor::preprocess(std::string source, std::string fileName,
19021874
token.setLeadingSpace(false);
19031875
token.setStartOfLine(false);
19041876
tokens.push_back(token);
1905-
1906-
token = Token(TokenKind::T_EQUAL, tk->offset + 2, 1);
1907-
token.setFileId(fileId);
1908-
token.setLeadingSpace(false);
1909-
token.setStartOfLine(false);
1910-
tokens.push_back(token);
1911-
19121877
} else {
19131878
Token token(kind, tk->offset, tk->length, value);
19141879
token.setFileId(fileId);

0 commit comments

Comments
 (0)