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