;;; Recursive descent parser generator -- sample program ;;; ;;; (C) 2008 Gergő ÉRDI ;;; http://cactus.rulez.org/ (in-package :common-lisp-user) (eval-when (:compile-toplevel :load-toplevel :execute) (require :lexer) (require :parser-recdesc)) (defpackage :cactus.parser-recdesc.example (:use :common-lisp :cactus.parser-recdesc :lexer) (:export :test)) (in-package :cactus.parser-recdesc.example) (defparser expression-parser E (E (T E^)) (E^ ("+" T E^) ()) (T (F T^)) (T^ ("*" F T^) ()) (F ("(" E ")") (int))) (deflexer test-lexer ("[0-9]+" (return (values 'int (int %0)))) ("[+*()]" (return %0)) ("[:space:]+") ) (defun test (input) (labels ((terminal-matches? (terminal token) (equal (car terminal) token))) (let* ((lex (test-lexer input)) (tokens (loop for foo = (multiple-value-list (funcall lex)) while (car foo) collecting foo))) (pprint tokens) (pprint (expression-parser tokens #'terminal-matches?))))) (eval-when (:execute) (test "(10 + 5) * 2"))