diff options
Diffstat (limited to 'docgen.lisp')
-rw-r--r-- | docgen.lisp | 40 |
1 files changed, 25 insertions, 15 deletions
diff --git a/docgen.lisp b/docgen.lisp index 49b0d34..1414ab3 100644 --- a/docgen.lisp +++ b/docgen.lisp @@ -2,13 +2,17 @@ (in-package #:argot) +(defun rule-name-string (rulename) + (let ((str (symbol-name rulename))) + (nstring-downcase (subseq str 1 (1- (length str)))))) + (defun write-rule-doc (lhs pattern) - (format *standard-output* "~15s ::= " lhs) + (format *standard-output* "~15a ::= " (rule-name-string lhs)) (write-pattern-doc pattern)) -(defun write-sequence-doc (args ) +(defun write-sequence-doc (args) (loop :for (a . more) :on args - :do (write-pattern-doc a ) + :do (write-pattern-doc a) (when more (princ " " )))) @@ -36,26 +40,32 @@ (defun write-grammar-pattern-doc (grammar-name) (princ "{") (princ grammar-name) (princ "}")) +(defun write-literal (object) + (format *standard-output* "'~a'" (write-to-string object))) + (defun write-pattern-doc (pattern) (cond ((nonterminal? pattern) - (princ pattern)) + (format *standard-output* "~a" (rule-name-string pattern))) ((atom pattern) - (princ "'") (princ pattern) (princ "'")) + (write-literal pattern)) (t (destructuring-bind (op . args) pattern (case op - ((:seq :seq=) (write-sequence-doc args )) - ((:? :?=) (write-optional-doc (first args))) - ((:* :*=) (write-kleene-doc (first args))) - ((:+ :+=) (write-one-or-more-doc (first args))) - ((:or :or=) (write-alternatives-doc args)) - - (:= (princ (first args))) + (:seq (write-sequence-doc args)) + (:seq= (write-sequence-doc args )) + (:? (write-optional-doc (first args))) + (:?= (write-optional-doc (first args) )) + (:* (write-kleene-doc (first args))) + (:*= (write-kleene-doc (first args) )) + (:+ (write-one-or-more-doc (first args))) + (:+= (write-one-or-more-doc (first args) )) + (:or (write-alternatives-doc args)) + (:or= (write-alternatives-doc args )) + (:= (print-literal (first args))) (:@ (write-pattern-doc (second args))) (:{} (write-grammar-pattern-doc (first args))) - - (:item (princ "::TOKEN::")) - (:eof (princ "::EOF::"))))))) + (:item (princ "token")) + (:eof (princ "eof"))))))) |