Table of Contents
Fetching ...

ZipLex: Verified Invertible Lexing with Memoized Derivatives and Zippers

Samuel Chassot, Viktor Kunčak

TL;DR

ZipLex tackles the challenge of verified invertible lexing by enforcing mutual invertibility of lexing and printing and by maintaining token separability with $R$-Path predicates. It pairs a Brzozowski derivative-based regex engine with a zipper optimization and a fully verified memoization framework, all implemented and verified in Scala with Stainless. The key contributions include the formalization of separability via $R$-Paths, the PrintableTokens abstraction, a verified zipper-based regex engine, and a reusable verified memoization infrastructure, yielding practical performance on JSON and language lexers. The results show ZipLex achieves invertibility guarantees without prohibitive costs, offering a promising path toward fully verified, mutually invertible parsing and pretty-printing workflows in real-world ecosystems.

Abstract

We present ZipLex, a verified framework for invertible lexical analysis. Unlike past verified lexers that focus only on satisfying the semantics of regular expressions and the maximal munch property, ZipLex also guarantees that lexing and printing are mutual inverses. Our design relies on two sets of ideas: (1) a new abstraction of token sequences that captures the separability of tokens in a sequence while supporting their efficient manipulation, and (2) a combination of verified data structures and optimizations, including Huet's zippers and memoized derivatives, to achieve practical performance. We implemented ZipLex in Scala and verified its correctness, including invertibility, using the Stainless verifier. Our evaluation demonstrates that ZipLex supports realistic applications such as JSON processing and lexers of programming languages. In comparison to other verified lexers (which do not enforce invertibility), ZipLex is 4x slower than Coqlex and two orders of magnitude faster than Verbatim++, showing that verified invertibility can be achieved without prohibitive cost.

ZipLex: Verified Invertible Lexing with Memoized Derivatives and Zippers

TL;DR

ZipLex tackles the challenge of verified invertible lexing by enforcing mutual invertibility of lexing and printing and by maintaining token separability with -Path predicates. It pairs a Brzozowski derivative-based regex engine with a zipper optimization and a fully verified memoization framework, all implemented and verified in Scala with Stainless. The key contributions include the formalization of separability via -Paths, the PrintableTokens abstraction, a verified zipper-based regex engine, and a reusable verified memoization infrastructure, yielding practical performance on JSON and language lexers. The results show ZipLex achieves invertibility guarantees without prohibitive costs, offering a promising path toward fully verified, mutually invertible parsing and pretty-printing workflows in real-world ecosystems.

Abstract

We present ZipLex, a verified framework for invertible lexical analysis. Unlike past verified lexers that focus only on satisfying the semantics of regular expressions and the maximal munch property, ZipLex also guarantees that lexing and printing are mutual inverses. Our design relies on two sets of ideas: (1) a new abstraction of token sequences that captures the separability of tokens in a sequence while supporting their efficient manipulation, and (2) a combination of verified data structures and optimizations, including Huet's zippers and memoized derivatives, to achieve practical performance. We implemented ZipLex in Scala and verified its correctness, including invertibility, using the Stainless verifier. Our evaluation demonstrates that ZipLex supports realistic applications such as JSON processing and lexers of programming languages. In comparison to other verified lexers (which do not enforce invertibility), ZipLex is 4x slower than Coqlex and two orders of magnitude faster than Verbatim++, showing that verified invertibility can be achieved without prohibitive cost.
Paper Structure (26 sections, 8 equations, 14 figures)

This paper contains 26 sections, 8 equations, 14 figures.

Figures (14)

  • Figure 1: JSON sorting application algorithm. Grey boxes represent instances of .
  • Figure 2: Token semantic value for JSON integer literal along with the injective transformation function.
  • Figure 3: ADT definitions for tokens and rules of the lexer framework. Signature of the lex function.
  • Figure 4: Rule definition for integer literal in the JSON lexer. The regular expression is expressed using user-defined syntactic sugars.
  • Figure 5: Correctness theorem (in Stainless) for the lex function, expressing the maximal munch property for lexical analysis
  • ...and 9 more figures