5 ms·
Author here - happy to answer questions, as always. Thanks also for feedback on the format of the article. It's a bit of an experiment on how to present dense
by tiarkrompf 6y ago
Author here - happy to answer questions, as always.
Thanks also for feedback on the format of the article. It's a bit of an experiment on how to present dense information effectively. Some more rationale here: https://tiarkrompf.github.io/notes/?/octopus-notes/ https://tiarkrompf.github.io/notes/?/octopus-notes/
- LeonB 6y agoOctopus notes is an interesting idea. Thanks for the link on it. And I do like to write a lot of little parsers. I worked with someone once who would somehow transform every business problem into “we need to write a compiler”. Sounds crazy but he achieved brilliant results and has gone on to great things.
- musicale 6y agoWhat's the best way to handle unary "-" and other unary operators? I'd like to be able to write expressions like "-2^-(2+2)" or "a cos b + a sin b". For "-2^-(2+2)" note that exponentiation has higher precedence than negation.
- myk9001 6y agoTake a look at "Parsing expressions by precedence climbing"[1] by Eli Bendersky. See the "Other resources" section for other approaches to this problem. 1: https://eli.thegreenplace.net/2012/08/02/parsing-expressions-by-precedence-climbing https://eli.thegreenplace.net/2012/08/02/parsing-expressions...
- musicale 6y ago1) Like the original article, this leaves unary operators as an exercise for the reader (though it does note so explicitly and provides a small hint) 2) This looks more like Pratt parsing vs. the approach described in the article 3) I was asking the original author
- thysultan 6y agoTake the current + next node i.e: parse_node + parse_peek When parse_node is an operator you know it is the "-2" in "-2^-2(2+2)" and when parse_peek is the operator it is "-(2+2)" in the same. An example of this: - https://github.com/thysultan/Ally/blob/8ba0b4de7ab104ceae54d810fced69f43ca852cc/src/Parser.js#L140-L197 https://github.com/thysultan/Ally/blob/8ba0b4de7ab104ceae54d...
- musicale 6y ago1) This reference is cryptic 2) I was asking the original author for a simple extension to the presented appraoch
- deleted 6y ago[deleted]
- musicale 6y agoThanks for the other replies, but I was asking the original author for a suggestion using the presented framework, rather than an alternate algorithm or approach from someone else. As presented, the approach didn't seem to handle unary operators. I probably should have noted that I am already familiar with Pratt parsing, which seems like something that isn't actually brain-dead simple and obvious in the same way (which is why it was worth writing a paper about in the 1970s.) Hoping for a reply from the original author to recommend a simple approach to add unary operators.
- tiarkrompf 6y agoGreat question! Unary operators are really simple to add: you just look for the operator symbol first thing at the right level of precedence. Same idea as "if (peek == '(') ..." for parentheses, but outside the code that deals with '*' and '^' (if you want those to bind more strongly).