Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file test_character.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414openFmlib_stdmoduleCP=Character.Make(Unit)(Char)(Unit)moduleSP=Character.Make(Unit)(String)(Unit)(*
One Token
------------------------------------------------------------
*)let%test_=letopenCPinletp=Parser.run_on_string"a"(make()letter)inParser.has_succeededp&&Parser.columnp=1&&Parser.finalp='a'&&Parser.lookaheadsp=([||],true)let%test_=letopenCPinletp=Parser.run_on_string","(make()letter)inParser.has_failed_syntaxp&&Parser.columnp=0&&Parser.lookaheadsp=([|','|],false)let%test_=letopenCPinletp=Parser.run_on_string"ab"(make()letter)inParser.has_failed_syntaxp&&Parser.columnp=1&&Parser.lookaheadsp=([|'b'|],false)let%test_=letopenCPinletp=Parser.run_on_string"a"(make()(char'a'</>char'b'))inParser.has_succeededp&&Parser.finalp='a'let%test_=letopenCPinletp=Parser.run_on_string"b"(make()(char'a'</>char'b'))inParser.has_succeededp&&Parser.finalp='b'(*
Backtracking
------------------------------------------------------------
*)let%test_=letopenSPinletp=Parser.run_on_string"(a)"(make()(string"(a)"</>string"(b)"))inParser.has_succeededp&&Parser.finalp="(a)"let%test_=letopenSPinletp=Parser.run_on_string"(b)"(make()(string"(a)"</>string"(b)"))inParser.has_failed_syntaxp&&Parser.columnp=1&&Parser.failed_expectationsp=["'a'",None]let%test_=letopenSPinletp=Parser.run_on_string"(b)"(make()(backtrack(string"(a)")"(a)"</>string"(b)"))inParser.has_succeededp&&Parser.finalp="(b)"(*
Nested Backtracking
------------------------------------------------------------
*)letabcdef=SP.(backtrack(let*s1=string"abc"inlet*s2=backtrack(string"def")"def"</>string"dez"inreturn(s1^s2))"abcdef")let%test_=letopenSPinletp=Parser.run_on_string"abcdeg"(make()abcdef)inParser.has_failed_syntaxp&&Parser.columnp=0&&Parser.failed_expectationsp=["abcdef",None]let%test_=letopenSPinletp=Parser.run_on_string"abcdef"(make()abcdef)inParser.has_succeededp&&Parser.finalp="abcdef"let%test_=letopenSPinletp=Parser.run_on_string"abcdez"(make()abcdef)inParser.has_succeededp&&Parser.finalp="abcdez"(*
Followed by and not followed by
------------------------------------------------------------
*)let%test_=(* "abc" followed by "def". Success case. *)letopenSPinletp=let*str=string"abc"inlet*_=followed_by(string"def")"def"inreturnstrinletp=Parser.run_on_string"abcdef"(make_parserPosition.start()p)inParser.has_succeededp&&Parser.finalp="abc"&&Parser.columnp=3let%test_=(* "abc" followed by "def". Failure case. *)letopenSPinletp=let*str=string"abc"inlet*_=followed_by(string"def")"def"inreturnstrinletp=Parser.run_on_string"abcdez"(make_parserPosition.start()p)inParser.has_failed_syntaxp&&Parser.columnp=3&&Parser.failed_expectationsp=["def",None]let%test_=(* "abc" not followed by "def". Success case. *)letopenSPinletp=let*str=string"abc"inlet*_=not_followed_by(string"def")""inreturnstrinletp=Parser.run_on_string"abcdez"(make_parserPosition.start()p)inParser.has_succeededp&&Parser.finalp="abc"&&Parser.columnp=3let%test_=(* "abc" not followed by "def". Failure case. *)letopenSPinletp=let*str=string"abc"inlet*_=not_followed_by(string"def")"def"inreturnstrinletp=Parser.run_on_string"abcdef"(make_parserPosition.start()p)inParser.has_failed_syntaxp&&Parser.columnp=3&&Parser.failed_expectationsp=["def",None](*
Indentation Sensitivity
------------------------------------------------------------
*)moduleIndent_sensitive(Final:Std.Interfaces.ANY)=structmoduleBasic=Character.Make(Unit)(Final)(Unit)includeBasicletwhitespace:intt=char' '</>char'\n'<?>"whitespace"|>(funp->skip_zero_or_morep>>=clear_last_expectation)|>detachletskip_trailing_ws(p:'at):'at=let*a=pinlet*_=whitespaceinreturnaletchar_ws(c:char):chart=skip_trailing_ws(charc)letstring_of_expectations(p:Parser.t):string=assert(Parser.has_failed_syntaxp);"["^String.concat","(List.map(fun(msg,vio)->letopenIndentin"("^msg^", "^(matchviowith|None->"None"|Some(Indenti)->"Indent "^string_of_inti|Some(Aligni)->"Align "^string_of_inti|Some(Align_between(i,j))->"Align_between "^string_of_inti^","^string_of_intj)^")")(Parser.failed_expectationsp))^"]"endlet%test_=(* A character left aligned. *)letopenIndent_sensitive(Char)inletp=(let*_=whitespaceinchar'a'|>left_align)|>make()|>Parser.run_on_string" \na"inParser.has_succeededp&&Parser.finalp='a'&&Parser.linep=1&&Parser.columnp=1let%test_=(* A character left aligned, but not found. *)letopenIndent_sensitive(Char)inletp=(let*_=whitespaceinchar'a'|>left_align)|>make()|>Parser.run_on_string" \n\n\n\n a"inParser.has_failed_syntaxp&&Parser.linep=4&&Parser.columnp=1&&Parser.failed_expectationsp=["'a'",Some(Indent.Align0)]let%test_=(* Two characters indented and aligned *)letopenIndent_sensitive(Char)inletp=(let*_=whitespaceinlet*c0=char_ws'a'|>aligninlet*_=(let*_=char_ws'b'|>aligninchar_ws'c'|>align)|>align|>indent1inreturnc0)|>make()|>Parser.run_on_string"\n\
\ a\n\
\ b\n\
\ c"inParser.has_succeededp&&Parser.linep=3&&Parser.columnp=5let%test_=(* Two characters indented and wrongly aligned *)letopenIndent_sensitive(Char)inletp=(let*_=whitespaceinlet*c0=char_ws'a'|>aligninlet*_=(let*_=char_ws'b'|>aligninchar_ws'c'|>align)|>align|>indent1inreturnc0)|>make()|>Parser.run_on_string"\n\
\ a\n\
\ b\n\
\ c"inParser.has_failed_syntaxp&&Parser.linep=3&&Parser.columnp=5&&Parser.failed_expectationsp=["'c'",Some(Align4)]