Skip to content

Commit d457fec

Browse files
dmitriplotnikovcopybara-github
authored andcommitted
[Pratt Parser] Add support for macro expansion.
PiperOrigin-RevId: 944185801
1 parent 05556a0 commit d457fec

17 files changed

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

0 commit comments

Comments
 (0)