Advertisement
Guest User

Parser

a guest
Dec 12th, 2017
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lisp 0.82 KB | None | 0 0
  1. (defstruct node
  2.   name weight children parent)
  3.  
  4. (alexa:define-string-lexer aoc-lexer
  5.   ()
  6.   ("[a-z]+" (return (values 'id (intern $@))))
  7.   ("\\(([0-9]+)\\)" (return (values 'weight (and $1 (parse-integer $1)))))
  8.   ("->" (return '->))
  9.   ("," (return '\,))
  10.   (" |\\n" (values)))
  11.  
  12. (yacc:define-parser *aoc-parser*
  13.   (:start-symbol nodes)
  14.   (:terminals (id weight -> \,))
  15.   (nodes
  16.    (node (lambda (n &aux (m (make-hash-table)))
  17.            (setf (gethash (node-name n) m) n)
  18.            m))
  19.    (node nodes (lambda (n ns)
  20.                  (setf (gethash (node-name n) ns) n)
  21.                  ns)))
  22.   (node
  23.    (id weight children-opt
  24.        (s:op (make-node :name _ :weight _ :children _))))
  25.  
  26.   (children-opt
  27.    ()
  28.    (-> children (s:op _2)))
  29.   (children
  30.    (id #'list)
  31.    (id \, children (s:op (cons _1 _3)))))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement