| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
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))))))
This document was generated on October 23, 2011 using texi2html 5.0.
