smalltalk-tng
diff experiments/precedence-parsing.scm @ 321:c4a0718c2d3c
Sketch of dependencies
| author | Tony Garnock-Jones <tonygarnockjones@gmail.com> |
|---|---|
| date | Sat Oct 08 15:36:03 2011 -0400 (7 months ago) |
| parents | |
| children |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/experiments/precedence-parsing.scm Sat Oct 08 15:36:03 2011 -0400 1.3 @@ -0,0 +1,58 @@ 1.4 +(define table '((== non 4) 1.5 + (: right 5) 1.6 + (++ right 5) 1.7 + (+ left 6) 1.8 + (- left 6) 1.9 + (* left 7) 1.10 + (/ left 7))) 1.11 + 1.12 +(define (parse exp) 1.13 + (define (p-op lhs exp min-precedence k) 1.14 + ;;(write `(p-op ,lhs ,exp ,min-precedence)) (newline) 1.15 + (if (null? exp) 1.16 + (k lhs exp) 1.17 + (let ((op (car exp)) 1.18 + (rest0 (cdr exp))) 1.19 + (cond 1.20 + ((assq op table) => 1.21 + (lambda (entry) 1.22 + (let ((fixity (cadr entry)) 1.23 + (prec (caddr entry))) 1.24 + (if (>= prec min-precedence) 1.25 + (p-val rest0 1.26 + (lambda (rhs rest) 1.27 + (let loop ((rhs rhs) 1.28 + (rest rest)) 1.29 + ;;(write `(loop ,rhs ,rest)) (newline) 1.30 + (if (null? rest) 1.31 + (k `(,op ,lhs ,rhs) rest) 1.32 + (let ((lookahead (car rest))) 1.33 + (cond 1.34 + ((assq lookahead table) => 1.35 + (lambda (lentry) 1.36 + (let ((lfixity (cadr lentry)) 1.37 + (lprec (caddr lentry))) 1.38 + (if (or (and (eq? lfixity 'right) (= lprec prec)) 1.39 + (> lprec prec)) 1.40 + (p-op rhs rest lprec loop) 1.41 + (p-op `(,op ,lhs ,rhs) rest min-precedence k))))) 1.42 + (else (loop `(app ,rhs ,lookahead) (cdr rest)) 1.43 + ;; (p-op rhs rest min-precedence 1.44 +;; (lambda (v r) 1.45 +;; ;;(write `(loop-n ,v ,r)) (newline) 1.46 +;; (k `(,op ,lhs ,v) r))) 1.47 + ))))))) 1.48 + (k lhs exp))))) 1.49 + (else (p-op `(app ,lhs ,op) rest0 min-precedence k)))))) 1.50 + 1.51 + (define (p-val exp k) 1.52 + (k (car exp) (cdr exp))) 1.53 + 1.54 + (p-val exp (lambda (lhs rest) 1.55 + (p-op lhs rest 0 (lambda (result rest) 1.56 + (list 'result! result rest)))))) 1.57 + 1.58 +(write (parse '(1 + 2 + 2.5 : 3 * 4 y z * 6 : a : b : c))) 1.59 +;;(write (parse '(1 + 2 : 3 * 4 * 6 : foo))) 1.60 +(newline) 1.61 +
