; ------- lib ------------ (def != (a b) () (if (= a b) 0 1)) (def >= (a b) () (if (< a b) 0 1)) (def and (a b) ()(if a b 0)) (def or (a b) () (if a 1 b)) (def not a () (if a 0 1)) (def nop () () 0) (def print a () (sys 1 a)) (def printc c () (sys 2 c)) (def space () () (sys 2 32)) (def nl () () (sys 2 10)) (def exit () () (sys 13)) ; print string (def prints s () (while (vec s 0) (do (printc (vec s 0)) (set s (+ s 1))))) ; test string equal (def str= (s1 s2) (flag i c1 c2) (do (set flag 1) (set i 0) (while flag (do (set c1 (vec s1 i)) (set c2 (vec s2 i)) (if (!= c1 c2) (set flag 0) (if (= c1 0) (set flag 0) (if (= c2 0) (set flag 0)))) (set i (+ i 1)))) (and (= c1 0) (= c2 0)))) ; check is string a number, no sign (def isNumber s a (do (set a (vec s 0)) (while (and (> a 47) (< a 58)) ; isdigit a (do (set s (+ s 1)) (set a (vec s 0)))) (= a 0))) ; true if reach end ; --------------------- (let tok) (def tokenise () () (set tok (sys 3))) (def parseSym () () (do (if (str= tok "ADD") (do (prints "OP:") (prints tok)) (if (isNumber tok) (prints tok) ; else (do (prints "VAR:") (prints tok)))) (space))) (def parseX () () 0) ; forward declaration (def parseL () () (do (tokenise) (if (not (str= tok ")")) (do (parseX) (parseL))))) (def parseX () () (do (if (str= tok "(") ; it is a list (do (tokenise) (parseSym) (parseL)) ; else (parseSym)))) ; --------------------------- (def main () () (do (sys 11) ; readinfile (tokenise) (parseX)))