Pratt parsing es una caja negra que no necesitas entender para usar

Pratt parsing is a black box

La mayoría de los tutoriales de Pratt parsing explican el algoritmo de nueve líneas y omiten lo que de verdad importa: el cambio de mentalidad. En lugar de asociar acciones semánticas a reglas de producción, Pratt las asocia a los propios terminales mediante tablas de nuds y leds. Eso elimina la recursión por la izquierda, evita el backtracking y permite acciones con efectos secundarios que se ejecutan una sola vez. El autor lo usa en su compilador sin haber diseccionado nunca el fragmento original.

Pratt toma el parsing, que es algo realmente complicado, y lo reduce a una sola pregunta simple: ¿qué esperamos ver a la izquierda de un token?
  1. vinipsmaker

    El autor aquí.

    Estuve usando Pratt parsing durante casi un año en un lenguaje con muchas macros que he estado desarrollando antes de finalmente sentarme en mi silla a escribir mis pensamientos sobre Pratt parsing. El código está cerrado ahora mismo porque no quiero que los LLMs entrenen con mi código antes de la 0.1, pero lo abriré de nuevo más adelante.

    Encantado de responder preguntas.

  2. e12e

    Me gustaría ver un poco más sobre cómo se compara con peg o algo como ohm/ometa — ¿estoy en lo correcto al asumir que básicamente renuncias a los beneficios de una gramática legible como documentación?

    ¿Quizás solo necesito ver algo súper simple como una calculadora con expresiones lado a lado para entender el compromiso?

    https://ohmjs.org/

  3. ghusbands

    He escrito algunos Pratt parsers en mi tiempo. No necesitas un lexer y puedes tener más estados de parser que los que implican 'nud' y 'led'. Pueden ser increíblemente extensibles. Por ejemplo, si puedes parsear la expresión "{a:1, b:2}" entonces podrías tener naturalmente un estado Expr (nud), un estado Between (led) y un estado DictKey; eso podría inicialmente aceptar solo un identificador y dos puntos antes de recursar al estado Expr, pero luego podrías añadir expresiones dinámicas, quizás mediante una macro, para soportar [expr] como clave.

Más de este día

2026-11-03