2 comments

  • logdahl39 minutes ago
    Love Pratt parsing! Not a compiler guy, but I&#x27;ve spent way too many hours reflecting on parsing. I remember trying to get though the dragon book so many times and reading all about formal grammar etc. Until I landed on; recursive descent parsing + Pratt for expressions. Super simple technique, and for me is sufficient. I&#x27;m sure it doesn&#x27;t cover all cases, but just for toy languages it feels like we can usually do everything with 2-token lookahead.<p>Not to step on anyone&#x27;s toes, I just don&#x27;t feel that formal grammar theory is that important in practice. :^)
    • gignico15 minutes ago
      Until you need to do more than all-or-nothing parsing :) see tree-sitter for example, or any other efficient LSP implementation of incremental parsing.
  • priceishere13 minutes ago
    An even simpler way imo, is explicit functions instead of a precedence table, then the code pretty much has the same structure as EBNF.<p>Need to parse * before +? Begin at add, have it call parse_mul for its left and right sides, and so on.<p><pre><code> parse_mul() { left = parse_literal() while(is_mul_token()) { &#x2F;&#x2F; left associative right = parse_literal() make_mul_node(left, right) } } parse_add() { left = parse_mul() while(is_add_token()) { &#x2F;&#x2F; left associative right = parse_mul() make_add_node(left, right) } } </code></pre> Then just add more functions as you climb up the precedence levels.
    • kryptiskt1 minute ago
      You lose in versatility, then you can&#x27;t add user-defined operators, which is pretty easy with a Pratt parser.