From 73878205427178e41bb42dc78820610c8e1ad9c6 Mon Sep 17 00:00:00 2001 From: Utz-Uwe Haus Date: Wed, 1 Oct 2008 22:40:33 +0200 Subject: [PATCH] Clean up library API. Signed-off-by: Utz-Uwe Haus --- entrypoints.lisp | 34 +++++++++++++++++++++++----------- package.lisp | 15 ++++++++------- pegparser-boot.lisp | 2 +- pegutils.lisp | 8 ++++---- 4 files changed, 36 insertions(+), 23 deletions(-) diff --git a/entrypoints.lisp b/entrypoints.lisp index a270d0e..a612595 100644 --- a/entrypoints.lisp +++ b/entrypoints.lisp @@ -33,24 +33,36 @@ (in-package #:opossum) +;; low-level macros +(defmacro get-string-parser (pkg) + "Return the parse-string function in the package PKG." + `(let ((*package* ,pkg)) + #'parse-string)) + +(defmacro get-file-parser (pkg) + "Return the parse-file function in the package PKG." + `(let ((*package* ,pkg)) + #'parse-file)) +(defmacro get-stream-parser (pkg) + "Return the parse-stream function in the package PKG." + `(let ((*package* ,pkg)) + #'parse-stream)) + ;;; parser entry point -(defun make-string-parser (grammarfile head &key (dst-package (make-default-dst-package grammarfile))) +(defun make-string-parser (grammarfile &rest args + &key start-rule dst-package ) "Return a function of 1 argument, a string, that parses according to GRAMMARFILE, starting at rule named HEAD. The parser is instantiated in package DST-PACKAGE." - (opossum:generate-parser-package grammarfile dst-package head) - (let ((*package* dst-package)) - #'parse-string)) + (declare (ignore start-rule dst-package)) + (get-string-parser + (apply #'opossum:generate-parser-package grammarfile args))) (defun make-file-parser (grammarfile head &key (dst-package (make-default-dst-package grammarfile))) "Return a function of 1 argument, a file, that parses according to GRAMMARFILE, starting at rule named HEAD. The parser is instantiated in package DST-PACKAGE." - (opossum:generate-parser-package grammarfile dst-package head) - (let ((*package* dst-package)) - #'parse-file)) + (get-file-parser (opossum:generate-parser-package grammarfile dst-package head))) (defun make-stream-parser (grammarfile head &key (dst-package (make-default-dst-package grammarfile))) - "Return a function of 1 argument, a file, that parses according to GRAMMARFILE, starting at rule named HEAD. The parser is instantiated in package DST-PACKAGE." - (opossum:generate-parser-package grammarfile dst-package head) - (let ((*package* dst-package)) - #'parse-stream)) + "Return a function of 1 argument, a stream, that parses according to GRAMMARFILE, starting at rule named HEAD. The parser is instantiated in package DST-PACKAGE." + (get-stream-parser (opossum:generate-parser-package grammarfile dst-package head))) diff --git a/package.lisp b/package.lisp index 6d4da94..38a91d2 100644 --- a/package.lisp +++ b/package.lisp @@ -37,13 +37,14 @@ (:export #:context) ;; special variables (:export #:*context*) - ;; user-visible functions - (:export #:read-file #:read-stream - #:parse-file #:parse-string #:parse-stream - #:generate-parser-file - #:generate-parser-package - #:make-string-parser - #:make-file-parser)) + ;; low-level user interface + (:export #:generate-parser-file #:generate-parser-package + #:get-string-parser #:get-file-parser #:get-stream-parser + #:parse-file #:parse-string #:parse-stream) + ;; high-level user interface + (:export #:make-string-parser + #:make-file-parser + #:make-stream-parser)) diff --git a/pegparser-boot.lisp b/pegparser-boot.lisp index 58f127b..f24368c 100644 --- a/pegparser-boot.lisp +++ b/pegparser-boot.lisp @@ -5,7 +5,7 @@ (defun parse-file (f) (let ((opossum:*context* (make-instance 'opossum:context :start-index 0 :destpkg *package* - :input (opossum:read-file f)))) + :input (opossum::read-file f)))) (funcall (|parse_program|) 0))) (DEFUN |parse_program| () diff --git a/pegutils.lisp b/pegutils.lisp index 9fbd230..b5e928e 100644 --- a/pegutils.lisp +++ b/pegutils.lisp @@ -373,10 +373,10 @@ returns the result of that function, or a failure context if none succeeded." (make-package (gensym "opossum-parser") :documentation (format T "Opossum parser for grammar ~A" grammarfile))) -(defun generate-parser-package (grammarfile dst-package head &key start-rule (parse-file-fun #'opossum:parse-file)) +(defun generate-parser-package (grammarfile &key (dst-package (make-package (gensym "opossum-parser-"))) + start-rule (parse-file-fun #'opossum:parse-file)) "Create functions to parse using GRAMMARFILE in DST-PACKAGE, starting ar rule named HEAD. DST-PACKAGE will contain the 3 functions PARSE-STRING, PARSE-FILE and PARSE-STREAM as exported entrypoints." - (declare (ignore start-rule)) (error "This is broken and needs to be merged with g-p-f.") (let ((*package* dst-package)) (multiple-value-bind (form actions) @@ -390,9 +390,9 @@ DST-PACKAGE will contain the 3 functions PARSE-STRING, PARSE-FILE and PARSE-STRE :do (format *debug-io* "Compiled ~A~%" sym)) (intern (compile 'parse-string #'(lambda (s) - `,(format nil "Parse S using grammar ~A starting at ~A" grammarfile head) + `,(format nil "Parse S using grammar ~A starting at ~A" grammarfile start-rule) (let ((*context* (make-instance 'opossum:context :dstpkg *package* :input s))) - (funcall (make-name head) 0))))) + (funcall (make-name start-rule) 0))))) (intern (compile 'parse-file #'(lambda (f) (parse-string (read-file f))))) (intern (compile 'parse-stream -- 2.11.4.GIT