You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
47 lines
1.4 KiB
Scheme
47 lines
1.4 KiB
Scheme
(module parser-actions mzscheme
|
|
(require "grammar.ss")
|
|
(provide (all-defined))
|
|
|
|
;; An action is
|
|
;; - (make-shift int)
|
|
;; - (make-reduce prod)
|
|
;; - (make-accept)
|
|
;; - (make-goto int)
|
|
|
|
(define-struct action () (make-inspector))
|
|
(define-struct (shift action) (state) (make-inspector))
|
|
(define-struct (reduce action) (prod) (make-inspector))
|
|
(define-struct (accept action) () (make-inspector))
|
|
(define-struct (goto action) (state) (make-inspector))
|
|
|
|
|
|
;; A runtime-action is
|
|
;; non-negative-int (shift)
|
|
;; (vector int symbol int) (reduce)
|
|
;; 'accept (accept)
|
|
;; negative-int (goto)
|
|
|
|
(define (action->runtime-action a)
|
|
(cond
|
|
((shift? a) (shift-state a))
|
|
((reduce? a)
|
|
(let ((p (reduce-prod a)))
|
|
(vector (prod-index p)
|
|
(gram-sym-symbol (prod-lhs p))
|
|
(vector-length (prod-rhs p)))))
|
|
((accept? a) 'accept)
|
|
((goto? a) (- (+ (goto-state a) 1)))))
|
|
|
|
(define (runtime-shift? x) (and (integer? x) (>= x 0)))
|
|
(define runtime-reduce? vector?)
|
|
(define (runtime-accept? x) (eq? x 'accept))
|
|
(define (runtime-goto? x) (and (integer? x) (< x 0)))
|
|
|
|
(define runtime-shift-state values)
|
|
(define (runtime-reduce-prod-num x) (vector-ref x 0))
|
|
(define (runtime-reduce-lhs x) (vector-ref x 1))
|
|
(define (runtime-reduce-rhs-length x) (vector-ref x 2))
|
|
(define (runtime-goto-state x) (- (+ x 1)))
|
|
|
|
)
|