xref: /aosp_15_r20/external/emboss/compiler/front_end/BUILD (revision 99e0aae7469b87d12f0ad23e61142c2d74c1ef70)
1*99e0aae7SDavid Rees# Copyright 2019 Google LLC
2*99e0aae7SDavid Rees#
3*99e0aae7SDavid Rees# Licensed under the Apache License, Version 2.0 (the "License");
4*99e0aae7SDavid Rees# you may not use this file except in compliance with the License.
5*99e0aae7SDavid Rees# You may obtain a copy of the License at
6*99e0aae7SDavid Rees#
7*99e0aae7SDavid Rees#     https://www.apache.org/licenses/LICENSE-2.0
8*99e0aae7SDavid Rees#
9*99e0aae7SDavid Rees# Unless required by applicable law or agreed to in writing, software
10*99e0aae7SDavid Rees# distributed under the License is distributed on an "AS IS" BASIS,
11*99e0aae7SDavid Rees# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*99e0aae7SDavid Rees# See the License for the specific language governing permissions and
13*99e0aae7SDavid Rees# limitations under the License.
14*99e0aae7SDavid Rees
15*99e0aae7SDavid Rees# Emboss front end
16*99e0aae7SDavid Rees#
17*99e0aae7SDavid Rees# The code in this directory translates an Emboss definition file (.emb) to an
18*99e0aae7SDavid Rees# intermediate representation (IR).  The IR is passed to back end code
19*99e0aae7SDavid Rees# generators to generate code in various languages.
20*99e0aae7SDavid Rees
21*99e0aae7SDavid Reesload("@rules_python//python:py_binary.bzl", "py_binary")
22*99e0aae7SDavid Reesload("@rules_python//python:py_library.bzl", "py_library")
23*99e0aae7SDavid Reesload("@rules_python//python:py_test.bzl", "py_test")
24*99e0aae7SDavid Rees
25*99e0aae7SDavid Reespackage(
26*99e0aae7SDavid Rees    default_visibility = [
27*99e0aae7SDavid Rees        "//:__subpackages__",
28*99e0aae7SDavid Rees    ],
29*99e0aae7SDavid Rees)
30*99e0aae7SDavid Rees
31*99e0aae7SDavid Reespy_library(
32*99e0aae7SDavid Rees    name = "tokenizer",
33*99e0aae7SDavid Rees    srcs = ["tokenizer.py"],
34*99e0aae7SDavid Rees    deps = [
35*99e0aae7SDavid Rees        "//compiler/util:error",
36*99e0aae7SDavid Rees        "//compiler/util:parser_types",
37*99e0aae7SDavid Rees    ],
38*99e0aae7SDavid Rees)
39*99e0aae7SDavid Rees
40*99e0aae7SDavid Reespy_test(
41*99e0aae7SDavid Rees    name = "tokenizer_test",
42*99e0aae7SDavid Rees    srcs = ["tokenizer_test.py"],
43*99e0aae7SDavid Rees    python_version = "PY3",
44*99e0aae7SDavid Rees    deps = [
45*99e0aae7SDavid Rees        ":tokenizer",
46*99e0aae7SDavid Rees        "//compiler/util:error",
47*99e0aae7SDavid Rees        "//compiler/util:parser_types",
48*99e0aae7SDavid Rees    ],
49*99e0aae7SDavid Rees)
50*99e0aae7SDavid Rees
51*99e0aae7SDavid Reespy_library(
52*99e0aae7SDavid Rees    name = "lr1",
53*99e0aae7SDavid Rees    srcs = ["lr1.py"],
54*99e0aae7SDavid Rees    deps = [
55*99e0aae7SDavid Rees        "//compiler/util:parser_types",
56*99e0aae7SDavid Rees    ],
57*99e0aae7SDavid Rees)
58*99e0aae7SDavid Rees
59*99e0aae7SDavid Reespy_test(
60*99e0aae7SDavid Rees    name = "lr1_test",
61*99e0aae7SDavid Rees    srcs = ["lr1_test.py"],
62*99e0aae7SDavid Rees    python_version = "PY3",
63*99e0aae7SDavid Rees    deps = [
64*99e0aae7SDavid Rees        ":lr1",
65*99e0aae7SDavid Rees        "//compiler/util:parser_types",
66*99e0aae7SDavid Rees    ],
67*99e0aae7SDavid Rees)
68*99e0aae7SDavid Rees
69*99e0aae7SDavid Reespy_library(
70*99e0aae7SDavid Rees    name = "module_ir",
71*99e0aae7SDavid Rees    srcs = ["module_ir.py"],
72*99e0aae7SDavid Rees    deps = [
73*99e0aae7SDavid Rees        "//compiler/util:ir_data",
74*99e0aae7SDavid Rees        "//compiler/util:name_conversion",
75*99e0aae7SDavid Rees        "//compiler/util:parser_types",
76*99e0aae7SDavid Rees    ],
77*99e0aae7SDavid Rees)
78*99e0aae7SDavid Rees
79*99e0aae7SDavid Reespy_test(
80*99e0aae7SDavid Rees    name = "module_ir_test",
81*99e0aae7SDavid Rees    srcs = ["module_ir_test.py"],
82*99e0aae7SDavid Rees    data = [
83*99e0aae7SDavid Rees        "//testdata:golden_files",
84*99e0aae7SDavid Rees    ],
85*99e0aae7SDavid Rees    python_version = "PY3",
86*99e0aae7SDavid Rees    deps = [
87*99e0aae7SDavid Rees        ":module_ir",
88*99e0aae7SDavid Rees        ":parser",
89*99e0aae7SDavid Rees        ":tokenizer",
90*99e0aae7SDavid Rees        "//compiler/util:ir_data",
91*99e0aae7SDavid Rees        "//compiler/util:test_util",
92*99e0aae7SDavid Rees    ],
93*99e0aae7SDavid Rees)
94*99e0aae7SDavid Rees
95*99e0aae7SDavid Reespy_library(
96*99e0aae7SDavid Rees    name = "parser",
97*99e0aae7SDavid Rees    srcs = ["parser.py"],
98*99e0aae7SDavid Rees    data = [
99*99e0aae7SDavid Rees        "error_examples",
100*99e0aae7SDavid Rees    ],
101*99e0aae7SDavid Rees    deps = [
102*99e0aae7SDavid Rees        ":lr1",
103*99e0aae7SDavid Rees        ":module_ir",
104*99e0aae7SDavid Rees        ":tokenizer",
105*99e0aae7SDavid Rees        "//compiler/util:resources",
106*99e0aae7SDavid Rees        "//compiler/util:simple_memoizer",
107*99e0aae7SDavid Rees    ],
108*99e0aae7SDavid Rees)
109*99e0aae7SDavid Rees
110*99e0aae7SDavid Reespy_test(
111*99e0aae7SDavid Rees    name = "parser_test",
112*99e0aae7SDavid Rees    srcs = ["parser_test.py"],
113*99e0aae7SDavid Rees    python_version = "PY3",
114*99e0aae7SDavid Rees    deps = [
115*99e0aae7SDavid Rees        ":lr1",
116*99e0aae7SDavid Rees        ":parser",
117*99e0aae7SDavid Rees        ":tokenizer",
118*99e0aae7SDavid Rees        "//compiler/util:parser_types",
119*99e0aae7SDavid Rees    ],
120*99e0aae7SDavid Rees)
121*99e0aae7SDavid Rees
122*99e0aae7SDavid Reespy_library(
123*99e0aae7SDavid Rees    name = "glue",
124*99e0aae7SDavid Rees    srcs = ["glue.py"],
125*99e0aae7SDavid Rees    data = [
126*99e0aae7SDavid Rees        "prelude.emb",
127*99e0aae7SDavid Rees    ],
128*99e0aae7SDavid Rees    visibility = ["//:__subpackages__"],
129*99e0aae7SDavid Rees    deps = [
130*99e0aae7SDavid Rees        ":attribute_checker",
131*99e0aae7SDavid Rees        ":constraints",
132*99e0aae7SDavid Rees        ":dependency_checker",
133*99e0aae7SDavid Rees        ":expression_bounds",
134*99e0aae7SDavid Rees        ":lr1",
135*99e0aae7SDavid Rees        ":module_ir",
136*99e0aae7SDavid Rees        ":parser",
137*99e0aae7SDavid Rees        ":symbol_resolver",
138*99e0aae7SDavid Rees        ":synthetics",
139*99e0aae7SDavid Rees        ":tokenizer",
140*99e0aae7SDavid Rees        ":type_check",
141*99e0aae7SDavid Rees        ":write_inference",
142*99e0aae7SDavid Rees        "//compiler/util:error",
143*99e0aae7SDavid Rees        "//compiler/util:ir_data",
144*99e0aae7SDavid Rees        "//compiler/util:parser_types",
145*99e0aae7SDavid Rees        "//compiler/util:resources",
146*99e0aae7SDavid Rees    ],
147*99e0aae7SDavid Rees)
148*99e0aae7SDavid Rees
149*99e0aae7SDavid Reespy_test(
150*99e0aae7SDavid Rees    name = "glue_test",
151*99e0aae7SDavid Rees    srcs = ["glue_test.py"],
152*99e0aae7SDavid Rees    data = [
153*99e0aae7SDavid Rees        "//testdata:golden_files",
154*99e0aae7SDavid Rees    ],
155*99e0aae7SDavid Rees    python_version = "PY3",
156*99e0aae7SDavid Rees    deps = [
157*99e0aae7SDavid Rees        ":glue",
158*99e0aae7SDavid Rees        "//compiler/util:error",
159*99e0aae7SDavid Rees        "//compiler/util:ir_data",
160*99e0aae7SDavid Rees        "//compiler/util:parser_types",
161*99e0aae7SDavid Rees        "//compiler/util:test_util",
162*99e0aae7SDavid Rees    ],
163*99e0aae7SDavid Rees)
164*99e0aae7SDavid Rees
165*99e0aae7SDavid Reespy_library(
166*99e0aae7SDavid Rees    name = "synthetics",
167*99e0aae7SDavid Rees    srcs = ["synthetics.py"],
168*99e0aae7SDavid Rees    visibility = ["//visibility:private"],
169*99e0aae7SDavid Rees    deps = [
170*99e0aae7SDavid Rees        "//compiler/util:expression_parser",
171*99e0aae7SDavid Rees        "//compiler/util:ir_data",
172*99e0aae7SDavid Rees        "//compiler/util:traverse_ir",
173*99e0aae7SDavid Rees    ],
174*99e0aae7SDavid Rees)
175*99e0aae7SDavid Rees
176*99e0aae7SDavid Reespy_test(
177*99e0aae7SDavid Rees    name = "synthetics_test",
178*99e0aae7SDavid Rees    srcs = ["synthetics_test.py"],
179*99e0aae7SDavid Rees    python_version = "PY3",
180*99e0aae7SDavid Rees    deps = [
181*99e0aae7SDavid Rees        ":glue",
182*99e0aae7SDavid Rees        ":synthetics",
183*99e0aae7SDavid Rees        "//compiler/util:test_util",
184*99e0aae7SDavid Rees    ],
185*99e0aae7SDavid Rees)
186*99e0aae7SDavid Rees
187*99e0aae7SDavid Reespy_library(
188*99e0aae7SDavid Rees    name = "symbol_resolver",
189*99e0aae7SDavid Rees    srcs = ["symbol_resolver.py"],
190*99e0aae7SDavid Rees    visibility = ["//visibility:private"],
191*99e0aae7SDavid Rees    deps = [
192*99e0aae7SDavid Rees        "//compiler/util:error",
193*99e0aae7SDavid Rees        "//compiler/util:ir_data",
194*99e0aae7SDavid Rees        "//compiler/util:ir_util",
195*99e0aae7SDavid Rees        "//compiler/util:traverse_ir",
196*99e0aae7SDavid Rees    ],
197*99e0aae7SDavid Rees)
198*99e0aae7SDavid Rees
199*99e0aae7SDavid Reespy_test(
200*99e0aae7SDavid Rees    name = "symbol_resolver_test",
201*99e0aae7SDavid Rees    srcs = ["symbol_resolver_test.py"],
202*99e0aae7SDavid Rees    python_version = "PY3",
203*99e0aae7SDavid Rees    deps = [
204*99e0aae7SDavid Rees        ":glue",
205*99e0aae7SDavid Rees        ":symbol_resolver",
206*99e0aae7SDavid Rees        "//compiler/util:error",
207*99e0aae7SDavid Rees        "//compiler/util:test_util",
208*99e0aae7SDavid Rees    ],
209*99e0aae7SDavid Rees)
210*99e0aae7SDavid Rees
211*99e0aae7SDavid Reespy_library(
212*99e0aae7SDavid Rees    name = "write_inference",
213*99e0aae7SDavid Rees    srcs = ["write_inference.py"],
214*99e0aae7SDavid Rees    visibility = ["//visibility:private"],
215*99e0aae7SDavid Rees    deps = [
216*99e0aae7SDavid Rees        ":attributes",
217*99e0aae7SDavid Rees        ":expression_bounds",
218*99e0aae7SDavid Rees        "//compiler/util:ir_data",
219*99e0aae7SDavid Rees        "//compiler/util:ir_util",
220*99e0aae7SDavid Rees        "//compiler/util:traverse_ir",
221*99e0aae7SDavid Rees    ],
222*99e0aae7SDavid Rees)
223*99e0aae7SDavid Rees
224*99e0aae7SDavid Reespy_test(
225*99e0aae7SDavid Rees    name = "write_inference_test",
226*99e0aae7SDavid Rees    srcs = ["write_inference_test.py"],
227*99e0aae7SDavid Rees    python_version = "PY3",
228*99e0aae7SDavid Rees    deps = [
229*99e0aae7SDavid Rees        ":glue",
230*99e0aae7SDavid Rees        ":write_inference",
231*99e0aae7SDavid Rees        "//compiler/util:ir_data",
232*99e0aae7SDavid Rees        "//compiler/util:test_util",
233*99e0aae7SDavid Rees    ],
234*99e0aae7SDavid Rees)
235*99e0aae7SDavid Rees
236*99e0aae7SDavid Reespy_library(
237*99e0aae7SDavid Rees    name = "attribute_checker",
238*99e0aae7SDavid Rees    srcs = ["attribute_checker.py"],
239*99e0aae7SDavid Rees    deps = [
240*99e0aae7SDavid Rees        ":attributes",
241*99e0aae7SDavid Rees        ":type_check",
242*99e0aae7SDavid Rees        "//compiler/util:attribute_util",
243*99e0aae7SDavid Rees        "//compiler/util:error",
244*99e0aae7SDavid Rees        "//compiler/util:ir_data",
245*99e0aae7SDavid Rees        "//compiler/util:ir_util",
246*99e0aae7SDavid Rees        "//compiler/util:traverse_ir",
247*99e0aae7SDavid Rees    ],
248*99e0aae7SDavid Rees)
249*99e0aae7SDavid Rees
250*99e0aae7SDavid Reespy_library(
251*99e0aae7SDavid Rees    name = "attributes",
252*99e0aae7SDavid Rees    srcs = ["attributes.py"],
253*99e0aae7SDavid Rees    deps = [],
254*99e0aae7SDavid Rees)
255*99e0aae7SDavid Rees
256*99e0aae7SDavid Reespy_test(
257*99e0aae7SDavid Rees    name = "attribute_checker_test",
258*99e0aae7SDavid Rees    timeout = "long",
259*99e0aae7SDavid Rees    srcs = ["attribute_checker_test.py"],
260*99e0aae7SDavid Rees    python_version = "PY3",
261*99e0aae7SDavid Rees    deps = [
262*99e0aae7SDavid Rees        ":attribute_checker",
263*99e0aae7SDavid Rees        ":glue",
264*99e0aae7SDavid Rees        "//compiler/util:error",
265*99e0aae7SDavid Rees        "//compiler/util:ir_data",
266*99e0aae7SDavid Rees        "//compiler/util:ir_util",
267*99e0aae7SDavid Rees        "//compiler/util:test_util",
268*99e0aae7SDavid Rees    ],
269*99e0aae7SDavid Rees)
270*99e0aae7SDavid Rees
271*99e0aae7SDavid Reespy_library(
272*99e0aae7SDavid Rees    name = "type_check",
273*99e0aae7SDavid Rees    srcs = ["type_check.py"],
274*99e0aae7SDavid Rees    deps = [
275*99e0aae7SDavid Rees        ":attributes",
276*99e0aae7SDavid Rees        "//compiler/util:error",
277*99e0aae7SDavid Rees        "//compiler/util:ir_data",
278*99e0aae7SDavid Rees        "//compiler/util:ir_util",
279*99e0aae7SDavid Rees        "//compiler/util:traverse_ir",
280*99e0aae7SDavid Rees    ],
281*99e0aae7SDavid Rees)
282*99e0aae7SDavid Rees
283*99e0aae7SDavid Reespy_test(
284*99e0aae7SDavid Rees    name = "type_check_test",
285*99e0aae7SDavid Rees    srcs = ["type_check_test.py"],
286*99e0aae7SDavid Rees    python_version = "PY3",
287*99e0aae7SDavid Rees    deps = [
288*99e0aae7SDavid Rees        ":glue",
289*99e0aae7SDavid Rees        ":type_check",
290*99e0aae7SDavid Rees        "//compiler/util:error",
291*99e0aae7SDavid Rees        "//compiler/util:test_util",
292*99e0aae7SDavid Rees    ],
293*99e0aae7SDavid Rees)
294*99e0aae7SDavid Rees
295*99e0aae7SDavid Reespy_library(
296*99e0aae7SDavid Rees    name = "expression_bounds",
297*99e0aae7SDavid Rees    srcs = ["expression_bounds.py"],
298*99e0aae7SDavid Rees    data = [
299*99e0aae7SDavid Rees        "reserved_words",
300*99e0aae7SDavid Rees    ],
301*99e0aae7SDavid Rees    deps = [
302*99e0aae7SDavid Rees        ":attributes",
303*99e0aae7SDavid Rees        "//compiler/util:ir_data",
304*99e0aae7SDavid Rees        "//compiler/util:ir_util",
305*99e0aae7SDavid Rees        "//compiler/util:traverse_ir",
306*99e0aae7SDavid Rees    ],
307*99e0aae7SDavid Rees)
308*99e0aae7SDavid Rees
309*99e0aae7SDavid Reespy_test(
310*99e0aae7SDavid Rees    name = "expression_bounds_test",
311*99e0aae7SDavid Rees    srcs = ["expression_bounds_test.py"],
312*99e0aae7SDavid Rees    python_version = "PY3",
313*99e0aae7SDavid Rees    deps = [
314*99e0aae7SDavid Rees        ":expression_bounds",
315*99e0aae7SDavid Rees        ":glue",
316*99e0aae7SDavid Rees        "//compiler/util:test_util",
317*99e0aae7SDavid Rees    ],
318*99e0aae7SDavid Rees)
319*99e0aae7SDavid Rees
320*99e0aae7SDavid Reespy_library(
321*99e0aae7SDavid Rees    name = "constraints",
322*99e0aae7SDavid Rees    srcs = ["constraints.py"],
323*99e0aae7SDavid Rees    data = [
324*99e0aae7SDavid Rees        "reserved_words",
325*99e0aae7SDavid Rees    ],
326*99e0aae7SDavid Rees    deps = [
327*99e0aae7SDavid Rees        ":attributes",
328*99e0aae7SDavid Rees        "//compiler/util:error",
329*99e0aae7SDavid Rees        "//compiler/util:ir_data",
330*99e0aae7SDavid Rees        "//compiler/util:ir_util",
331*99e0aae7SDavid Rees        "//compiler/util:resources",
332*99e0aae7SDavid Rees        "//compiler/util:traverse_ir",
333*99e0aae7SDavid Rees    ],
334*99e0aae7SDavid Rees)
335*99e0aae7SDavid Rees
336*99e0aae7SDavid Reespy_test(
337*99e0aae7SDavid Rees    name = "constraints_test",
338*99e0aae7SDavid Rees    srcs = ["constraints_test.py"],
339*99e0aae7SDavid Rees    python_version = "PY3",
340*99e0aae7SDavid Rees    deps = [
341*99e0aae7SDavid Rees        ":constraints",
342*99e0aae7SDavid Rees        ":glue",
343*99e0aae7SDavid Rees        "//compiler/util:error",
344*99e0aae7SDavid Rees        "//compiler/util:test_util",
345*99e0aae7SDavid Rees    ],
346*99e0aae7SDavid Rees)
347*99e0aae7SDavid Rees
348*99e0aae7SDavid Reespy_library(
349*99e0aae7SDavid Rees    name = "dependency_checker",
350*99e0aae7SDavid Rees    srcs = ["dependency_checker.py"],
351*99e0aae7SDavid Rees    deps = [
352*99e0aae7SDavid Rees        "//compiler/util:error",
353*99e0aae7SDavid Rees        "//compiler/util:ir_data",
354*99e0aae7SDavid Rees        "//compiler/util:ir_util",
355*99e0aae7SDavid Rees        "//compiler/util:traverse_ir",
356*99e0aae7SDavid Rees    ],
357*99e0aae7SDavid Rees)
358*99e0aae7SDavid Rees
359*99e0aae7SDavid Reespy_test(
360*99e0aae7SDavid Rees    name = "dependency_checker_test",
361*99e0aae7SDavid Rees    srcs = ["dependency_checker_test.py"],
362*99e0aae7SDavid Rees    python_version = "PY3",
363*99e0aae7SDavid Rees    deps = [
364*99e0aae7SDavid Rees        ":dependency_checker",
365*99e0aae7SDavid Rees        ":glue",
366*99e0aae7SDavid Rees        "//compiler/util:error",
367*99e0aae7SDavid Rees        "//compiler/util:test_util",
368*99e0aae7SDavid Rees    ],
369*99e0aae7SDavid Rees)
370*99e0aae7SDavid Rees
371*99e0aae7SDavid Reespy_binary(
372*99e0aae7SDavid Rees    name = "emboss_front_end",
373*99e0aae7SDavid Rees    srcs = ["emboss_front_end.py"],
374*99e0aae7SDavid Rees    python_version = "PY3",
375*99e0aae7SDavid Rees    visibility = ["//visibility:public"],
376*99e0aae7SDavid Rees    deps = [
377*99e0aae7SDavid Rees        ":glue",
378*99e0aae7SDavid Rees        ":module_ir",
379*99e0aae7SDavid Rees        "//compiler/util:error",
380*99e0aae7SDavid Rees    ],
381*99e0aae7SDavid Rees)
382*99e0aae7SDavid Rees
383*99e0aae7SDavid Reespy_binary(
384*99e0aae7SDavid Rees    name = "format",
385*99e0aae7SDavid Rees    srcs = ["format.py"],
386*99e0aae7SDavid Rees    main = "format.py",
387*99e0aae7SDavid Rees    python_version = "PY3",
388*99e0aae7SDavid Rees    visibility = ["//visibility:public"],
389*99e0aae7SDavid Rees    deps = [
390*99e0aae7SDavid Rees        ":format_emb",
391*99e0aae7SDavid Rees        ":parser",
392*99e0aae7SDavid Rees        ":tokenizer",
393*99e0aae7SDavid Rees        "//compiler/util:error",
394*99e0aae7SDavid Rees    ],
395*99e0aae7SDavid Rees)
396*99e0aae7SDavid Rees
397*99e0aae7SDavid Reespy_library(
398*99e0aae7SDavid Rees    name = "format_emb",
399*99e0aae7SDavid Rees    srcs = ["format_emb.py"],
400*99e0aae7SDavid Rees    deps = [
401*99e0aae7SDavid Rees        ":module_ir",
402*99e0aae7SDavid Rees        ":tokenizer",
403*99e0aae7SDavid Rees        "//compiler/util:parser_types",
404*99e0aae7SDavid Rees    ],
405*99e0aae7SDavid Rees)
406*99e0aae7SDavid Rees
407*99e0aae7SDavid Reespy_test(
408*99e0aae7SDavid Rees    name = "format_emb_test",
409*99e0aae7SDavid Rees    srcs = ["format_emb_test.py"],
410*99e0aae7SDavid Rees    data = [
411*99e0aae7SDavid Rees        "//testdata:format_embs",
412*99e0aae7SDavid Rees    ],
413*99e0aae7SDavid Rees    python_version = "PY3",
414*99e0aae7SDavid Rees    deps = [
415*99e0aae7SDavid Rees        ":format_emb",
416*99e0aae7SDavid Rees        ":module_ir",
417*99e0aae7SDavid Rees        ":parser",
418*99e0aae7SDavid Rees        ":tokenizer",
419*99e0aae7SDavid Rees    ],
420*99e0aae7SDavid Rees)
421*99e0aae7SDavid Rees
422*99e0aae7SDavid Reespy_binary(
423*99e0aae7SDavid Rees    name = "generate_grammar_md",
424*99e0aae7SDavid Rees    srcs = ["generate_grammar_md.py"],
425*99e0aae7SDavid Rees    python_version = "PY3",
426*99e0aae7SDavid Rees    deps = [
427*99e0aae7SDavid Rees        ":constraints",
428*99e0aae7SDavid Rees        ":module_ir",
429*99e0aae7SDavid Rees        ":tokenizer",
430*99e0aae7SDavid Rees    ],
431*99e0aae7SDavid Rees)
432*99e0aae7SDavid Rees
433*99e0aae7SDavid Reespy_test(
434*99e0aae7SDavid Rees    name = "docs_are_up_to_date_test",
435*99e0aae7SDavid Rees    srcs = ["docs_are_up_to_date_test.py"],
436*99e0aae7SDavid Rees    data = [
437*99e0aae7SDavid Rees        "//doc:grammar_md",
438*99e0aae7SDavid Rees    ],
439*99e0aae7SDavid Rees    python_version = "PY3",
440*99e0aae7SDavid Rees    deps = [
441*99e0aae7SDavid Rees        ":generate_grammar_md",
442*99e0aae7SDavid Rees    ],
443*99e0aae7SDavid Rees)
444