45 lines
1.1 KiB
Racket
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)
|