RustConf 2023 - Anything you can do, I can do worse with macro_rules!

Simplify complex macro development with Rust's `macro_rules!` by leveraging callbacks, token trees, and incremental parsing to transform syntax and parse large inputs.

Key takeaways
  • Macros can be complex and difficult to debug, but callbacks can simplify the process.
  • Recursion is a key concept in macros, and it’s used to build a recursive tree of token matching.
  • Tokens can be parsed using repetitive patterns, such as repetition specifier which includes ?, *, and +.
  • Incremental token tree munchers are useful for parsing large inputs by breaking them down into smaller chunks.
  • Pushdown accumulation allows for accumulating tokens in intermediate states.
  • The XML parsing macros are a good example of how macros can be used to transform a syntax.
  • Declarative macros are another type of macro that can be used, but they are difficult to debug.
  • Macro rules cannot be recursive, ambiguous, or violate Rust parsing ambiguity rules.
  • Descriptive names are important for macros, and using them can simplify debugging.
  • Internal rules are necessary for creating a consistent framework for macros.
  • Token tree bundling is a way to combine tokens into a single token tree.
  • Fragments and token trees can be used to simplify complex parsing operations.
  • Callbacks can be used to simplify the process of parsing complex inputs.
  • Debugging macros can be challenging, but using descriptive names and a consistent framework can make it easier.