Guest User

Untitled

a guest
Jan 23rd, 2018
283
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.99 KB | None | 0 0
  1. ;; base types
  2. (defvar *regex-null* nil)
  3. (defvar *regex-empty* t)
  4.  
  5. ;; predicates
  6. (defun regex-alt? (re)
  7. (and (consp re) (eq (car re) 'alt)))
  8. (defun regex-seq? (re)
  9. (and (consp re) (eq (car re) 'seq)))
  10. (defun regex-rep? (re)
  11. (and (consp re) (eq (car re) 'rep)))
  12.  
  13. (defun regex-null? (re)
  14. (eq re *regex-null*))
  15. (defun regex-empty? (re)
  16. (eq re *regex-empty*))
  17.  
  18. (defun regex-atom? (re)
  19. (or (characterp re) (symbolp re)))
  20.  
  21. ;; deconstructors
  22. (defun match-seq (re f)
  23. (and (regex-seq? re)
  24. (funcall f (cadr re) (caddr re))))
  25. (defun match-alt (re f)
  26. (and (regex-alt? re)
  27. (funcall f (cadr re) (caddr re))))
  28. (defun match-rep (re f)
  29. (and (regex-rep? re)
  30. (funcall f (cadr re))))
  31.  
  32. ;; simplified
  33. (defun seq (pat1 pat2)
  34. (cond ((regex-null? pat1) *regex-null*)
  35. ((regex-null? pat2) *regex-null*)
  36. ((regex-empty? pat1) pat2)
  37. ((regex-empty? pat2) pat1)
  38. (t (list 'seq pat1 pat2))))
  39.  
  40. (defun alt (pat1 pat2)
  41. (cond ((regex-null? pat1) pat2)
  42. ((regex-null? pat2) pat1)
  43. (t (list 'alt pat1 pat2))))
  44.  
  45. (defun rep (pat)
  46. (cond ((regex-null? pat) *regex-empty*)
  47. ((regex-empty? pat) *regex-empty*)
  48. (t (list 'rep pat))))
  49.  
  50. ;; matching
  51. (defun regex-empty (re)
  52. (cond ((regex-empty? re) *regex-empty*)
  53. ((regex-null? re) *regex-null*)
  54. ((regex-atom? re) *regex-null*)
  55. ((match-seq re (lambda (pat1 pat2)
  56. (seq (regex-empty pat1) (regex-empty pat2)))))
  57. ((match-alt re (lambda (pat1 pat2)
  58. (alt (regex-empty pat1) (regex-empty pat2)))))
  59. ((regex-rep? re) *regex-empty*)
  60. (t *regex-null*)))
  61.  
  62. (defun regex-deriv (re c)
  63. (cond ((regex-empty? re) *regex-null*)
  64. ((regex-null? re) *regex-null*)
  65. ((eq c re) *regex-empty*)
  66. ((regex-atom? re) *regex-null*)
  67. ((match-seq re (lambda (pat1 pat2)
  68. (alt (seq (regex-deriv pat1 c) pat2)
  69. (seq (regex-empty pat1) (regex-deriv pat2 c))))))
  70. ((match-alt re (lambda (pat1 pat2)
  71. (alt (regex-deriv pat1 c)
  72. (regex-deriv pat2 c)))))
  73. ((match-rep re (lambda (pat)
  74. (seq (regex-deriv pat c) (rep pat)))))
  75. (t *regex-null*)))
  76.  
  77. (regex-deriv '(seq #\a #\b #\c)
  78. #\a)
Add Comment
Please, Sign In to add comment