133 lines
3 KiB
OCaml
133 lines
3 KiB
OCaml
|
|
open Import
|
||
|
|
|
||
|
|
(*
|
||
|
|
* Tests based on description of emacs regular expressions given at
|
||
|
|
* http://www.gnu.org/manual/elisp-manual-20-2.5/html_chapter/elisp_34.html
|
||
|
|
*)
|
||
|
|
|
||
|
|
let re re = Format.printf "%a@." Re.pp (Re.Emacs.re re)
|
||
|
|
|
||
|
|
let%expect_test "not supported" =
|
||
|
|
let re s =
|
||
|
|
try ignore (Re.Emacs.re s) with
|
||
|
|
| Re.Emacs.Parse_error -> print_endline "Parse error"
|
||
|
|
| Re.Emacs.Not_supported -> print_endline "Not supported"
|
||
|
|
in
|
||
|
|
re "*ab";
|
||
|
|
[%expect {| Parse error |}];
|
||
|
|
re "+ab";
|
||
|
|
[%expect {| Parse error |}];
|
||
|
|
re "?ab";
|
||
|
|
[%expect {| Parse error |}];
|
||
|
|
re "\\0";
|
||
|
|
[%expect {| Not supported |}]
|
||
|
|
;;
|
||
|
|
|
||
|
|
let%expect_test "escaping special characters" =
|
||
|
|
re "\\.";
|
||
|
|
[%expect {| (Set 46) |}];
|
||
|
|
re "\\*";
|
||
|
|
[%expect {| (Set 42) |}];
|
||
|
|
re "\\+";
|
||
|
|
[%expect {| (Set 43) |}];
|
||
|
|
re "\\?";
|
||
|
|
[%expect {| (Set 63) |}];
|
||
|
|
re "\\[";
|
||
|
|
[%expect {| (Set 91) |}];
|
||
|
|
re "\\]";
|
||
|
|
[%expect {| (Set 93) |}];
|
||
|
|
re "\\^";
|
||
|
|
[%expect {| (Set 94) |}];
|
||
|
|
re "\\$";
|
||
|
|
[%expect {| (Set 36) |}];
|
||
|
|
re "\\\\";
|
||
|
|
[%expect {| (Set 92) |}]
|
||
|
|
;;
|
||
|
|
|
||
|
|
let%expect_test "special characeters" =
|
||
|
|
re ".";
|
||
|
|
[%expect {| (Set 0-9, 11-255) |}];
|
||
|
|
re "a*";
|
||
|
|
[%expect {| (Repeat (Set 97) 0) |}];
|
||
|
|
re "a+";
|
||
|
|
[%expect {| (Repeat (Set 97) 1) |}];
|
||
|
|
re "a?";
|
||
|
|
[%expect {| (Repeat (Set 97) 0 1) |}];
|
||
|
|
re "[ab]";
|
||
|
|
[%expect {| (Alternative (Set 98)(Set 97)) |}];
|
||
|
|
re "[a-z]";
|
||
|
|
[%expect {| (Set 97-122) |}];
|
||
|
|
re "[a-z$%.]";
|
||
|
|
[%expect {| (Alternative (Set 46)(Set 37)(Set 36)(Set 97-122)) |}];
|
||
|
|
re "[]a]";
|
||
|
|
[%expect {| (Alternative (Set 97)(Set 93)) |}];
|
||
|
|
re "[]-]";
|
||
|
|
[%expect {| (Alternative (Set 93)(Set 45)) |}];
|
||
|
|
re "[a^]";
|
||
|
|
[%expect {| (Alternative (Set 94)(Set 97)) |}];
|
||
|
|
re "[^a-z]";
|
||
|
|
[%expect {| (Complement (Set 97-122)) |}];
|
||
|
|
re "[^a-z$]";
|
||
|
|
[%expect {| (Complement (Set 36)(Set 97-122)) |}];
|
||
|
|
re "^";
|
||
|
|
[%expect {| Beg_of_line |}];
|
||
|
|
re "$";
|
||
|
|
[%expect {| End_of_line |}]
|
||
|
|
;;
|
||
|
|
|
||
|
|
let%expect_test "alternatives" =
|
||
|
|
re "a\\|b";
|
||
|
|
[%expect {| (Alternative (Set 97)(Set 98)) |}];
|
||
|
|
re "aa\\|bb";
|
||
|
|
[%expect {| (Alternative (Sequence (Set 97)(Set 97))(Sequence (Set 98)(Set 98))) |}]
|
||
|
|
;;
|
||
|
|
|
||
|
|
let%expect_test "contexts" =
|
||
|
|
re "\\`";
|
||
|
|
[%expect {| Beg_of_str |}];
|
||
|
|
re "\\'";
|
||
|
|
[%expect {| End_of_str |}];
|
||
|
|
re "\\=";
|
||
|
|
[%expect {| Start |}];
|
||
|
|
re "\\b";
|
||
|
|
[%expect {| (Alternative Beg_of_wordEnd_of_word) |}];
|
||
|
|
re "\\B";
|
||
|
|
[%expect {| Not_bound |}];
|
||
|
|
re "\\<";
|
||
|
|
[%expect {| Beg_of_word |}];
|
||
|
|
re "\\>";
|
||
|
|
[%expect {| End_of_word |}]
|
||
|
|
;;
|
||
|
|
|
||
|
|
let%expect_test "word-constituent" =
|
||
|
|
re "\\w";
|
||
|
|
[%expect
|
||
|
|
{|
|
||
|
|
(Alternative
|
||
|
|
(Set 48-57, 65-90, 97-122, 170, 181, 186, 192-214, 216-246, 248-255)
|
||
|
|
(Set 95)) |}];
|
||
|
|
re "\\W";
|
||
|
|
[%expect
|
||
|
|
{|
|
||
|
|
(Complement
|
||
|
|
(Set 48-57, 65-90, 97-122, 170, 181, 186, 192-214, 216-246, 248-255)
|
||
|
|
(Set 95)) |}]
|
||
|
|
;;
|
||
|
|
|
||
|
|
let%expect_test "grouping" =
|
||
|
|
re "\\(a\\)";
|
||
|
|
[%expect {| (Group (Set 97)) |}];
|
||
|
|
re "\\(a\\|b\\)c";
|
||
|
|
[%expect {| (Sequence (Group (Alternative (Set 97)(Set 98)))(Set 99)) |}]
|
||
|
|
;;
|
||
|
|
|
||
|
|
let%expect_test "concatenation" =
|
||
|
|
re "ab";
|
||
|
|
[%expect {| (Sequence (Set 97)(Set 98)) |}]
|
||
|
|
;;
|
||
|
|
|
||
|
|
let%expect_test "ordinary characters" =
|
||
|
|
re "a";
|
||
|
|
[%expect {| (Set 97) |}]
|
||
|
|
;;
|