3 ms·
These are certainly useful, but there's the major caveat that the "easy" stops when you have anything but the simplest precedence rules. For example, if unary `
by o11c 3y ago
These are certainly useful, but there's the major caveat that the "easy" stops when you have anything but the simplest precedence rules. For example, if unary `NOT` has a weaker precedence than other unary operators, or if `a < b < c` is to be treated differently than `(a < b) < c`, or if you want to forbid bitwise operators mixing with relationals to avoid confusion from fact that they have a different precedence in C (for historical reasons) than in many other languages.
Note also that Bison with precedence tags is more efficient than writing out the same grammar without precedence. And `bison --xml` lets you run the (trivial) machine yourself so you can do it in any language.
- ReleaseCandidat 3y ago> anything but the simplest precedence rules. For example, if unary `NOT` has a weaker precedence than other unary operators Unary operátors use precedence levels (binding powers) too, they are no different (regarding the existence of precedence levels) from infix functions. This is just a simplification of the precedence table in the linked article (which I haven't read). > or if `a < b < c` is to be treated differently than `(a < b) < c` If you want "<" to be right associative, that's exactly one of the things that's easy to do with a Pratt parser, change the binding power on one side for the "<". > if you want to forbid bitwise operators mixing with relationals I don't know how using a Pratt parser would interfere with throwing an error?
- orthoxerox 3y ago> If you want "<" to be right associative, that's exactly one of the things that's easy to do with a Pratt parser, change the binding power on one side for the "<". It's not about associativity at all. "a < b < c" is a ternary operator that compares three operands.
- ReleaseCandidat 3y agoThat's what I would think too (as it doesn't make much sense to compare a boolean to c), but what OP wrote doesn't make much sense else: or if `a < b < c` is to be treated differently than `(a < b) < c`
- int_19h 3y agoOP is saying that you can write (a < b < c) in C and the likes, but it behaves as if ((a < b) < c), which is pretty much never what you want - hence why ternary and N-ary comparison operators like the Python one are desirable in the first place.
- vidarh 3y agoSemantic actions plus a specific node for grouping (parentheses) makes handling your examples easy (e.g. for your a < b < c example, you just need to be able to distinguish ot from the grouped expression. You can do it by adding various flags to change the parser behavior too, but that certainly easily turns into a mess.