(in-package #:sod) (defun try-parse* (parser string) (call-with-module-environment (lambda () (let* ((char-scanner (make-string-scanner string)) (scanner (make-instance 'sod-token-scanner :char-scanner char-scanner))) (funcall parser scanner))))) (defmacro try-parse ((scanner string) &body parser) `(try-parse* (lambda (,scanner) (with-parser-context (token-scanner-context :scanner ,scanner) ,@parser)) ,string))