(t (values nil nil)))))
(lambda () (recur node nil))))
-(defun parse-tree (string)
+(defun parse-tree (string &key (start 0) (end (length string)))
"Parse STRING, and return the tree described.
The syntax is simple:
The ambiguity is resolved by always treating `(' as a tree when a tree is
expected."
- (let ((len (length string)))
- (labels ((parse (i)
- (cond ((and (< i len) (char= (char string i) #\())
- (multiple-value-bind (left i) (parse (1+ i))
- (unless (< i len) (error "no data"))
- (let ((data (char string i)))
- (multiple-value-bind (right i) (parse (1+ i))
- (unless (and (< i len)
- (char= (char string i) #\)))
- (error "missing )"))
- (values
- (make-node :left left :data data :right right)
- (1+ i))))))
- (t (values nil i)))))
- (multiple-value-bind (tree i) (parse 0)
- (unless (= i len) (error "trailing junk"))
- tree))))
+ (labels ((parse (i)
+ (cond ((and (< i end) (char= (char string i) #\())
+ (multiple-value-bind (left i) (parse (1+ i))
+ (unless (< i end) (error "no data"))
+ (let ((data (char string i)))
+ (multiple-value-bind (right i) (parse (1+ i))
+ (unless (and (< i end)
+ (char= (char string i) #\)))
+ (error "missing )"))
+ (values
+ (make-node :left left :data data :right right)
+ (1+ i))))))
+ (t (values nil i)))))
+ (multiple-value-bind (tree i) (parse start)
+ (unless (= i end) (error "trailing junk"))
+ tree)))
;;;--------------------------------------------------------------------------
;;; Main program.