Skip to content

Commit 5cae586

Browse files
dmitriplotnikovcopybara-github
authored andcommitted
[Pratt Parser] Add support for macro expansion.
PiperOrigin-RevId: 944185801
1 parent 070dfcb commit 5cae586

18 files changed

Lines changed: 6329 additions & 12 deletions

common/expr_factory.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@ namespace tools {
3838
class ProtoToPredicateBuilder;
3939
}
4040

41+
namespace parser_internal {
42+
template <typename ExprNode>
43+
class AstFactoryInterface;
44+
}
45+
4146
class ExprFactory {
4247
protected:
4348
// `IsExprLike` determines whether `T` is some `Expr`. Currently that means
@@ -385,6 +390,7 @@ class ExprFactory {
385390
friend class ParserMacroExprFactory;
386391
friend class OptimizerExprFactory;
387392
friend class tools::ProtoToPredicateBuilder;
393+
friend class parser_internal::AstFactoryInterface<Expr>;
388394

389395
ExprFactory() : accu_var_(kAccumulatorVariableName) {}
390396

parser/internal/BUILD

Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,44 @@
1313
# limitations under the License.
1414

1515
load("@rules_cc//cc:cc_library.bzl", "cc_library")
16+
load("@rules_cc//cc:cc_test.bzl", "cc_test")
1617
load("//bazel:antlr.bzl", "antlr_cc_library")
1718

1819
package(default_visibility = ["//visibility:public"])
1920

2021
licenses(["notice"])
2122

23+
cc_library(
24+
name = "ast_factory_interface",
25+
hdrs = ["ast_factory_interface.h"],
26+
deps = [
27+
"@com_google_absl//absl/functional:function_ref",
28+
"@com_google_absl//absl/status:statusor",
29+
"@com_google_absl//absl/types:span",
30+
],
31+
)
32+
33+
cc_library(
34+
name = "ast_factory",
35+
srcs = ["ast_factory.cc"],
36+
hdrs = ["ast_factory.h"],
37+
deps = [
38+
":ast_factory_interface",
39+
"//common:expr",
40+
"//common:expr_factory",
41+
"//internal:status_macros",
42+
"//parser:macro",
43+
"//parser:macro_expr_factory",
44+
"//parser:macro_registry",
45+
"@com_google_absl//absl/base:nullability",
46+
"@com_google_absl//absl/functional:function_ref",
47+
"@com_google_absl//absl/status",
48+
"@com_google_absl//absl/status:statusor",
49+
"@com_google_absl//absl/strings:string_view",
50+
"@com_google_absl//absl/types:span",
51+
],
52+
)
53+
2254
cc_library(
2355
name = "options",
2456
hdrs = ["options.h"],
@@ -29,3 +61,148 @@ antlr_cc_library(
2961
src = "Cel.g4",
3062
package = "cel_parser_internal",
3163
)
64+
65+
cc_library(
66+
name = "lexer",
67+
srcs = ["lexer.cc"],
68+
hdrs = ["lexer.h"],
69+
deps = [
70+
"//common:source",
71+
"@com_google_absl//absl/base:core_headers",
72+
"@com_google_absl//absl/base:no_destructor",
73+
"@com_google_absl//absl/container:flat_hash_map",
74+
"@com_google_absl//absl/functional:function_ref",
75+
"@com_google_absl//absl/log:absl_check",
76+
"@com_google_absl//absl/strings",
77+
"@com_google_absl//absl/strings:string_view",
78+
],
79+
)
80+
81+
cc_library(
82+
name = "pratt_parser_worker",
83+
srcs = ["pratt_parser_worker.cc"],
84+
hdrs = ["pratt_parser_worker.h"],
85+
deps = [
86+
":ast_factory_interface",
87+
":lexer",
88+
"//common:operators",
89+
"//common:source",
90+
"//internal:lexis",
91+
"//internal:strings",
92+
"//parser:options",
93+
"//parser:parser_interface",
94+
"@com_google_absl//absl/base:core_headers",
95+
"@com_google_absl//absl/base:nullability",
96+
"@com_google_absl//absl/container:flat_hash_map",
97+
"@com_google_absl//absl/status:statusor",
98+
"@com_google_absl//absl/strings",
99+
"@com_google_absl//absl/strings:str_format",
100+
"@com_google_absl//absl/types:optional",
101+
"@com_google_absl//absl/types:span",
102+
],
103+
)
104+
105+
cc_library(
106+
name = "pratt_parser",
107+
srcs = ["pratt_parser.cc"],
108+
hdrs = ["pratt_parser.h"],
109+
deps = [
110+
":ast_factory",
111+
":pratt_parser_worker",
112+
"//common:ast",
113+
"//common:expr",
114+
"//common:source",
115+
"//internal:status_macros",
116+
"//parser:macro",
117+
"//parser:macro_registry",
118+
"//parser:options",
119+
"//parser:parser_interface",
120+
"@com_google_absl//absl/base:nullability",
121+
"@com_google_absl//absl/cleanup",
122+
"@com_google_absl//absl/container:flat_hash_map",
123+
"@com_google_absl//absl/container:flat_hash_set",
124+
"@com_google_absl//absl/status",
125+
"@com_google_absl//absl/status:statusor",
126+
"@com_google_absl//absl/strings",
127+
"@com_google_absl//absl/strings:str_format",
128+
"@com_google_absl//absl/types:span",
129+
],
130+
)
131+
132+
cc_test(
133+
name = "ast_factory_test",
134+
srcs = ["ast_factory_test.cc"],
135+
deps = [
136+
":ast_factory",
137+
":ast_factory_interface",
138+
"//common:constant",
139+
"//common:expr",
140+
"//internal:testing",
141+
"//parser:macro",
142+
"//parser:macro_expr_factory",
143+
"//parser:macro_registry",
144+
"@com_google_absl//absl/status",
145+
"@com_google_absl//absl/status:status_matchers",
146+
"@com_google_absl//absl/strings:string_view",
147+
"@com_google_absl//absl/types:span",
148+
],
149+
)
150+
151+
cc_test(
152+
name = "lexer_test",
153+
srcs = ["lexer_test.cc"],
154+
deps = [
155+
":lexer",
156+
"//common:source",
157+
"//internal:testing",
158+
],
159+
)
160+
161+
cc_test(
162+
name = "pratt_parser_test",
163+
srcs = ["pratt_parser_test.cc"],
164+
deps = [
165+
":lexer",
166+
":pratt_parser",
167+
":pratt_parser_worker",
168+
"//common:ast",
169+
"//common:constant",
170+
"//common:expr",
171+
"//common:source",
172+
"//internal:status_macros",
173+
"//internal:testing",
174+
"//parser:macro",
175+
"//parser:macro_expr_factory",
176+
"//parser:options",
177+
"//parser:parser_interface",
178+
"//testutil:expr_printer",
179+
"//thread/fiber",
180+
"//thread/fiber:fiber-options",
181+
"@com_google_absl//absl/algorithm:container",
182+
"@com_google_absl//absl/log:absl_log",
183+
"@com_google_absl//absl/status",
184+
"@com_google_absl//absl/status:status_matchers",
185+
"@com_google_absl//absl/status:statusor",
186+
"@com_google_absl//absl/strings",
187+
"@com_google_absl//absl/strings:str_format",
188+
"@com_google_absl//absl/strings:string_view",
189+
"@com_google_absl//absl/types:span",
190+
],
191+
)
192+
193+
cc_test(
194+
name = "pratt_parser_benchmark",
195+
srcs = ["pratt_parser_benchmark.cc"],
196+
tags = ["benchmark"],
197+
deps = [
198+
":pratt_parser",
199+
"//common:source",
200+
"//internal:benchmark",
201+
"//internal:testing",
202+
"//parser",
203+
"//parser:options",
204+
"//parser:parser_interface",
205+
"@com_google_absl//absl/log:absl_check",
206+
"@com_google_absl//absl/strings",
207+
],
208+
)

0 commit comments

Comments
 (0)