(PROGN (LET ((RULES '((|parse_program| #'(LAMBDA () (SEQ (MANY #'(LAMBDA (OFFSET) (FUNCALL (CADR (ASSOC '|parse_ws| *RULES*)) OFFSET))) (MANY1 #'(LAMBDA (OFFSET) (FUNCALL (CADR (ASSOC '|parse_rule| *RULES*)) OFFSET))) (MAKE-ACTION " `(progn (let ((rules ',(second data))) (progn (let ((*rules* (loop for (name body) in rules collect (list name (funcall (eval body)))))) (funcall (cadr (assoc '|parse_program| *rules*)) 0))))) ")))) (|parse_rule| #'(LAMBDA () (SEQ #'(LAMBDA (OFFSET) (FUNCALL (CADR (ASSOC '|parse_id| *RULES*)) OFFSET)) (MANY #'(LAMBDA (OFFSET) (FUNCALL (CADR (ASSOC '|parse_ws| *RULES*)) OFFSET))) (MATCH-STRING '"<-") (MANY #'(LAMBDA (OFFSET) (FUNCALL (CADR (ASSOC '|parse_ws| *RULES*)) OFFSET))) #'(LAMBDA (OFFSET) (FUNCALL (CADR (ASSOC '|parse_ordered-expr-list| *RULES*)) OFFSET)) (MANY #'(LAMBDA (OFFSET) (FUNCALL (CADR (ASSOC '|parse_ws_or_nl| *RULES*)) OFFSET))) (MAKE-ACTION " `(,(make-name (first data)) #'(lambda () ,(fifth data))) ")))) (|parse_ordered-expr-list| #'(LAMBDA () (EITHER (SEQ #'(LAMBDA (OFFSET) (FUNCALL (CADR (ASSOC '|parse_expr-list| *RULES*)) OFFSET)) (MANY #'(LAMBDA (OFFSET) (FUNCALL (CADR (ASSOC '|parse_ws| *RULES*)) OFFSET))) (MATCH-STRING '"/") (MANY #'(LAMBDA (OFFSET) (FUNCALL (CADR (ASSOC '|parse_ws| *RULES*)) OFFSET))) #'(LAMBDA (OFFSET) (FUNCALL (CADR (ASSOC '|parse_ordered-expr-list| *RULES*)) OFFSET)) (MAKE-ACTION " (let ((tail (fifth data))) (if (equal (first tail) 'either) `(either ,(first data) ,@(rest tail)) `(either ,(first data) ,(fifth data)))) ")) (SEQ #'(LAMBDA (OFFSET) (FUNCALL (CADR (ASSOC '|parse_expr-list| *RULES*)) OFFSET)) (MAKE-ACTION " (first data) "))))) (|parse_expr-list| #'(LAMBDA () (SEQ #'(LAMBDA (OFFSET) (FUNCALL (CADR (ASSOC '|parse_expr| *RULES*)) OFFSET)) (MANY (SEQ (MANY1 #'(LAMBDA (OFFSET) (FUNCALL (CADR (ASSOC '|parse_ws| *RULES*)) OFFSET))) #'(LAMBDA (OFFSET) (FUNCALL (CADR (ASSOC '|parse_expr-list| *RULES*)) OFFSET)))) (MAKE-ACTION " (if (or (equal (second data) \"\") (null (second data))) (first data) (let ((tail (second (first (second data))))) (if (equal (first tail) 'seq) `(seq ,(first data) ,@(rest tail)) `(seq ,(first data) ,tail)))) ")))) (|parse_expr| #'(LAMBDA () (EITHER (SEQ #'(LAMBDA (OFFSET) (FUNCALL (CADR (ASSOC '|parse_simple-expr| *RULES*)) OFFSET)) (MATCH-STRING '"*") (MAKE-ACTION " `(many ,(first data)) ")) (SEQ #'(LAMBDA (OFFSET) (FUNCALL (CADR (ASSOC '|parse_simple-expr| *RULES*)) OFFSET)) (MATCH-STRING '"+") (MAKE-ACTION " `(many1 ,(first data)) ")) (SEQ #'(LAMBDA (OFFSET) (FUNCALL (CADR (ASSOC '|parse_simple-expr| *RULES*)) OFFSET)) (MATCH-STRING '"?")) (SEQ #'(LAMBDA (OFFSET) (FUNCALL (CADR (ASSOC '|parse_simple-expr| *RULES*)) OFFSET)) (MAKE-ACTION " (first data) "))))) (|parse_simple-expr| #'(LAMBDA () (EITHER (SEQ #'(LAMBDA (OFFSET) (FUNCALL (CADR (ASSOC '|parse_string| *RULES*)) OFFSET)) (MAKE-ACTION " (first data) ")) #'(LAMBDA (OFFSET) (FUNCALL (CADR (ASSOC '|parse_action| *RULES*)) OFFSET)) (SEQ #'(LAMBDA (OFFSET) (FUNCALL (CADR (ASSOC '|parse_id| *RULES*)) OFFSET)) (MAKE-ACTION " (make-call-rule-closure (make-name (first data))) ")) (SEQ #'(LAMBDA (OFFSET) (FUNCALL (CADR (ASSOC '|parse_bracketed-rule| *RULES*)) OFFSET)) (MAKE-ACTION " (first data) ")) (MATCH-STRING '"!.") (SEQ (MATCH-STRING '"!") #'(LAMBDA (OFFSET) (FUNCALL (CADR (ASSOC '|parse_expr| *RULES*)) OFFSET)) (MAKE-ACTION " `(negate ,(second data)) ")) (SEQ #'(LAMBDA (OFFSET) (FUNCALL (CADR (ASSOC '|parse_character-class| *RULES*)) OFFSET)) (MAKE-ACTION " (first data) ")) (SEQ (MATCH-STRING '".") (MAKE-ACTION " `(match-any-char 'dummy) "))))) (|parse_bracketed-rule| #'(LAMBDA () (EITHER (MATCH-STRING '"()") (SEQ (MATCH-STRING '"(") (MANY #'(LAMBDA (OFFSET) (FUNCALL (CADR (ASSOC '|parse_ws| *RULES*)) OFFSET))) #'(LAMBDA (OFFSET) (FUNCALL (CADR (ASSOC '|parse_ordered-expr-list| *RULES*)) OFFSET)) (MANY #'(LAMBDA (OFFSET) (FUNCALL (CADR (ASSOC '|parse_ws| *RULES*)) OFFSET))) (MATCH-STRING '")") (MAKE-ACTION " (third data) "))))) (|parse_id| #'(LAMBDA () (SEQ (MANY1 (MATCH-CHAR '(#\A #\B #\C #\D #\E #\F #\G #\H #\I #\J #\K #\L #\M #\N #\O #\P #\Q #\R #\S #\T #\U #\V #\W #\X #\Y #\Z #\a #\b #\c #\d #\e #\f #\g #\h #\i #\j #\k #\l #\m #\n #\o #\p #\q #\r #\s #\t #\u #\v #\w #\x #\y #\z #\- #\_))) (MAKE-ACTION " (char-list-to-string (first data)) ")))) (|parse_character-class| #'(LAMBDA () (SEQ (MATCH-STRING '"[") (MANY1 (SEQ #'(LAMBDA (OFFSET) (FUNCALL (CADR (ASSOC '|parse_not_right_bracket| *RULES*)) OFFSET)) (MATCH-ANY-CHAR 'DUMMY))) (MATCH-STRING '"]") (MAKE-ACTION " `(match-char ',(fix-escapes (map 'list #'(lambda (string) (elt string 0)) (zip-second (second data))))) ")))) (|parse_string| #'(LAMBDA () (SEQ (MATCH-CHAR '(#\")) (MANY (SEQ (NEGATE (MATCH-CHAR '(#\"))) (MATCH-ANY-CHAR 'DUMMY))) (MATCH-CHAR '(#\")) (MAKE-ACTION " `(match-string ,(char-list-to-string (zip-second (second data)))) ")))) (|parse_action| #'(LAMBDA () (SEQ (MATCH-CHAR '(#\{)) (MANY (SEQ (NEGATE (MATCH-CHAR '(#\}))) (MATCH-ANY-CHAR 'DUMMY))) (MATCH-CHAR '(#\})) (MAKE-ACTION " `(make-action ,(char-list-to-string (fix-escapes (map 'list #'(lambda (string) (elt string 0)) (zip-second (second data)))))) ")))) (|parse_not_right_bracket| #'(LAMBDA () (NEGATE (MATCH-STRING '"]")))) (|parse_ws| #'(LAMBDA () (MATCH-CHAR '(#\ #\Tab)))) (|parse_nl| #'(LAMBDA () (MATCH-CHAR '(#\Newline)))) (|parse_ws_or_nl| #'(LAMBDA () (EITHER #'(LAMBDA (OFFSET) (FUNCALL (CADR (ASSOC '|parse_ws| *RULES*)) OFFSET)) #'(LAMBDA (OFFSET) (FUNCALL (CADR (ASSOC '|parse_nl| *RULES*)) OFFSET)))))))) (PROGN (LET ((*RULES* (LOOP FOR (NAME BODY) IN RULES COLLECT (LIST NAME (FUNCALL (EVAL BODY)))))) (FUNCALL (CADR (ASSOC '|parse_program| *RULES*)) 0)))))