Skip to content

Commit a0f5a4f

Browse files
dmitriplotnikovcopybara-github
authored andcommitted
[Pratt Parser] Call-Stack Optimization
PiperOrigin-RevId: 953516565
1 parent 62788ab commit a0f5a4f

4 files changed

Lines changed: 262 additions & 189 deletions

File tree

parser/internal/BUILD

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,6 @@ cc_library(
9292
"//parser:options",
9393
"//parser:parser_interface",
9494
"@com_google_absl//absl/base:nullability",
95-
"@com_google_absl//absl/cleanup",
9695
"@com_google_absl//absl/container:flat_hash_map",
9796
"@com_google_absl//absl/status:statusor",
9897
"@com_google_absl//absl/strings",

parser/internal/pratt_parser_test.cc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,12 @@ std::vector<TestCase> GetParserTestCases() {
223223
-123^#1:int64#
224224
)",
225225
},
226+
TestCase{
227+
.source = "9223372036854775807",
228+
.expected_ast = R"(
229+
9223372036854775807^#1:int64#
230+
)",
231+
},
226232
TestCase{
227233
.source = "-9223372036854775808",
228234
.expected_ast = R"(

parser/internal/pratt_parser_worker.cc

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,79 @@
2222
#include "absl/strings/str_cat.h"
2323
#include "absl/strings/str_format.h"
2424
#include "absl/strings/string_view.h"
25+
#include "common/operators.h"
2526
#include "common/source.h"
2627
#include "parser/internal/lexer.h"
2728
#include "parser/options.h"
2829
#include "parser/parser_interface.h"
2930

3031
namespace cel::parser_internal {
32+
namespace {
33+
34+
using CelOperator = ::google::api::expr::common::CelOperator;
35+
36+
const BinaryOpInfo kLogicalOr = {1, CelOperator::LOGICAL_OR, true,
37+
TokenType::kLogicalOr};
38+
const BinaryOpInfo kLogicalAnd = {2, CelOperator::LOGICAL_AND, true,
39+
TokenType::kLogicalAnd};
40+
const BinaryOpInfo kLess = {3, CelOperator::LESS, false, TokenType::kLess};
41+
const BinaryOpInfo kLessEqual = {3, CelOperator::LESS_EQUALS, false,
42+
TokenType::kLessEqual};
43+
const BinaryOpInfo kGreater = {3, CelOperator::GREATER, false,
44+
TokenType::kGreater};
45+
const BinaryOpInfo kGreaterEqual = {3, CelOperator::GREATER_EQUALS, false,
46+
TokenType::kGreaterEqual};
47+
const BinaryOpInfo kEqualEqual = {3, CelOperator::EQUALS, false,
48+
TokenType::kEqualEqual};
49+
const BinaryOpInfo kExclamationEqual = {3, CelOperator::NOT_EQUALS, false,
50+
TokenType::kExclamationEqual};
51+
const BinaryOpInfo kIn = {3, CelOperator::IN, false, TokenType::kIn};
52+
const BinaryOpInfo kPlus = {4, CelOperator::ADD, false, TokenType::kPlus};
53+
const BinaryOpInfo kMinus = {4, CelOperator::SUBTRACT, false,
54+
TokenType::kMinus};
55+
const BinaryOpInfo kAsterisk = {5, CelOperator::MULTIPLY, false,
56+
TokenType::kAsterisk};
57+
const BinaryOpInfo kSlash = {5, CelOperator::DIVIDE, false, TokenType::kSlash};
58+
const BinaryOpInfo kPercent = {5, CelOperator::MODULO, false,
59+
TokenType::kPercent};
60+
const BinaryOpInfo kDefaultOpInfo = {0, "", false, TokenType::kError};
61+
62+
} // namespace
63+
64+
const BinaryOpInfo& GetBinaryOpInfo(TokenType type) {
65+
switch (type) {
66+
case TokenType::kLogicalOr:
67+
return kLogicalOr;
68+
case TokenType::kLogicalAnd:
69+
return kLogicalAnd;
70+
case TokenType::kLess:
71+
return kLess;
72+
case TokenType::kLessEqual:
73+
return kLessEqual;
74+
case TokenType::kGreater:
75+
return kGreater;
76+
case TokenType::kGreaterEqual:
77+
return kGreaterEqual;
78+
case TokenType::kEqualEqual:
79+
return kEqualEqual;
80+
case TokenType::kExclamationEqual:
81+
return kExclamationEqual;
82+
case TokenType::kIn:
83+
return kIn;
84+
case TokenType::kPlus:
85+
return kPlus;
86+
case TokenType::kMinus:
87+
return kMinus;
88+
case TokenType::kAsterisk:
89+
return kAsterisk;
90+
case TokenType::kSlash:
91+
return kSlash;
92+
case TokenType::kPercent:
93+
return kPercent;
94+
default:
95+
return kDefaultOpInfo;
96+
}
97+
}
3198

3299
ParserWorker::ParserWorker(
33100
const cel::Source& source, const cel::ParserOptions& options,

0 commit comments

Comments
 (0)