oded@oded-XPS13-9333:~/pl16/ocaml/regexp$ coretop ------------+------------------------------------------------------------+------------ | Welcome to utop version 1.15 (using OCaml version 4.01.0)! | +------------------------------------------------------------+ Findlib has been successfully loaded. Additional directives: #require "package";; to load a package #list;; to list the available packages #camlp4o;; to load camlp4 (standard syntax) #camlp4r;; to load camlp4 (revised syntax) #predicates "p,q,...";; to set these predicates Topfind.reset();; to force that packages will be reloaded #thread;; to enable threads Type #utop_help for help about using utop. -( 14:26:38 )-< command 0 >--------------------------------------------{ counter: 0 }- utop # '\\';; - : char = \ -( 14:26:43 )-< command 2 >--------------------------------------------{ counter: 0 }- utop # #use "regexp.ml";; type token = AtSign | Percent | Literal of char | PlusSign | TimesSign | Asterisk | LParen | RParen exception LexicalError val tokenize : char list -> token list = type regexp = Zero | One | Char of char | Plus of regexp * regexp | Times of regexp * regexp | Star of regexp exception SyntaxError of string val parse_exp : token list -> regexp * token list = val parse_term : token list -> regexp * token list = val parse_factor : token list -> regexp * token list = val parse_atom : token list -> regexp * token list = val parse : string -> regexp = val format_exp : regexp -> string = val match_exp' : regexp -> char list -> (char list -> bool) -> bool = val match_exp : regexp -> string -> bool = val match_exp_fixed' : regexp -> char list -> (char list -> bool) -> bool = val match_exp_fixed : regexp -> string -> bool = -( 14:28:42 )-< command 4 >--------------------------------------------{ counter: 0 }- utop # tokenize (String.to_list "(a+b)*.c");; - : token list = [LParen; Literal a; PlusSign; Literal b; RParen; Asterisk; TimesSign; Literal c] -( 15:25:14 )-< command 26 >-------------------------------------------{ counter: 0 }- utop # tokenize (String.to_list "(a+.+*b)*.c");; - : token list = [LParen; Literal a; PlusSign; TimesSign; PlusSign; Asterisk; Literal b; RParen; Asterisk; TimesSign; Literal c] -( 15:28:33 )-< command 28 >-------------------------------------------{ counter: 0 }- utop # tokenize (String.to_list "c");; - : token list = [Literal c] -( 15:28:42 )-< command 29 >-------------------------------------------{ counter: 0 }- utop # tokenize (String.to_list "@");; - : token list = [AtSign] -( 15:28:45 )-< command 30 >-------------------------------------------{ counter: 0 }- utop # tokenize (String.to_list "\\@");; - : token list = [Literal @] -( 15:28:49 )-< command 31 >-------------------------------------------{ counter: 0 }- utop # tokenize (String.to_list "\\\\");; - : token list = [Literal \] -( 14:28:55 )-< command 5 >--------------------------------------------{ counter: 0 }- utop # parse "(a+b)*.c";; - : regexp = Times (Star (Plus (Char a, Char b)), Char c) -( 14:29:13 )-< command 6 >--------------------------------------------{ counter: 0 }- utop # parse "(a+b)*.c+";; Exception: SyntaxError("Factor expected\n"). -( 14:43:57 )-< command 7 >--------------------------------------------{ counter: 0 }- utop # parse "(a+b)*.c*";; - : regexp = Times (Star (Plus (Char a, Char b)), Star (Char c)) -( 14:44:24 )-< command 9 >--------------------------------------------{ counter: 0 }- utop # parse "(a+b)*.c**";; Exception: SyntaxError("Unexpected input.\n"). -( 14:44:27 )-< command 10 >-------------------------------------------{ counter: 0 }- utop # match_exp (parse "(a+b)*.c") "ababbbac";; - : bool = true -( 14:44:32 )-< command 11 >-------------------------------------------{ counter: 0 }- utop # match_exp (parse "(a+b)*.c") "ababbbacd";; - : bool = false -( 14:59:35 )-< command 12 >-------------------------------------------{ counter: 0 }- utop # match_exp (parse "(a+b)*.c") "ababbba";; - : bool = false -( 14:59:41 )-< command 13 >-------------------------------------------{ counter: 0 }- utop # match_exp (parse "(a+b)*.c") "abacbbba";; - : bool = false -( 14:59:43 )-< command 14 >-------------------------------------------{ counter: 0 }- utop # match_exp (parse "(a+b)*.c") "abacbbbac";; - : bool = false -( 14:59:46 )-< command 15 >-------------------------------------------{ counter: 0 }- utop # match_exp (parse "(a+b)*.c") "ababbbac";; - : bool = true -( 14:59:49 )-< command 16 >-------------------------------------------{ counter: 0 }- utop # match_exp (parse "(d+a+b)*.c") "ababbbac";; - : bool = true -( 15:00:30 )-< command 17 >-------------------------------------------{ counter: 0 }- utop # match_exp (parse "(x+a+b)*.c") "ababbbac";; - : bool = true -( 15:00:37 )-< command 18 >-------------------------------------------{ counter: 0 }- utop # match_exp (parse "(%+a+b)*.c") "ababbbac";; Stack overflow during evaluation (looping recursion?). -( 15:00:41 )-< command 19 >-------------------------------------------{ counter: 0 }- utop # match_exp (parse "(a+b+%)*.c") "ababbbac";; - : bool = true -( 15:00:46 )-< command 20 >-------------------------------------------{ counter: 0 }- utop # match_exp (parse "(a+%+b)*.c") "ababbbac";; Stack overflow during evaluation (looping recursion?). -( 15:01:41 )-< command 21 >-------------------------------------------{ counter: 0 }- utop # match_exp (parse "(a*+b)*.c") "ababbbac";; Stack overflow during evaluation (looping recursion?). -( 15:01:49 )-< command 22 >-------------------------------------------{ counter: 0 }- utop # match_exp_fixed (parse "(a*+b)*.c") "ababbbac";; - : bool = true -( 15:05:50 )-< command 23 >-------------------------------------------{ counter: 0 }- utop # match_exp_fixed (parse "(a*+b)*.c") "ababbba";; - : bool = false