Advertisement
Guest User

Untitled

a guest
Apr 19th, 2019
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lisp 5.49 KB | None | 0 0
  1. (yacc:define-parser dsl-parser
  2.   (:start-symbol all)
  3.   (:terminals (number symbol identifier none
  4.               + - / * = < > equal expt
  5.                left-paren right-paren
  6.                left-square right-square
  7.                <- ->
  8.                define strategy
  9.                if then else cond
  10.                let in
  11.                comma))
  12.   (:precedence ((:left <-)
  13.                 (:left define strategy define-strategy)
  14.                 (:left ->)
  15.                 (:left anonymous)
  16.                 (:left expression)
  17.                 (:left left-paren right-paren)
  18.                 (:left comma)
  19.                 (:left funcall)
  20.                 (:left if cond)
  21.                 (:left cond-case)
  22.                 (:left square-list)
  23.                 (:left lambda-list)
  24.                 (:left begin)
  25.                 (:right expt)
  26.                 (:left = < > equal)
  27.                 (:left * /)
  28.                 (:left + -)
  29.                 (:left symbol number)))
  30.  
  31.   ;; (a, b, c)
  32.  
  33.   (lambda-list*
  34.    (right-paren (constantly nil))
  35.    (expression right-paren (lambda (a b) (declare (ignore b)) (list a)))
  36.    (expression comma lambda-list* (lambda (a b c)
  37.                                     (declare (ignore b))
  38.                                     (cons a c))))
  39.   (lambda-list
  40.    (left-paren lambda-list* (lambda (a b)
  41.                               (declare (ignore a))
  42.                               b)))
  43.  
  44.   ;; [a, b, c]
  45.  
  46.   (square-list*
  47.    (right-paren (constantly nil))
  48.    (expression right-square (lambda (a b) (declare (ignore b)) (list a)))
  49.    (expression comma square-list* (lambda (a b c)
  50.                                     (declare (ignore b))
  51.                                     (cons a c))))
  52.   (square-list
  53.    (left-square square-list* (lambda (a b)
  54.                                (declare (ignore a))
  55.                                b)))
  56.  
  57.   ;; a[b]
  58.   ;; a[b -> c]
  59.  
  60.   (subarray
  61.    (term left-square term -> term right-square
  62.          (lambda (a b c d e f)
  63.            (declare (ignore b d f))
  64.            (list 'subarray a c e)))
  65.    (term left-square term right-square
  66.          (lambda (a b c d)
  67.            (declare (ignore b d))
  68.            (list 'aref a c))))
  69.  
  70.   ;; f(x, y, ...)
  71.  
  72.   (funcall
  73.    (term lambda-list (lambda (a b)
  74.                        (cons a b))))
  75.  
  76.   ;; define f(x, y, ...) x
  77.  
  78.   (define-body
  79.    (define funcall expression))
  80.  
  81.   ;; strategy
  82.   (define-strategy
  83.    (strategy identifier parameter-list state-list anonymous
  84.     (lambda (b c d e f)
  85.       (declare (ignore b))
  86.       (list 'define-strategy c d e f))))
  87.   ;; foo = 4 -> options(4, 5, 6),
  88.   ;; bar = 1.0 -> slider(1.0, 10.0)
  89.   (parameter
  90.    (identifier = term -> funcall
  91.     (lambda (a b c d e)
  92.       (declare (ignore b d))
  93.       (list a c e))))
  94.   (parameter-list
  95.    (parameter comma parameter-list
  96.               (lambda (a b c)
  97.                 (declare (ignore b))
  98.                 (cons a c)))
  99.    (parameter #'list))
  100.   ;; state1 = 2,
  101.   ;; state2 = #false
  102.   ;; [or]
  103.   ;; none
  104.   (state
  105.    (identifier = term (lambda (a b c)
  106.                         (declare (ignore b))
  107.                         (list a c))))
  108.   (state-list
  109.    (none (constantly nil))
  110.    (state comma state-list (lambda (a b c)
  111.                              (declare (ignore b))
  112.                              (cons a c)))
  113.    (state #'list))
  114.    
  115.  
  116.   ;; cond c1 -> v1, c2 -> v2, ... else -> ve
  117.  
  118.   (cond-case
  119.    (else       -> expression (lambda (a b c)
  120.                                (declare (ignore a b))
  121.                                (list 't c)))
  122.    (expression -> expression (lambda (a b c)
  123.                                (declare (ignore b))
  124.                                (list a c))))
  125.  
  126.   (cond-list
  127.    (cond-case #'list)
  128.    (cond-case comma cond-list (lambda (a b c)
  129.                                 (declare (ignore b))
  130.                                 (cons a c))))
  131.  
  132.   (cond-expr
  133.    (cond cond-list #'cons))
  134.  
  135.   ;; (a, b, c)
  136.  
  137.   (begin
  138.    (lambda-list (lambda (a) (cons 'progn a))))
  139.  
  140.   ;; (a, b, ...) -> a
  141.  
  142.   (anonymous
  143.    (lambda-list -> expression
  144.     (lambda (a b c)
  145.       (declare (ignore b))
  146.       (list 'lambda a c))))
  147.   ;; let n1 = v1, n2 = v2, ... in x
  148.  
  149.   (let-bindings
  150.    (identifier = expression
  151.                (lambda (a b c)
  152.                  (declare (ignore b))
  153.                  (list (list a c))))
  154.    (identifier = expression comma let-bindings
  155.            (lambda (a b c d e)
  156.              (declare (ignore b d))
  157.              (cons (list a c) e))))
  158.   (let-form
  159.    (let let-bindings in expression
  160.         (lambda (a b c d)
  161.           (declare (ignore a c))
  162.           (list 'let* b d))))
  163.  
  164.   (toplevel
  165.    define-strategy
  166.    define-body
  167.    expression)
  168.  
  169.   (all
  170.    (toplevel #'list)
  171.    (toplevel all #'cons))
  172.  
  173.   (expression
  174.    (identifier <- expression #'i2p)
  175.    anonymous
  176.    begin
  177.    subarray
  178.    let-form
  179.    (expression = expression #'i2p)
  180.    (expression < expression #'i2p)
  181.    (expression > expression #'i2p)
  182.    (expression equal expression #'i2p)
  183.    (expression + expression #'i2p)
  184.    (expression * expression #'i2p)
  185.    (expression / expression #'i2p)
  186.    (expression expt expression #'i2p)
  187.    cond-expr
  188.    (if expression then expression else expression
  189.        (lambda (a b c d e f)
  190.          (declare (ignore c e))
  191.          (list a b d f)))
  192.    funcall
  193.    term)
  194.  
  195.   (term
  196.    number
  197.    symbol
  198.    none
  199.    identifier
  200.    (square-list (lambda (a) (cons 'vector a)))
  201.    (- term)
  202.    (left-paren expression right-paren (lambda (a b c) (declare (ignore a c)) b))))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement