⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 earley.scm

📁 Scheme跨平台编译器
💻 SCM
📖 第 1 页 / 共 2 页
字号:
            (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 + -