Skip to content

Commit 246bf5d

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

18 files changed

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

0 commit comments

Comments
 (0)