📄 earley.scm
字号:
(if (conf-set-member? state conf i) (let* ((state* (vector-ref states* state-num)) (conf-set* (conf-set-get* state* state-num conf))) (if (not (conf-set-next conf-set* i)) (conf-set-adjoin state* conf-set* conf i)) #t) #f))) (define (conf-set-union state conf-set conf other-set) (let loop ((i (conf-set-head other-set))) (if (>= i 0) (if (not (conf-set-next conf-set i)) (begin (conf-set-adjoin state conf-set conf i) (loop (conf-set-next other-set i))) (loop (conf-set-next other-set i)))))) (define (forw states state-num starters enders predictors steps nts) (define (predict state state-num conf-set conf nt starters enders) ; add configurations which start the non-terminal `nt' to the ; right of the dot (let loop1 ((l (vector-ref starters nt))) (if (pair? l) (let* ((starter (car l)) (starter-set (conf-set-get* state state-num starter))) (if (not (conf-set-next starter-set state-num)) (begin (conf-set-adjoin state starter-set starter state-num) (loop1 (cdr l))) (loop1 (cdr l)))))) ; check for possible completion of the non-terminal `nt' to the ; right of the dot (let loop2 ((l (vector-ref enders nt))) (if (pair? l) (let ((ender (car l))) (if (conf-set-member? state ender state-num) (let* ((next (+ conf 1)) (next-set (conf-set-get* state state-num next))) (conf-set-union state next-set next conf-set) (loop2 (cdr l))) (loop2 (cdr l))))))) (define (reduce states state state-num conf-set head preds) ; a non-terminal is now completed so check for reductions that ; are now possible at the configurations `preds' (let loop1 ((l preds)) (if (pair? l) (let ((pred (car l))) (let loop2 ((i head)) (if (>= i 0) (let ((pred-set (conf-set-get (vector-ref states i) pred))) (if pred-set (let* ((next (+ pred 1)) (next-set (conf-set-get* state state-num next))) (conf-set-union state next-set next pred-set))) (loop2 (conf-set-next conf-set i))) (loop1 (cdr l)))))))) (let ((state (vector-ref states state-num)) (nb-nts (vector-length nts))) (let loop () (let ((conf (vector-ref state 0))) (if (>= conf 0) (let* ((step (vector-ref steps conf)) (conf-set (vector-ref state (+ conf 1))) (head (vector-ref conf-set 4))) (vector-set! state 0 (vector-ref conf-set 0)) (conf-set-merge-new! conf-set) (if (>= step 0) (predict state state-num conf-set conf step starters enders) (let ((preds (vector-ref predictors (+ step nb-nts)))) (reduce states state state-num conf-set head preds))) (loop))))))) (define (forward starters enders predictors steps nts toks) (let* ((nb-toks (vector-length toks)) (nb-confs (vector-length steps)) (states (make-states nb-toks nb-confs)) (goal-starters (vector-ref starters 0))) (conf-set-adjoin* states 0 goal-starters 0) ; predict goal (forw states 0 starters enders predictors steps nts) (let loop ((i 0)) (if (< i nb-toks) (let ((tok-nts (cdr (vector-ref toks i)))) (conf-set-adjoin* states (+ i 1) tok-nts i) ; scan token (forw states (+ i 1) starters enders predictors steps nts) (loop (+ i 1))))) states)) (define (produce conf i j enders steps toks states states* nb-nts) (let ((prev (- conf 1))) (if (and (>= conf nb-nts) (>= (vector-ref steps prev) 0)) (let loop1 ((l (vector-ref enders (vector-ref steps prev)))) (if (pair? l) (let* ((ender (car l)) (ender-set (conf-set-get (vector-ref states j) ender))) (if ender-set (let loop2 ((k (conf-set-head ender-set))) (if (>= k 0) (begin (and (>= k i) (conf-set-adjoin** states states* k prev i) (conf-set-adjoin** states states* j ender k)) (loop2 (conf-set-next ender-set k))) (loop1 (cdr l)))) (loop1 (cdr l))))))))) (define (back states states* state-num enders steps nb-nts toks) (let ((state* (vector-ref states* state-num))) (let loop1 () (let ((conf (vector-ref state* 0))) (if (>= conf 0) (let* ((conf-set (vector-ref state* (+ conf 1))) (head (vector-ref conf-set 4))) (vector-set! state* 0 (vector-ref conf-set 0)) (conf-set-merge-new! conf-set) (let loop2 ((i head)) (if (>= i 0) (begin (produce conf i state-num enders steps toks states states* nb-nts) (loop2 (conf-set-next conf-set i))) (loop1))))))))) (define (backward states enders steps nts toks) (let* ((nb-toks (vector-length toks)) (nb-confs (vector-length steps)) (nb-nts (vector-length nts)) (states* (make-states nb-toks nb-confs)) (goal-enders (vector-ref enders 0))) (let loop1 ((l goal-enders)) (if (pair? l) (let ((conf (car l))) (conf-set-adjoin** states states* nb-toks conf 0) (loop1 (cdr l))))) (let loop2 ((i nb-toks)) (if (>= i 0) (begin (back states states* i enders steps nb-nts toks) (loop2 (- i 1))))) states*)) (define (parsed? nt i j nts enders states) (let ((nt* (ind nt nts))) (if nt* (let ((nb-nts (vector-length nts))) (let loop ((l (vector-ref enders nt*))) (if (pair? l) (let ((conf (car l))) (if (conf-set-member? (vector-ref states j) conf i) #t (loop (cdr l)))) #f))) #f))) (define (deriv-trees conf i j enders steps names toks states nb-nts) (let ((name (vector-ref names conf))) (if name ; `conf' is at the start of a rule (either special or not) (if (< conf nb-nts) (list (list name (car (vector-ref toks i)))) (list (list name))) (let ((prev (- conf 1))) (let loop1 ((l1 (vector-ref enders (vector-ref steps prev))) (l2 '())) (if (pair? l1) (let* ((ender (car l1)) (ender-set (conf-set-get (vector-ref states j) ender))) (if ender-set (let loop2 ((k (conf-set-head ender-set)) (l2 l2)) (if (>= k 0) (if (and (>= k i) (conf-set-member? (vector-ref states k) prev i)) (let ((prev-trees (deriv-trees prev i k enders steps names toks states nb-nts)) (ender-trees (deriv-trees ender k j enders steps names toks states nb-nts))) (let loop3 ((l3 ender-trees) (l2 l2)) (if (pair? l3) (let ((ender-tree (list (car l3)))) (let loop4 ((l4 prev-trees) (l2 l2)) (if (pair? l4) (loop4 (cdr l4) (cons (append (car l4) ender-tree) l2)) (loop3 (cdr l3) l2)))) (loop2 (conf-set-next ender-set k) l2)))) (loop2 (conf-set-next ender-set k) l2)) (loop1 (cdr l1) l2))) (loop1 (cdr l1) l2))) l2)))))) (define (deriv-trees* nt i j nts enders steps names toks states) (let ((nt* (ind nt nts))) (if nt* (let ((nb-nts (vector-length nts))) (let loop ((l (vector-ref enders nt*)) (trees '())) (if (pair? l) (let ((conf (car l))) (if (conf-set-member? (vector-ref states j) conf i) (loop (cdr l) (append (deriv-trees conf i j enders steps names toks states nb-nts) trees)) (loop (cdr l) trees))) trees))) #f))) (define (nb-deriv-trees conf i j enders steps toks states nb-nts) (let ((prev (- conf 1))) (if (or (< conf nb-nts) (< (vector-ref steps prev) 0)) 1 (let loop1 ((l (vector-ref enders (vector-ref steps prev))) (n 0)) (if (pair? l) (let* ((ender (car l)) (ender-set (conf-set-get (vector-ref states j) ender))) (if ender-set (let loop2 ((k (conf-set-head ender-set)) (n n)) (if (>= k 0) (if (and (>= k i) (conf-set-member? (vector-ref states k) prev i)) (let ((nb-prev-trees (nb-deriv-trees prev i k enders steps toks states nb-nts)) (nb-ender-trees (nb-deriv-trees ender k j enders steps toks states nb-nts))) (loop2 (conf-set-next ender-set k) (+ n (* nb-prev-trees nb-ender-trees)))) (loop2 (conf-set-next ender-set k) n)) (loop1 (cdr l) n))) (loop1 (cdr l) n))) n))))) (define (nb-deriv-trees* nt i j nts enders steps toks states) (let ((nt* (ind nt nts))) (if nt* (let ((nb-nts (vector-length nts))) (let loop ((l (vector-ref enders nt*)) (nb-trees 0)) (if (pair? l) (let ((conf (car l))) (if (conf-set-member? (vector-ref states j) conf i) (loop (cdr l) (+ (nb-deriv-trees conf i j enders steps toks states nb-nts) nb-trees)) (loop (cdr l) nb-trees))) nb-trees))) #f))) (let* ((lexer (vector-ref parser-descr 0)) (nts (vector-ref parser-descr 1)) (starters (vector-ref parser-descr 2)) (enders (vector-ref parser-descr 3)) (predictors (vector-ref parser-descr 4)) (steps (vector-ref parser-descr 5)) (names (vector-ref parser-descr 6)) (toks (input->tokens input lexer nts))) (vector nts starters enders predictors steps names toks (backward (forward starters enders predictors steps nts toks) enders steps nts toks) parsed? deriv-trees* nb-deriv-trees*))))))(define (parse->parsed? parse nt i j) (let* ((nts (vector-ref parse 0)) (enders (vector-ref parse 2)) (states (vector-ref parse 7)) (parsed? (vector-ref parse 8))) (parsed? nt i j nts enders states)))(define (parse->trees parse nt i j) (let* ((nts (vector-ref parse 0)) (enders (vector-ref parse 2)) (steps (vector-ref parse 4)) (names (vector-ref parse 5)) (toks (vector-ref parse 6)) (states (vector-ref parse 7)) (deriv-trees* (vector-ref parse 9))) (deriv-trees* nt i j nts enders steps names toks states)))(define (parse->nb-trees parse nt i j) (let* ((nts (vector-ref parse 0)) (enders (vector-ref parse 2)) (steps (vector-ref parse 4)) (toks (vector-ref parse 6)) (states (vector-ref parse 7)) (nb-deriv-trees* (vector-ref parse 10))) (nb-deriv-trees* nt i j nts enders steps toks states)))(define (test) (let ((p (make-parser '( (s (a) (s s)) ) (lambda (l) (map (lambda (x) (list x x)) l))))) (let ((x (p '(a a a a a a a a a)))) (length (parse->trees x 's 0 9)))))(time (test))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -