First, we make a parse tree. We call make-tokenizer with our input port. This time, we also pass our path as an argument, to help with generating source locations. make-tokenizer returns a token-retrieving function, which we pass to parse. In turn, the parser uses this function to retrieve tokens and arrange them into a parse tree according to the rules of our grammar.
To insert the parse tree into our module expression, we use the quasisyntax notation we used for the wires reader. We wrap this new module expression with strip-bindings to make sure it has no bindings before it’s passed to the expander.
Finally, we provide our read-syntax function through a reader submodule, where Racket will look for it when we invoke #lang basic.