racket/collects/unstable/automata/dfa.rkt
2011-06-24 13:48:40 -06:00

45 lines
1.1 KiB
Racket

#lang racket/base
(require "machine.rkt"
racket/local
racket/match
(for-syntax racket/base
syntax/parse
syntax/id-table
racket/dict
unstable/sequence))
(define-syntax (dfa stx)
(syntax-parse
stx
[(_ start:id
(end:id ...)
[state:id ([evt:expr next-state:id]
...)]
...)
(define end? (make-bound-id-table))
(for ([e (in-syntax #'(end ...))])
(dict-set! end? e #t))
(with-syntax
([(state-constructor ...)
(for/list ([st (in-syntax #'(state ...))])
(if (dict-ref end? st #f)
#'machine-accepting
#'machine))])
(syntax/loc stx
(local
[; state : input -> next-state
(define state
(state-constructor
'(dfa [evt next-state]
...)
(match-lambda
[evt next-state]
...)))
...]
start)))]))
(provide dfa)