11.5.2 Roman numbers
The second example presents a grammar that reads Arabic and Roman number.
| | (let ((par-open 0))
(regular-grammar ((arabic (in ("09")))
(roman (uncase (in "ivxlcdm"))))
((+ (in #" \t\n"))
(ignore))
((+ arabic)
(string->integer (the-string)))
((+ roman)
(roman->arabic (the-string)))
(#\(
(let ((open-key par-open))
(set! par-open (+ 1 par-open))
(context 'pair)
(let loop-pair ((walk (ignore)))
(cond
((= open-key par-open)
'())
(else
(cons walk (loop-pair (ignore))))))))
(#\)
(set! par-open (- par-open 1))
(if (< par-open 0)
(begin
(set! par-open 0)
(ignore))
#f))
((in "+-*\\")
(string->symbol (the-string)))
(else
(let ((char (the-failure)))
(if (eof-object? char)
char
(error "grammar-roman" "Illegal char" char))))))
|