open Char;; open Printf;; type syntaxTree = SId of string (* Identifikator *) | SPlus of syntaxTree * syntaxTree (* Knoten für + *) | STimes of syntaxTree * syntaxTree (* Knoten für * *) type token = TId of string | TPlus | TMinus | TTimes | TLP | TRP | TEOF let isAlpha x = (code x >= code 'a' && code x <= code 'z') || (code x >= code 'A' && code x <= code 'Z');; let explode s = let l = ref [] in for i=String.length s -1 downto 0 do l := (String.get s i) :: !l done; !l;; let implode cs = let xs = ref cs in let str = String.create (List.length cs) in for i=0 to String.length str -1 do let p::ps = !xs in String.set str i p; xs := ps done; str;; let rec scanWhile pred str = match str with | (x::xs) when pred x -> let (tok,rest) = scanWhile pred xs in (x::tok, rest) | _ -> ([],str) ;; let rec scan str = match str with | (x::xs) when isAlpha x -> let (cs,rest) = scanWhile isAlpha str in TId (implode cs) :: scan rest | ('+'::rest) -> TPlus :: scan rest | ('-'::rest) -> TMinus :: scan rest | ('*'::rest) -> TTimes :: scan rest | ('('::rest) -> TLP :: scan rest | (')'::rest) -> TRP :: scan rest | (' '::rest) -> scan rest | ('\t'::rest) -> scan rest | ('\n'::rest) -> scan rest | [] -> [TEOF] ;;