proof/JSON_LexWhitespaceProof.bend source
proof/JSON_LexWhitespaceProof.bend on the hub · documented module
import Baseimport ../libs/JSON.bend as Jimport ./JSON_StringProof.bend as Sdef after_mode(action: J.LexAction, mode: J.LexMode) -> J.LexMode: match action: case J.LexBackslash{}: J.Escaped{} case J.LexEscapedChar{}: J.Quoted{} case J.LexStringEnd{}: J.Outside{} case J.LexStringChar{}: J.Quoted{} case J.LexQuote{}: J.Quoted{} case J.LexWhitespace{}: J.Outside{} case J.LexPunctuation{_}: J.Outside{} case J.LexRaw{}: J.Outside{} case J.LexStop{}: modedef after_reversed(action: J.LexAction, head: Char, reversed: String) -> String: match action: case J.LexBackslash{}: SCon{'\\', reversed} case J.LexEscapedChar{}: SCon{head, reversed} case J.LexStringEnd{}: SNil{} case J.LexStringChar{}: SCon{head, reversed} case J.LexQuote{}: SCon{'"', SNil{}} case J.LexWhitespace{}: SNil{} case J.LexPunctuation{_}: SNil{} case J.LexRaw{}: SCon{head, reversed} case J.LexStop{}: SCon{head, reversed}def after_acc(action: J.LexAction, head: Char, reversed: String, acc: List<&2, J.Lexeme>) -> List<&2, J.Lexeme>: match action: case J.LexBackslash{}: acc case J.LexEscapedChar{}: acc case J.LexStringEnd{}: J.Payload{String.reverse(SCon{'"', reversed})} <> acc case J.LexStringChar{}: acc case J.LexQuote{}: J.flush_lexeme(reversed, acc) case J.LexWhitespace{}: J.flush_lexeme(reversed, acc) case J.LexPunctuation{character}: J.Punctuation{character} <> J.flush_lexeme(reversed, acc) case J.LexRaw{}: acc case J.LexStop{}: accdef lexemes_step(+head: Char, +tail: String, +mode: J.LexMode, +reversed: String, +acc: List<&2, J.Lexeme>, action: J.LexAction) -> {J.lexemes(SCon{head, tail}, mode, reversed, acc, action) == J.lex_scan(tail, after_mode(action, mode), after_reversed(action, head, reversed), after_acc(action, head, reversed, acc)) : List<&2, J.Lexeme>}: match action: case J.LexStop{}: {==} case J.LexEscapedChar{}: {==} case J.LexBackslash{}: {==} case J.LexStringEnd{}: {==} case J.LexStringChar{}: {==} case J.LexQuote{}: {==} case J.LexWhitespace{}: {==} case J.LexPunctuation{character}: {==} case J.LexRaw{}: {==}def lex_scan_step(+head: Char, +tail: String, +mode: J.LexMode, +reversed: String, +acc: List<&2, J.Lexeme>) -> {J.lex_scan(SCon{head, tail}, mode, reversed, acc) == J.lex_scan(tail, after_mode(J.lex_seed_action(SCon{head, tail}, mode), mode), after_reversed(J.lex_seed_action(SCon{head, tail}, mode), head, reversed), after_acc(J.lex_seed_action(SCon{head, tail}, mode), head, reversed, acc)) : List<&2, J.Lexeme>}: Equal.trans(List<&2, J.Lexeme>, J.lex_scan(SCon{head, tail}, mode, reversed, acc), J.lexemes(SCon{head, tail}, mode, reversed, acc, J.lex_seed_action(SCon{head, tail}, mode)), J.lex_scan(tail, after_mode(J.lex_seed_action(SCon{head, tail}, mode), mode), after_reversed(J.lex_seed_action(SCon{head, tail}, mode), head, reversed), after_acc(J.lex_seed_action(SCon{head, tail}, mode), head, reversed, acc)), {==}, lexemes_step(head, tail, mode, reversed, acc, J.lex_seed_action(SCon{head, tail}, mode)))def prefix_mode(text: String, +mode: J.LexMode) -> J.LexMode: match text: case SNil{}: mode case SCon{+head, +tail}: prefix_mode(tail, after_mode(J.lex_seed_action(SCon{head, tail}, mode), mode))def prefix_reversed(text: String, +mode: J.LexMode, +reversed: String) -> String: match text: case SNil{}: reversed case SCon{+head, +tail}: prefix_reversed(tail, after_mode(J.lex_seed_action(SCon{head, tail}, mode), mode), after_reversed(J.lex_seed_action(SCon{head, tail}, mode), head, reversed))def prefix_acc(text: String, +mode: J.LexMode, +reversed: String, +acc: List<&2, J.Lexeme>) -> List<&2, J.Lexeme>: match text: case SNil{}: acc case SCon{+head, +tail}: prefix_acc(tail, after_mode(J.lex_seed_action(SCon{head, tail}, mode), mode), after_reversed(J.lex_seed_action(SCon{head, tail}, mode), head, reversed), after_acc(J.lex_seed_action(SCon{head, tail}, mode), head, reversed, acc))def prefix_mode_append(+text: String, +suffix: String, +mode: J.LexMode) -> {prefix_mode(text ++ suffix, mode) == prefix_mode(suffix, prefix_mode(text, mode)) : J.LexMode}: match text: case SNil{}: {==} case SCon{head, tail}: prefix_mode_append(tail, suffix, after_mode(J.lex_seed_action(SCon{head, tail}, mode), mode))def prefix_reversed_append(+text: String, +suffix: String, +mode: J.LexMode, +reversed: String) -> {prefix_reversed(text ++ suffix, mode, reversed) == prefix_reversed(suffix, prefix_mode(text, mode), prefix_reversed(text, mode, reversed)) : String}: match text: case SNil{}: {==} case SCon{head, tail}: prefix_reversed_append(tail, suffix, after_mode(J.lex_seed_action(SCon{head, tail}, mode), mode), after_reversed(J.lex_seed_action(SCon{head, tail}, mode), head, reversed))def prefix_acc_append(+text: String, +suffix: String, +mode: J.LexMode, +reversed: String, +acc: List<&2, J.Lexeme>) -> {prefix_acc(text ++ suffix, mode, reversed, acc) == prefix_acc(suffix, prefix_mode(text, mode), prefix_reversed(text, mode, reversed), prefix_acc(text, mode, reversed, acc)) : List<&2, J.Lexeme>}: match text: case SNil{}: {==} case SCon{head, tail}: prefix_acc_append(tail, suffix, after_mode(J.lex_seed_action(SCon{head, tail}, mode), mode), after_reversed(J.lex_seed_action(SCon{head, tail}, mode), head, reversed), after_acc(J.lex_seed_action(SCon{head, tail}, mode), head, reversed, acc))def lex_scan_append(+text: String, +suffix: String, +mode: J.LexMode, +reversed: String, +acc: List<&2, J.Lexeme>) -> {J.lex_scan(text ++ suffix, mode, reversed, acc) == J.lex_scan(suffix, prefix_mode(text, mode), prefix_reversed(text, mode, reversed), prefix_acc(text, mode, reversed, acc)) : List<&2, J.Lexeme>}: match text: case SNil{}: {==} case SCon{head, tail}: Equal.trans(List<&2, J.Lexeme>, J.lex_scan(SCon{head, tail} ++ suffix, mode, reversed, acc), J.lex_scan(tail ++ suffix, after_mode(J.lex_seed_action(SCon{head, tail}, mode), mode), after_reversed(J.lex_seed_action(SCon{head, tail}, mode), head, reversed), after_acc(J.lex_seed_action(SCon{head, tail}, mode), head, reversed, acc)), J.lex_scan(suffix, prefix_mode(SCon{head, tail}, mode), prefix_reversed(SCon{head, tail}, mode, reversed), prefix_acc(SCon{head, tail}, mode, reversed, acc)), lex_scan_step(head, tail ++ suffix, mode, reversed, acc), lex_scan_append(tail, suffix, after_mode(J.lex_seed_action(SCon{head, tail}, mode), mode), after_reversed(J.lex_seed_action(SCon{head, tail}, mode), head, reversed), after_acc(J.lex_seed_action(SCon{head, tail}, mode), head, reversed, acc)))def lex_scan_context(+text: String, +mode1: J.LexMode, +reversed1: String, +acc1: List<&2, J.Lexeme>, +mode2: J.LexMode, +reversed2: String, +acc2: List<&2, J.Lexeme>, mode_eq: {mode1 == mode2 : J.LexMode}, reversed_eq: {reversed1 == reversed2 : String}, acc_eq: {acc1 == acc2 : List<&2, J.Lexeme>}) -> {J.lex_scan(text, mode1, reversed1, acc1) == J.lex_scan(text, mode2, reversed2, acc2) : List<&2, J.Lexeme>}: Equal.trans(List<&2, J.Lexeme>, J.lex_scan(text, mode1, reversed1, acc1), J.lex_scan(text, mode2, reversed1, acc1), J.lex_scan(text, mode2, reversed2, acc2), Equal.cong(J.LexMode, List<&2, J.Lexeme>, mode => J.lex_scan(text, mode, reversed1, acc1), mode1, mode2, mode_eq), Equal.trans(List<&2, J.Lexeme>, J.lex_scan(text, mode2, reversed1, acc1), J.lex_scan(text, mode2, reversed2, acc1), J.lex_scan(text, mode2, reversed2, acc2), Equal.cong(String, List<&2, J.Lexeme>, reversed => J.lex_scan(text, mode2, reversed, acc1), reversed1, reversed2, reversed_eq), Equal.cong(List<&2, J.Lexeme>, List<&2, J.Lexeme>, acc => J.lex_scan(text, mode2, reversed2, acc), acc1, acc2, acc_eq)))def scan_punctuation_char(+character: Char, +tail: String, +reversed: String, +acc: List<&2, J.Lexeme>, action: {J.lex_seed_action(SCon{character, tail}, J.Outside{}) == J.LexPunctuation{character} : J.LexAction}) -> {J.lex_scan(SCon{character, tail}, J.Outside{}, reversed, acc) == J.lex_scan(tail, J.Outside{}, SNil{}, J.Punctuation{character} <> J.flush_lexeme(reversed, acc)) : List<&2, J.Lexeme>}: Equal.trans(List<&2, J.Lexeme>, J.lex_scan(SCon{character, tail}, J.Outside{}, reversed, acc), J.lex_scan(tail, after_mode(J.LexPunctuation{character}, J.Outside{}), after_reversed(J.LexPunctuation{character}, character, reversed), after_acc(J.LexPunctuation{character}, character, reversed, acc)), J.lex_scan(tail, J.Outside{}, SNil{}, J.Punctuation{character} <> J.flush_lexeme(reversed, acc)), Equal.trans(List<&2, J.Lexeme>, J.lex_scan(SCon{character, tail}, J.Outside{}, reversed, acc), J.lex_scan(tail, after_mode(J.lex_seed_action(SCon{character, tail}, J.Outside{}), J.Outside{}), after_reversed(J.lex_seed_action(SCon{character, tail}, J.Outside{}), character, reversed), after_acc(J.lex_seed_action(SCon{character, tail}, J.Outside{}), character, reversed, acc)), J.lex_scan(tail, after_mode(J.LexPunctuation{character}, J.Outside{}), after_reversed(J.LexPunctuation{character}, character, reversed), after_acc(J.LexPunctuation{character}, character, reversed, acc)), lex_scan_step(character, tail, J.Outside{}, reversed, acc), Equal.cong(J.LexAction, List<&2, J.Lexeme>, action => J.lex_scan(tail, after_mode(action, J.Outside{}), after_reversed(action, character, reversed), after_acc(action, character, reversed, acc)), J.lex_seed_action(SCon{character, tail}, J.Outside{}), J.LexPunctuation{character}, action)), {==})def raw_string_seed(+character: Char, +tail: String, classifier: {J.Raw{} == J.escape_class(character) : J.EscapeClass}) -> {J.lex_seed_action(SCon{character, tail}, J.Quoted{}) == J.LexStringChar{} : J.LexAction}: Equal.trans(J.LexAction, J.lex_seed_action(SCon{character, tail}, J.Quoted{}), J.quote_lex_action(J.quote_action_from_class(J.escape_class(character))), J.LexStringChar{}, {==}, Equal.cong(J.EscapeClass, J.LexAction, class => J.quote_lex_action(J.quote_action_from_class(class)), J.escape_class(character), J.Raw{}, Equal.sym(J.EscapeClass, J.Raw{}, J.escape_class(character), classifier)))def scan_raw_string_char(+character: Char, +tail: String, +reversed: String, +acc: List<&2, J.Lexeme>, classifier: {J.Raw{} == J.escape_class(character) : J.EscapeClass}) -> {J.lex_scan(SCon{character, tail}, J.Quoted{}, reversed, acc) == J.lex_scan(tail, J.Quoted{}, SCon{character, reversed}, acc) : List<&2, J.Lexeme>}: Equal.trans(List<&2, J.Lexeme>, J.lex_scan(SCon{character, tail}, J.Quoted{}, reversed, acc), J.lex_scan(tail, after_mode(J.LexStringChar{}, J.Quoted{}), after_reversed(J.LexStringChar{}, character, reversed), after_acc(J.LexStringChar{}, character, reversed, acc)), J.lex_scan(tail, J.Quoted{}, SCon{character, reversed}, acc), Equal.trans(List<&2, J.Lexeme>, J.lex_scan(SCon{character, tail}, J.Quoted{}, reversed, acc), J.lex_scan(tail, after_mode(J.lex_seed_action(SCon{character, tail}, J.Quoted{}), J.Quoted{}), after_reversed(J.lex_seed_action(SCon{character, tail}, J.Quoted{}), character, reversed), after_acc(J.lex_seed_action(SCon{character, tail}, J.Quoted{}), character, reversed, acc)), J.lex_scan(tail, after_mode(J.LexStringChar{}, J.Quoted{}), after_reversed(J.LexStringChar{}, character, reversed), after_acc(J.LexStringChar{}, character, reversed, acc)), lex_scan_step(character, tail, J.Quoted{}, reversed, acc), Equal.cong(J.LexAction, List<&2, J.Lexeme>, action => J.lex_scan(tail, after_mode(action, J.Quoted{}), after_reversed(action, character, reversed), after_acc(action, character, reversed, acc)), J.lex_seed_action(SCon{character, tail}, J.Quoted{}), J.LexStringChar{}, raw_string_seed(character, tail, classifier))), {==})def scan_escape_char(+character: Char, +tail: String, +reversed: String, +acc: List<&2, J.Lexeme>, +class: J.EscapeClass, classifier: {class == J.escape_class(character) : J.EscapeClass}) -> {J.lex_scan(J.escape_char_from_class(character, class) ++ tail, J.Quoted{}, reversed, acc) == J.lex_scan(tail, J.Quoted{}, String.reverse(J.escape_char_from_class(character, class)) ++ reversed, acc) : List<&2, J.Lexeme>}: match class: case J.Raw{}: Equal.trans(List<&2, J.Lexeme>, J.lex_scan(J.escape_char_from_class(character, J.Raw{}) ++ tail, J.Quoted{}, reversed, acc), J.lex_scan(SCon{character, tail}, J.Quoted{}, reversed, acc), J.lex_scan(tail, J.Quoted{}, SCon{character, reversed}, acc), Equal.cong(String, List<&2, J.Lexeme>, text => J.lex_scan(text, J.Quoted{}, reversed, acc), J.escape_char_from_class(character, J.Raw{}) ++ tail, SCon{character, tail}, {==}), scan_raw_string_char(character, tail, reversed, acc, classifier)) case J.Backslash{}: {==} case J.Quote{}: {==} case J.Control0{}: {==} case J.Control1{}: {==} case J.Control2{}: {==} case J.Control3{}: {==} case J.Control4{}: {==} case J.Control5{}: {==} case J.Control6{}: {==} case J.Control7{}: {==} case J.Control8{}: {==} case J.Control9{}: {==} case J.Control10{}: {==} case J.Control11{}: {==} case J.Control12{}: {==} case J.Control13{}: {==} case J.Control14{}: {==} case J.Control15{}: {==} case J.Control16{}: {==} case J.Control17{}: {==} case J.Control18{}: {==} case J.Control19{}: {==} case J.Control20{}: {==} case J.Control21{}: {==} case J.Control22{}: {==} case J.Control23{}: {==} case J.Control24{}: {==} case J.Control25{}: {==} case J.Control26{}: {==} case J.Control27{}: {==} case J.Control28{}: {==} case J.Control29{}: {==} case J.Control30{}: {==} case J.Control31{}: {==}def escape_reverse(text: String, reversed: String) -> String: match text: case SNil{}: reversed case SCon{head, tail}: escape_reverse(tail, String.reverse(J.escape_char(head)) ++ reversed)def escape_reverse_shape(+text: String, +reversed: String) -> {String.reverse(escape_reverse(text, reversed)) == String.reverse(reversed) ++ J.escape_string(text) : String}: match text: case SNil{}: Equal.sym(String, String.reverse(reversed) ++ J.escape_string(SNil{}), String.reverse(reversed), S.append_nil(String.reverse(reversed))) case SCon{head, tail}: Equal.trans(String, String.reverse(escape_reverse(tail, String.reverse(J.escape_char(head)) ++ reversed)), String.reverse(String.reverse(J.escape_char(head)) ++ reversed) ++ J.escape_string(tail), String.reverse(reversed) ++ J.escape_string(SCon{head, tail}), escape_reverse_shape(tail, String.reverse(J.escape_char(head)) ++ reversed), Equal.trans(String, String.reverse(String.reverse(J.escape_char(head)) ++ reversed) ++ J.escape_string(tail), (String.reverse(reversed) ++ String.reverse(String.reverse(J.escape_char(head)))) ++ J.escape_string(tail), String.reverse(reversed) ++ (J.escape_char(head) ++ J.escape_string(tail)), Equal.cong(String, String, value => value ++ J.escape_string(tail), String.reverse(String.reverse(J.escape_char(head)) ++ reversed), String.reverse(reversed) ++ String.reverse(String.reverse(J.escape_char(head))), S.reverse_append(String.reverse(J.escape_char(head)), reversed)), Equal.trans(String, (String.reverse(reversed) ++ String.reverse(String.reverse(J.escape_char(head)))) ++ J.escape_string(tail), String.reverse(reversed) ++ (String.reverse(String.reverse(J.escape_char(head))) ++ J.escape_string(tail)), String.reverse(reversed) ++ (J.escape_char(head) ++ J.escape_string(tail)), S.append_assoc(String.reverse(reversed), String.reverse(String.reverse(J.escape_char(head))), J.escape_string(tail)), Equal.cong(String, String, value => String.reverse(reversed) ++ (value ++ J.escape_string(tail)), String.reverse(String.reverse(J.escape_char(head))), J.escape_char(head), S.reverse_twice(J.escape_char(head))))))def scan_escape_string(+text: String, +suffix: String, +reversed: String, +acc: List<&2, J.Lexeme>) -> {J.lex_scan(J.escape_string(text) ++ suffix, J.Quoted{}, reversed, acc) == J.lex_scan(suffix, J.Quoted{}, escape_reverse(text, reversed), acc) : List<&2, J.Lexeme>}: match text: case SNil{}: {==} case SCon{+head, +tail}: Equal.trans(List<&2, J.Lexeme>, J.lex_scan(J.escape_string(text) ++ suffix, J.Quoted{}, reversed, acc), J.lex_scan(J.escape_char(head) ++ (J.escape_string(tail) ++ suffix), J.Quoted{}, reversed, acc), J.lex_scan(suffix, J.Quoted{}, escape_reverse(text, reversed), acc), Equal.cong(String, List<&2, J.Lexeme>, source => J.lex_scan(source, J.Quoted{}, reversed, acc), J.escape_string(text) ++ suffix, J.escape_char(head) ++ (J.escape_string(tail) ++ suffix), S.append_assoc(J.escape_char(head), J.escape_string(tail), suffix)), Equal.trans(List<&2, J.Lexeme>, J.lex_scan(J.escape_char(head) ++ (J.escape_string(tail) ++ suffix), J.Quoted{}, reversed, acc), J.lex_scan(J.escape_string(tail) ++ suffix, J.Quoted{}, String.reverse(J.escape_char(head)) ++ reversed, acc), J.lex_scan(suffix, J.Quoted{}, escape_reverse(text, reversed), acc), scan_escape_char(head, J.escape_string(tail) ++ suffix, reversed, acc, J.escape_class(head), {==}), scan_escape_string(tail, suffix, String.reverse(J.escape_char(head)) ++ reversed, acc)))def quoted_buffer_payload(+text: String) -> {String.reverse(SCon{'"', escape_reverse(text, SCon{'"', SNil{}})}) == SCon{'"', J.escape_string(text) ++ SCon{'"', SNil{}}} : String}: Equal.trans(String, String.reverse(SCon{'"', escape_reverse(text, SCon{'"', SNil{}})}), String.reverse(escape_reverse(text, SCon{'"', SNil{}})) ++ SCon{'"', SNil{}}, SCon{'"', J.escape_string(text) ++ SCon{'"', SNil{}}}, S.reverse_cons('"', escape_reverse(text, SCon{'"', SNil{}})), Equal.trans(String, String.reverse(escape_reverse(text, SCon{'"', SNil{}})) ++ SCon{'"', SNil{}}, (SCon{'"', SNil{}} ++ J.escape_string(text)) ++ SCon{'"', SNil{}}, SCon{'"', J.escape_string(text) ++ SCon{'"', SNil{}}}, Equal.cong(String, String, value => value ++ SCon{'"', SNil{}}, String.reverse(escape_reverse(text, SCon{'"', SNil{}})), SCon{'"', SNil{}} ++ J.escape_string(text), escape_reverse_shape(text, SCon{'"', SNil{}})), S.append_assoc(SCon{'"', SNil{}}, J.escape_string(text), SCon{'"', SNil{}})))def lex_rendered_string(+text: String) -> {J.lex_scan(SCon{'"', J.escape_string(text) ++ SCon{'"', SNil{}}}, J.Outside{}, SNil{}, Nil{}) == J.Payload{SCon{'"', J.escape_string(text) ++ SCon{'"', SNil{}}}} <> Nil{} : List<&2, J.Lexeme>}: Equal.trans(List<&2, J.Lexeme>, J.lex_scan(SCon{'"', J.escape_string(text) ++ SCon{'"', SNil{}}}, J.Outside{}, SNil{}, Nil{}), J.lex_scan(J.escape_string(text) ++ SCon{'"', SNil{}}, J.Quoted{}, SCon{'"', SNil{}}, Nil{}), J.Payload{SCon{'"', J.escape_string(text) ++ SCon{'"', SNil{}}}} <> Nil{}, lex_scan_step('"', J.escape_string(text) ++ SCon{'"', SNil{}}, J.Outside{}, SNil{}, Nil{}), Equal.trans(List<&2, J.Lexeme>, J.lex_scan(J.escape_string(text) ++ SCon{'"', SNil{}}, J.Quoted{}, SCon{'"', SNil{}}, Nil{}), J.lex_scan(SCon{'"', SNil{}}, J.Quoted{}, escape_reverse(text, SCon{'"', SNil{}}), Nil{}), J.Payload{SCon{'"', J.escape_string(text) ++ SCon{'"', SNil{}}}} <> Nil{}, scan_escape_string(text, SCon{'"', SNil{}}, SCon{'"', SNil{}}, Nil{}), Equal.trans(List<&2, J.Lexeme>, J.lex_scan(SCon{'"', SNil{}}, J.Quoted{}, escape_reverse(text, SCon{'"', SNil{}}), Nil{}), J.Payload{String.reverse(SCon{'"', escape_reverse(text, SCon{'"', SNil{}})})} <> Nil{}, J.Payload{SCon{'"', J.escape_string(text) ++ SCon{'"', SNil{}}}} <> Nil{}, lex_scan_step('"', SNil{}, J.Quoted{}, escape_reverse(text, SCon{'"', SNil{}}), Nil{}), Equal.cong(String, List<&2, J.Lexeme>, payload => J.Payload{payload} <> Nil{}, String.reverse(SCon{'"', escape_reverse(text, SCon{'"', SNil{}})}), SCon{'"', J.escape_string(text) ++ SCon{'"', SNil{}}}, quoted_buffer_payload(text)))))def lex_rendered_string_suffix(+text: String, +suffix: String, +acc: List<&2, J.Lexeme>) -> {J.lex_scan((SCon{'"', J.escape_string(text) ++ SCon{'"', SNil{}}}) ++ suffix, J.Outside{}, SNil{}, acc) == J.lex_scan(suffix, J.Outside{}, SNil{}, J.Payload{SCon{'"', J.escape_string(text) ++ SCon{'"', SNil{}}}} <> acc) : List<&2, J.Lexeme>}: Equal.trans(List<&2, J.Lexeme>, J.lex_scan((SCon{'"', J.escape_string(text) ++ SCon{'"', SNil{}}}) ++ suffix, J.Outside{}, SNil{}, acc), J.lex_scan(SCon{'"', (J.escape_string(text) ++ SCon{'"', SNil{}}) ++ suffix}, J.Outside{}, SNil{}, acc), J.lex_scan(suffix, J.Outside{}, SNil{}, J.Payload{SCon{'"', J.escape_string(text) ++ SCon{'"', SNil{}}}} <> acc), Equal.cong(String, List<&2, J.Lexeme>, source => J.lex_scan(source, J.Outside{}, SNil{}, acc), (SCon{'"', J.escape_string(text) ++ SCon{'"', SNil{}}}) ++ suffix, SCon{'"', (J.escape_string(text) ++ SCon{'"', SNil{}}) ++ suffix}, {==}), Equal.trans(List<&2, J.Lexeme>, J.lex_scan(SCon{'"', (J.escape_string(text) ++ SCon{'"', SNil{}}) ++ suffix}, J.Outside{}, SNil{}, acc), J.lex_scan((J.escape_string(text) ++ SCon{'"', SNil{}}) ++ suffix, J.Quoted{}, SCon{'"', SNil{}}, acc), J.lex_scan(suffix, J.Outside{}, SNil{}, J.Payload{SCon{'"', J.escape_string(text) ++ SCon{'"', SNil{}}}} <> acc), lex_scan_step('"', (J.escape_string(text) ++ SCon{'"', SNil{}}) ++ suffix, J.Outside{}, SNil{}, acc), Equal.trans(List<&2, J.Lexeme>, J.lex_scan((J.escape_string(text) ++ SCon{'"', SNil{}}) ++ suffix, J.Quoted{}, SCon{'"', SNil{}}, acc), J.lex_scan(J.escape_string(text) ++ (SCon{'"', SNil{}} ++ suffix), J.Quoted{}, SCon{'"', SNil{}}, acc), J.lex_scan(suffix, J.Outside{}, SNil{}, J.Payload{SCon{'"', J.escape_string(text) ++ SCon{'"', SNil{}}}} <> acc), Equal.cong(String, List<&2, J.Lexeme>, source => J.lex_scan(source, J.Quoted{}, SCon{'"', SNil{}}, acc), (J.escape_string(text) ++ SCon{'"', SNil{}}) ++ suffix, J.escape_string(text) ++ (SCon{'"', SNil{}} ++ suffix), S.append_assoc(J.escape_string(text), SCon{'"', SNil{}}, suffix)), Equal.trans(List<&2, J.Lexeme>, J.lex_scan(J.escape_string(text) ++ (SCon{'"', SNil{}} ++ suffix), J.Quoted{}, SCon{'"', SNil{}}, acc), J.lex_scan(SCon{'"', SNil{}} ++ suffix, J.Quoted{}, escape_reverse(text, SCon{'"', SNil{}}), acc), J.lex_scan(suffix, J.Outside{}, SNil{}, J.Payload{SCon{'"', J.escape_string(text) ++ SCon{'"', SNil{}}}} <> acc), scan_escape_string(text, SCon{'"', SNil{}} ++ suffix, SCon{'"', SNil{}}, acc), Equal.trans(List<&2, J.Lexeme>, J.lex_scan(SCon{'"', SNil{}} ++ suffix, J.Quoted{}, escape_reverse(text, SCon{'"', SNil{}}), acc), J.lex_scan(suffix, J.Outside{}, SNil{}, J.Payload{String.reverse(SCon{'"', escape_reverse(text, SCon{'"', SNil{}})})} <> acc), J.lex_scan(suffix, J.Outside{}, SNil{}, J.Payload{SCon{'"', J.escape_string(text) ++ SCon{'"', SNil{}}}} <> acc), lex_scan_step('"', suffix, J.Quoted{}, escape_reverse(text, SCon{'"', SNil{}}), acc), Equal.cong(String, List<&2, J.Lexeme>, payload => J.lex_scan(suffix, J.Outside{}, SNil{}, J.Payload{payload} <> acc), String.reverse(SCon{'"', escape_reverse(text, SCon{'"', SNil{}})}), SCon{'"', J.escape_string(text) ++ SCon{'"', SNil{}}}, quoted_buffer_payload(text)))))))def lex_string_before_punctuation(+text: String, +punctuation: Char, +suffix: String, +acc: List<&2, J.Lexeme>, action: {J.lex_seed_action(SCon{punctuation, suffix}, J.Outside{}) == J.LexPunctuation{punctuation} : J.LexAction}) -> {J.lex_scan((SCon{'"', J.escape_string(text) ++ SCon{'"', SNil{}}}) ++ (SCon{punctuation, SNil{}} ++ suffix), J.Outside{}, SNil{}, acc) == J.lex_scan(suffix, J.Outside{}, SNil{}, (J.Punctuation{punctuation} <> J.Payload{SCon{'"', J.escape_string(text) ++ SCon{'"', SNil{}}}} <> acc)) : List<&2, J.Lexeme>}: Equal.trans(List<&2, J.Lexeme>, J.lex_scan((SCon{'"', J.escape_string(text) ++ SCon{'"', SNil{}}}) ++ (SCon{punctuation, SNil{}} ++ suffix), J.Outside{}, SNil{}, acc), J.lex_scan(SCon{punctuation, SNil{}} ++ suffix, J.Outside{}, SNil{}, J.Payload{SCon{'"', J.escape_string(text) ++ SCon{'"', SNil{}}}} <> acc), J.lex_scan(suffix, J.Outside{}, SNil{}, J.Punctuation{punctuation} <> J.Payload{SCon{'"', J.escape_string(text) ++ SCon{'"', SNil{}}}} <> acc), lex_rendered_string_suffix(text, SCon{punctuation, SNil{}} ++ suffix, acc), scan_punctuation_char(punctuation, suffix, SNil{}, J.Payload{SCon{'"', J.escape_string(text) ++ SCon{'"', SNil{}}}} <> acc, action))def lex_null_before_punctuation(+punctuation: Char, +suffix: String, +acc: List<&2, J.Lexeme>, action: {J.lex_seed_action(SCon{punctuation, suffix}, J.Outside{}) == J.LexPunctuation{punctuation} : J.LexAction}) -> {J.lex_scan("null" ++ (SCon{punctuation, SNil{}} ++ suffix), J.Outside{}, SNil{}, acc) == J.lex_scan(suffix, J.Outside{}, SNil{}, J.Punctuation{punctuation} <> J.Payload{"null"} <> acc) : List<&2, J.Lexeme>}: Equal.trans(List<&2, J.Lexeme>, J.lex_scan("null" ++ (SCon{punctuation, SNil{}} ++ suffix), J.Outside{}, SNil{}, acc), J.lex_scan(SCon{punctuation, SNil{}} ++ suffix, J.Outside{}, "llun", acc), J.lex_scan(suffix, J.Outside{}, SNil{}, J.Punctuation{punctuation} <> J.Payload{"null"} <> acc), {==}, scan_punctuation_char(punctuation, suffix, "llun", acc, action))def lex_true_before_punctuation(+punctuation: Char, +suffix: String, +acc: List<&2, J.Lexeme>, action: {J.lex_seed_action(SCon{punctuation, suffix}, J.Outside{}) == J.LexPunctuation{punctuation} : J.LexAction}) -> {J.lex_scan("true" ++ (SCon{punctuation, SNil{}} ++ suffix), J.Outside{}, SNil{}, acc) == J.lex_scan(suffix, J.Outside{}, SNil{}, J.Punctuation{punctuation} <> J.Payload{"true"} <> acc) : List<&2, J.Lexeme>}: Equal.trans(List<&2, J.Lexeme>, J.lex_scan("true" ++ (SCon{punctuation, SNil{}} ++ suffix), J.Outside{}, SNil{}, acc), J.lex_scan(SCon{punctuation, SNil{}} ++ suffix, J.Outside{}, "eurt", acc), J.lex_scan(suffix, J.Outside{}, SNil{}, J.Punctuation{punctuation} <> J.Payload{"true"} <> acc), {==}, scan_punctuation_char(punctuation, suffix, "eurt", acc, action))def lex_false_before_punctuation(+punctuation: Char, +suffix: String, +acc: List<&2, J.Lexeme>, action: {J.lex_seed_action(SCon{punctuation, suffix}, J.Outside{}) == J.LexPunctuation{punctuation} : J.LexAction}) -> {J.lex_scan("false" ++ (SCon{punctuation, SNil{}} ++ suffix), J.Outside{}, SNil{}, acc) == J.lex_scan(suffix, J.Outside{}, SNil{}, J.Punctuation{punctuation} <> J.Payload{"false"} <> acc) : List<&2, J.Lexeme>}: Equal.trans(List<&2, J.Lexeme>, J.lex_scan("false" ++ (SCon{punctuation, SNil{}} ++ suffix), J.Outside{}, SNil{}, acc), J.lex_scan(SCon{punctuation, SNil{}} ++ suffix, J.Outside{}, "eslaf", acc), J.lex_scan(suffix, J.Outside{}, SNil{}, J.Punctuation{punctuation} <> J.Payload{"false"} <> acc), {==}, scan_punctuation_char(punctuation, suffix, "eslaf", acc, action))def lex_empty_array_before_punctuation(+punctuation: Char, +suffix: String, +acc: List<&2, J.Lexeme>, action: {J.lex_seed_action(SCon{punctuation, suffix}, J.Outside{}) == J.LexPunctuation{punctuation} : J.LexAction}) -> {J.lex_scan("[]" ++ (SCon{punctuation, SNil{}} ++ suffix), J.Outside{}, SNil{}, acc) == J.lex_scan(suffix, J.Outside{}, SNil{}, J.Punctuation{punctuation} <> J.Punctuation{']'} <> J.Punctuation{'['} <> acc) : List<&2, J.Lexeme>}: Equal.trans(List<&2, J.Lexeme>, J.lex_scan("[]" ++ (SCon{punctuation, SNil{}} ++ suffix), J.Outside{}, SNil{}, acc), J.lex_scan(SCon{']', SCon{punctuation, SNil{}} ++ suffix}, J.Outside{}, SNil{}, J.Punctuation{'['} <> acc), J.lex_scan(suffix, J.Outside{}, SNil{}, J.Punctuation{punctuation} <> J.Punctuation{']'} <> J.Punctuation{'['} <> acc), scan_punctuation_char('[', SCon{']', SCon{punctuation, SNil{}} ++ suffix}, SNil{}, acc, {==}), Equal.trans(List<&2, J.Lexeme>, J.lex_scan(SCon{']', SCon{punctuation, SNil{}} ++ suffix}, J.Outside{}, SNil{}, J.Punctuation{'['} <> acc), J.lex_scan(SCon{punctuation, SNil{}} ++ suffix, J.Outside{}, SNil{}, J.Punctuation{']'} <> J.Punctuation{'['} <> acc), J.lex_scan(suffix, J.Outside{}, SNil{}, J.Punctuation{punctuation} <> J.Punctuation{']'} <> J.Punctuation{'['} <> acc), scan_punctuation_char(']', SCon{punctuation, SNil{}} ++ suffix, SNil{}, J.Punctuation{'['} <> acc, {==}), scan_punctuation_char(punctuation, suffix, SNil{}, J.Punctuation{']'} <> J.Punctuation{'['} <> acc, action)))def lex_empty_object_before_punctuation(+punctuation: Char, +suffix: String, +acc: List<&2, J.Lexeme>, action: {J.lex_seed_action(SCon{punctuation, suffix}, J.Outside{}) == J.LexPunctuation{punctuation} : J.LexAction}) -> {J.lex_scan("{}" ++ (SCon{punctuation, SNil{}} ++ suffix), J.Outside{}, SNil{}, acc) == J.lex_scan(suffix, J.Outside{}, SNil{}, J.Punctuation{punctuation} <> J.Punctuation{'}'} <> J.Punctuation{'{'} <> acc) : List<&2, J.Lexeme>}: Equal.trans(List<&2, J.Lexeme>, J.lex_scan("{}" ++ (SCon{punctuation, SNil{}} ++ suffix), J.Outside{}, SNil{}, acc), J.lex_scan(SCon{'}', SCon{punctuation, SNil{}} ++ suffix}, J.Outside{}, SNil{}, J.Punctuation{'{'} <> acc), J.lex_scan(suffix, J.Outside{}, SNil{}, J.Punctuation{punctuation} <> J.Punctuation{'}'} <> J.Punctuation{'{'} <> acc), scan_punctuation_char('{', SCon{'}', SCon{punctuation, SNil{}} ++ suffix}, SNil{}, acc, {==}), Equal.trans(List<&2, J.Lexeme>, J.lex_scan(SCon{'}', SCon{punctuation, SNil{}} ++ suffix}, J.Outside{}, SNil{}, J.Punctuation{'{'} <> acc), J.lex_scan(SCon{punctuation, SNil{}} ++ suffix, J.Outside{}, SNil{}, J.Punctuation{'}'} <> J.Punctuation{'{'} <> acc), J.lex_scan(suffix, J.Outside{}, SNil{}, J.Punctuation{punctuation} <> J.Punctuation{'}'} <> J.Punctuation{'{'} <> acc), scan_punctuation_char('}', SCon{punctuation, SNil{}} ++ suffix, SNil{}, J.Punctuation{'{'} <> acc, {==}), scan_punctuation_char(punctuation, suffix, SNil{}, J.Punctuation{'}'} <> J.Punctuation{'{'} <> acc, action)))def trailing_space(+text: String, +mode: J.LexMode, +reversed: String, +acc: List<&2, J.Lexeme>) -> {J.lex_scan(text ++ " ", mode, reversed, acc) == J.lex_scan(text, mode, reversed, acc) : List<&2, J.Lexeme>}: match text: case SNil{}: match mode: case J.Outside{}: {==} case J.Quoted{}: {==} case J.Escaped{}: {==} case SCon{head, tail}: Equal.trans(List<&2, J.Lexeme>, J.lex_scan(SCon{head, tail} ++ " ", mode, reversed, acc), J.lex_scan(tail ++ " ", after_mode(J.lex_seed_action(SCon{head, tail}, mode), mode), after_reversed(J.lex_seed_action(SCon{head, tail}, mode), head, reversed), after_acc(J.lex_seed_action(SCon{head, tail}, mode), head, reversed, acc)), J.lex_scan(SCon{head, tail}, mode, reversed, acc), lex_scan_step(head, tail ++ " ", mode, reversed, acc), Equal.trans(List<&2, J.Lexeme>, J.lex_scan(tail ++ " ", after_mode(J.lex_seed_action(SCon{head, tail}, mode), mode), after_reversed(J.lex_seed_action(SCon{head, tail}, mode), head, reversed), after_acc(J.lex_seed_action(SCon{head, tail}, mode), head, reversed, acc)), J.lex_scan(tail, after_mode(J.lex_seed_action(SCon{head, tail}, mode), mode), after_reversed(J.lex_seed_action(SCon{head, tail}, mode), head, reversed), after_acc(J.lex_seed_action(SCon{head, tail}, mode), head, reversed, acc)), J.lex_scan(SCon{head, tail}, mode, reversed, acc), trailing_space(tail, after_mode(J.lex_seed_action(SCon{head, tail}, mode), mode), after_reversed(J.lex_seed_action(SCon{head, tail}, mode), head, reversed), after_acc(J.lex_seed_action(SCon{head, tail}, mode), head, reversed, acc)), Equal.sym(List<&2, J.Lexeme>, J.lex_scan(SCon{head, tail}, mode, reversed, acc), J.lex_scan(tail, after_mode(J.lex_seed_action(SCon{head, tail}, mode), mode), after_reversed(J.lex_seed_action(SCon{head, tail}, mode), head, reversed), after_acc(J.lex_seed_action(SCon{head, tail}, mode), head, reversed, acc)), lex_scan_step(head, tail, mode, reversed, acc))))def trailing_tab(+text: String, +mode: J.LexMode, +reversed: String, +acc: List<&2, J.Lexeme>) -> {J.lex_scan(text ++ "\t", mode, reversed, acc) == J.lex_scan(text, mode, reversed, acc) : List<&2, J.Lexeme>}: match text: case SNil{}: match mode: case J.Outside{}: {==} case J.Quoted{}: {==} case J.Escaped{}: {==} case SCon{head, tail}: Equal.trans(List<&2, J.Lexeme>, J.lex_scan(SCon{head, tail} ++ "\t", mode, reversed, acc), J.lex_scan(tail ++ "\t", after_mode(J.lex_seed_action(SCon{head, tail}, mode), mode), after_reversed(J.lex_seed_action(SCon{head, tail}, mode), head, reversed), after_acc(J.lex_seed_action(SCon{head, tail}, mode), head, reversed, acc)), J.lex_scan(SCon{head, tail}, mode, reversed, acc), lex_scan_step(head, tail ++ "\t", mode, reversed, acc), Equal.trans(List<&2, J.Lexeme>, J.lex_scan(tail ++ "\t", after_mode(J.lex_seed_action(SCon{head, tail}, mode), mode), after_reversed(J.lex_seed_action(SCon{head, tail}, mode), head, reversed), after_acc(J.lex_seed_action(SCon{head, tail}, mode), head, reversed, acc)), J.lex_scan(tail, after_mode(J.lex_seed_action(SCon{head, tail}, mode), mode), after_reversed(J.lex_seed_action(SCon{head, tail}, mode), head, reversed), after_acc(J.lex_seed_action(SCon{head, tail}, mode), head, reversed, acc)), J.lex_scan(SCon{head, tail}, mode, reversed, acc), trailing_tab(tail, after_mode(J.lex_seed_action(SCon{head, tail}, mode), mode), after_reversed(J.lex_seed_action(SCon{head, tail}, mode), head, reversed), after_acc(J.lex_seed_action(SCon{head, tail}, mode), head, reversed, acc)), Equal.sym(List<&2, J.Lexeme>, J.lex_scan(SCon{head, tail}, mode, reversed, acc), J.lex_scan(tail, after_mode(J.lex_seed_action(SCon{head, tail}, mode), mode), after_reversed(J.lex_seed_action(SCon{head, tail}, mode), head, reversed), after_acc(J.lex_seed_action(SCon{head, tail}, mode), head, reversed, acc)), lex_scan_step(head, tail, mode, reversed, acc))))def trailing_return(+text: String, +mode: J.LexMode, +reversed: String, +acc: List<&2, J.Lexeme>) -> {J.lex_scan(text ++ "\r", mode, reversed, acc) == J.lex_scan(text, mode, reversed, acc) : List<&2, J.Lexeme>}: match text: case SNil{}: match mode: case J.Outside{}: {==} case J.Quoted{}: {==} case J.Escaped{}: {==} case SCon{head, tail}: Equal.trans(List<&2, J.Lexeme>, J.lex_scan(SCon{head, tail} ++ "\r", mode, reversed, acc), J.lex_scan(tail ++ "\r", after_mode(J.lex_seed_action(SCon{head, tail}, mode), mode), after_reversed(J.lex_seed_action(SCon{head, tail}, mode), head, reversed), after_acc(J.lex_seed_action(SCon{head, tail}, mode), head, reversed, acc)), J.lex_scan(SCon{head, tail}, mode, reversed, acc), lex_scan_step(head, tail ++ "\r", mode, reversed, acc), Equal.trans(List<&2, J.Lexeme>, J.lex_scan(tail ++ "\r", after_mode(J.lex_seed_action(SCon{head, tail}, mode), mode), after_reversed(J.lex_seed_action(SCon{head, tail}, mode), head, reversed), after_acc(J.lex_seed_action(SCon{head, tail}, mode), head, reversed, acc)), J.lex_scan(tail, after_mode(J.lex_seed_action(SCon{head, tail}, mode), mode), after_reversed(J.lex_seed_action(SCon{head, tail}, mode), head, reversed), after_acc(J.lex_seed_action(SCon{head, tail}, mode), head, reversed, acc)), J.lex_scan(SCon{head, tail}, mode, reversed, acc), trailing_return(tail, after_mode(J.lex_seed_action(SCon{head, tail}, mode), mode), after_reversed(J.lex_seed_action(SCon{head, tail}, mode), head, reversed), after_acc(J.lex_seed_action(SCon{head, tail}, mode), head, reversed, acc)), Equal.sym(List<&2, J.Lexeme>, J.lex_scan(SCon{head, tail}, mode, reversed, acc), J.lex_scan(tail, after_mode(J.lex_seed_action(SCon{head, tail}, mode), mode), after_reversed(J.lex_seed_action(SCon{head, tail}, mode), head, reversed), after_acc(J.lex_seed_action(SCon{head, tail}, mode), head, reversed, acc)), lex_scan_step(head, tail, mode, reversed, acc))))def trailing_newline(+text: String, +mode: J.LexMode, +reversed: String, +acc: List<&2, J.Lexeme>) -> {J.lex_scan(text ++ "\n", mode, reversed, acc) == J.lex_scan(text, mode, reversed, acc) : List<&2, J.Lexeme>}: match text: case SNil{}: match mode: case J.Outside{}: {==} case J.Quoted{}: {==} case J.Escaped{}: {==} case SCon{head, tail}: Equal.trans(List<&2, J.Lexeme>, J.lex_scan(SCon{head, tail} ++ "\n", mode, reversed, acc), J.lex_scan(tail ++ "\n", after_mode(J.lex_seed_action(SCon{head, tail}, mode), mode), after_reversed(J.lex_seed_action(SCon{head, tail}, mode), head, reversed), after_acc(J.lex_seed_action(SCon{head, tail}, mode), head, reversed, acc)), J.lex_scan(SCon{head, tail}, mode, reversed, acc), lex_scan_step(head, tail ++ "\n", mode, reversed, acc), Equal.trans(List<&2, J.Lexeme>, J.lex_scan(tail ++ "\n", after_mode(J.lex_seed_action(SCon{head, tail}, mode), mode), after_reversed(J.lex_seed_action(SCon{head, tail}, mode), head, reversed), after_acc(J.lex_seed_action(SCon{head, tail}, mode), head, reversed, acc)), J.lex_scan(tail, after_mode(J.lex_seed_action(SCon{head, tail}, mode), mode), after_reversed(J.lex_seed_action(SCon{head, tail}, mode), head, reversed), after_acc(J.lex_seed_action(SCon{head, tail}, mode), head, reversed, acc)), J.lex_scan(SCon{head, tail}, mode, reversed, acc), trailing_newline(tail, after_mode(J.lex_seed_action(SCon{head, tail}, mode), mode), after_reversed(J.lex_seed_action(SCon{head, tail}, mode), head, reversed), after_acc(J.lex_seed_action(SCon{head, tail}, mode), head, reversed, acc)), Equal.sym(List<&2, J.Lexeme>, J.lex_scan(SCon{head, tail}, mode, reversed, acc), J.lex_scan(tail, after_mode(J.lex_seed_action(SCon{head, tail}, mode), mode), after_reversed(J.lex_seed_action(SCon{head, tail}, mode), head, reversed), after_acc(J.lex_seed_action(SCon{head, tail}, mode), head, reversed, acc)), lex_scan_step(head, tail, mode, reversed, acc))))