Zulip Chat Archive
Stream: general
Topic: infix notation precedence
Sean Leather (Jun 07 2018 at 13:30):
I want something that is effectively equivalent to this:
reserve infix ` d∉ `:51 local notation a d∉ l := blah l a
However, I'm guessing it's not a good idea to use reserve here. I've tried several notation declarations (e.g. notation a ` d∉ `:51 l and notation a ` d∉ `:51 l:0), but I can't seem to get the precedence right. What's the correct way to specify the above without using reserve?
Sebastian Ullrich (Jun 07 2018 at 13:43):
Why are you not using local infix?
Sean Leather (Jun 07 2018 at 13:46):
Because then I would have to write:
local infix ` d∉ `:51 := λ a l, blah l a
Sebastian Ullrich (Jun 07 2018 at 13:49):
I see. The equivalent to infix should be
a ` d∉ `:51 l:51
Sean Leather (Jun 07 2018 at 13:52):
Ah ha! Can you help me understand that?
Sebastian Ullrich (Jun 07 2018 at 14:07):
The first :51 sets the token's binding power, whereas the second one sets the right-binding power (rbp) the Pratt parser will use while parsing that expression. The parser will try to parse an expression until it encounters a token with bp <= its rbp. The rbp used initially is 0.
For example, on the input a d∉ b d∉ c (not that it makes much sense in your case), the parser will start with rbp 0, read the leading term a, read the token with bp > 0, then recurse for the notation RHS using rbp 51. This recursive call will read the leading b, then stop at the token since 51 <= 51, and return. The original parser call will accept it, since it uses rbp 0, and complete parsing the input. Thus the output is (a d∉ b) d∉ c because the parser for the first notation's RHS stopped after b.
Sebastian Ullrich (Jun 07 2018 at 14:09):
If you use infixr instead and do #print d∉, you'll see that the RHS now has rbp 50 so that it will consume the d∉ token
Sean Leather (Jun 08 2018 at 06:07):
Thanks, @Sebastian Ullrich!
Last updated: May 02 2025 at 03:31 UTC