24 lines
541 B
Plaintext
24 lines
541 B
Plaintext
(de ast (Str)
|
|
(let *L (str Str "")
|
|
(aggregate) ) )
|
|
|
|
(de aggregate ()
|
|
(let X (product)
|
|
(while (member (car *L) '("+" "-"))
|
|
(setq X (list (intern (pop '*L)) X (product))) )
|
|
X ) )
|
|
|
|
(de product ()
|
|
(let X (term)
|
|
(while (member (car *L) '("*" "/"))
|
|
(setq X (list (intern (pop '*L)) X (term))) )
|
|
X ) )
|
|
|
|
(de term ()
|
|
(let X (pop '*L)
|
|
(cond
|
|
((num? X) X)
|
|
((= "+" X) (term))
|
|
((= "-" X) (list '- (term)))
|
|
((= "(" X) (prog1 (aggregate) (pop '*L)))) ) )
|