Paste number 63188: how to reduce nesting?

Index of paste annotations: 1

Paste number 63188: how to reduce nesting?
Pasted by: weirdo
When:1 year, 1 day ago
Share:Tweet this! | http://paste.lisp.org/+1CR8
Channel:None
Paste contents:
Raw Source | XML | Display As
CL-USER> (defparser *test-parser*
	     expression
	   (open-paren symbol close-paren comma)
	   ((expression    -> function-call
			   -> symbol)
	    (function-call -> symbol open-paren argument-list close-paren)
	    (argument-list -> argument-list comma expression
			      (:call (lambda (args c expr)
				      (cons args expr)))
			   -> expression)))

CL-USER> (parser-lr (make-pcre-lexer "foo(bar,baz,xenu(elron))"
				     '((symbol "(?i)[a-z][a-z0-9_]*")
				       (open-paren "\\(")
				       (close-paren "\\)")
				       (comma ",")
				       (whitespace "[	 ]+")))
			   *test-parser*)

("foo" "(" (("bar" . "baz") "xenu" "(" "elron" ")") ")")

Annotations for this paste:

Annotation number 1: css parser example
Pasted by: haiwei
When:1 year, 1 day ago
Share:Tweet this! | http://paste.lisp.org/+1CR8#1
Paste contents:
Raw Source | Display As
(fucc:defparser *css-parser* 
    stylesheet
  (space ident percent length number ems emx angle time freq
         string includes dashmatch
         hash page-sym media-sym
         import-sym important uri 
         |}| |{| |:| |;| |.| |,| |(| |)| |[| |]| |/| + - |>| |*| |=| |@|)

  ((stylesheet	-> s (:* import) (:var css-rules (:* (:or ruleset media page)))
                (:do (identity css-rules)))
   (s		-> (:* space))
   (import	-> import-sym s (:or string uri) s
                (:* medium ) s |;| s )
   (media	->  media-sym s (:list medium comma) { s (:* ruleset) } s 
                (:do nil))
   (medium	-> ident s)
   (page	-> page-sym s (:maybe pseudo-page) s { s 
                (:list declaration colon) } s (:do nil))
   (pseudo-page	-> |:| ident )
   (operator	-> |/| s
                -> |,| s
                -> )
   (combinator	-> + s
                -> |>| s
                -> (:+ space))
   (unary-operator -> (:or + -))
   (ruleset	-> (:var sel (:list selector comma)) s
                { s (:var par (:list declaration colon)) } s
                (:do (list sel (apply #'append par))))
   (colon	-> |;| s)
   (comma	-> |,| s)
   (selector	-> (:list simple-selector combinator))
   (simple-selector -> (:var name element-name) (:var pairs 
                                                      (:* (:or hash class 
                                                               attrib pseudo)))
                    (:do (append (list name) (flatten pairs)))
                    -> (:var pairs
                             (:+ (:or hash class attrib pseudo)))
                    (:do (append (list nil) (flatten pairs))))
   (class	-> |.| (:var id ident) (:do (list :class id)))
   (element-name -> (:var ele (:or ident |*|))
                 (:do (intern (string-upcase ele) :keyword)))
   (attrib	-> |[| s (:var key ident) s 
                (:var val (:maybe (:or |=| includes dashmatch ) s
                                  (:or ident string) s))
                |]|
                (:do (list (intern (string-upcase key) 'keyword)
                           (third val))))
   (pseudo	-> |:| (:or ident pseudo-func) (:do (list :nouse t)))
   (pseudo-func -> ident |(| s (:maybe ident) s |)|)
   (declaration	-> (:var key property) |:| s (:var vals expr) (:maybe prio)
                (:do (list (intern (string-upcase key) 'keyword) 
                           (if (= (length vals) 1) (first vals) vals)))
                -> )
   (prio	-> important s)
   (property	-> (:var id ident) s (:do (identity id)))
   (expr	-> (:list term operator))
   (term	-> (:var minus (:maybe unary-operator))
                (:var val (:or number percent length ems emx angle time freq)) s
                (:do (if (eql minus '-)
                         (identity (CL:- val)) 
                         (identity val)))
                -> (:var minus (:maybe unary-operator))
                (:var val number) s
                (:do (if (eql minus '-)
                       (cons (first val) (CL:- (second val)))
                       (identity val)))
                -> (:var val (:or string ident uri)) s (:do (identity val))
                -> (:or hexcolor function))
   (function	-> ident |(| s expr |)| (:*))
   (hexcolor	-> hash s)))

Colorize as:
Show Line Numbers
Index of paste annotations: 1

Lisppaste pastes can be made by anyone at any time. Imagine a fearsomely comprehensive disclaimer of liability. Now fear, comprehensively.