diff options
Diffstat (limited to 'Master/texmf-dist/tex/latex/l3experimental/l3str/l3regex.sty')
-rw-r--r-- | Master/texmf-dist/tex/latex/l3experimental/l3str/l3regex.sty | 807 |
1 files changed, 444 insertions, 363 deletions
diff --git a/Master/texmf-dist/tex/latex/l3experimental/l3str/l3regex.sty b/Master/texmf-dist/tex/latex/l3experimental/l3str/l3regex.sty index facf764c168..8d1f45803f9 100644 --- a/Master/texmf-dist/tex/latex/l3experimental/l3str/l3regex.sty +++ b/Master/texmf-dist/tex/latex/l3experimental/l3str/l3regex.sty @@ -13,7 +13,7 @@ %% %% Do not distribute a modified version of this file. %% -%% File: l3regex.dtx Copyright (C) 2011 The LaTeX3 Project +%% File: l3regex.dtx Copyright (C) 2011-2012 The LaTeX3 Project %% %% It may be distributed and/or modified under the conditions of the %% LaTeX Project Public License (LPPL), either version 1.3c of this @@ -46,7 +46,7 @@ %% %% ----------------------------------------------------------------------- \RequirePackage{expl3} -\GetIdInfo$Id: l3regex.dtx 3073 2011-12-21 01:53:06Z bruno $ +\GetIdInfo$Id: l3regex.dtx 3200 2012-01-16 03:50:54Z bruno $ {L3 Experimental Regular Expressions} \ProvidesExplPackage {\ExplFileName}{\ExplFileDate}{\ExplFileVersion}{\ExplFileDescription} @@ -59,6 +59,7 @@ \int_new:N \l_regex_tmpb_int \flag_new:N \l_regex_group_begin_flag \flag_new:N \l_regex_group_end_flag +\int_new:N \l_regex_build_mode_int \int_new:N \l_regex_max_state_int \int_new:N \l_regex_left_state_int \int_new:N \l_regex_right_state_int @@ -69,13 +70,28 @@ \int_new:N \l_regex_capturing_group_int \seq_new:N \l_regex_capturing_group_seq \int_new:N \l_regex_capturing_group_max_int -\tl_new:N \l_regex_build_or_class_tl \tl_new:N \l_regex_one_or_group_tl -\bool_new:N \l_regex_in_csname_bool +\int_new:N \l_regex_catcodes_int +\int_new:N \l_regex_catcodes_default_int +\int_const:Nn \c_regex_catcode_C_int { "1 } +\int_const:Nn \c_regex_catcode_B_int { "4 } +\int_const:Nn \c_regex_catcode_E_int { "10 } +\int_const:Nn \c_regex_catcode_M_int { "40 } +\int_const:Nn \c_regex_catcode_T_int { "100 } +\int_const:Nn \c_regex_catcode_P_int { "1000 } +\int_const:Nn \c_regex_catcode_U_int { "4000 } +\int_const:Nn \c_regex_catcode_D_int { "10000 } +\int_const:Nn \c_regex_catcode_S_int { "100000 } +\int_const:Nn \c_regex_catcode_L_int { "400000 } +\int_const:Nn \c_regex_catcode_O_int { "1000000 } +\int_const:Nn \c_regex_catcode_A_int { "4000000 } +\int_const:Nn \c_regex_catcodes_all_int { "5515155 } +\bool_new:N \l_regex_catcodes_bool \tl_new:N \l_regex_tmpa_regex_tl -\cs_new_eq:NN \regex_build_tmp_class:n \use_none:n \bool_new:N \l_regex_class_bool \tl_new:N \l_regex_class_tl +\bool_new:N \l_regex_class_saved_bool +\tl_new:N \l_regex_class_saved_tl \tl_const:Nn \c_regex_d_tl { \regex_item_range:nn { \c_forty_eight } { 57 } % 0--9 @@ -213,49 +229,32 @@ } \cs_new_protected:Npn \regex_seq_push_int:NN #1#2 { \seq_push:No #1 { \int_use:N #2 } } -\cs_new_protected_nopar:Npn \regex_seq_pop_use:N #1 +\cs_new_protected:Npn \regex_seq_pop_use:N #1 { \seq_pop:NN #1 \l_regex_tmpa_tl \l_regex_tmpa_tl } -\cs_new_protected_nopar:Npn \regex_seq_get_use:N #1 +\cs_new_protected:Npn \regex_seq_get_use:N #1 { \seq_get:NN #1 \l_regex_tmpa_tl \l_regex_tmpa_tl } -\cs_new:Npn \regex_seq_item:Nn #1#2 - { - \exp_after:wN \regex_seq_item_aux:wNn - \int_use:N \int_eval:w #2 \exp_after:wN ; - #1 { ? \prg_map_break: } { } - \prg_break_point:n { } - } -\cs_new:Npn \regex_seq_item_aux:wNn #1; #2#3 +\cs_new_protected:Npn \regex_break_true:w + #1 \regex_break_point:TF #2 #3 {#2} +\cs_new_protected:Npn \regex_break_point:TF #1 #2 { #2 } +\cs_new_protected_nopar:Npn \regex_item_dot: { - \use_none:n #2 - \if_num:w #1 = \c_zero - \exp_after:wN \prg_map_break:n - \else: - \exp_after:wN \use_none:n + \if_num:w \l_regex_current_char_int > - \c_two + \exp_after:wN \regex_break_true:w \fi: - { \exp_not:n {#3} } - \exp_after:wN \regex_seq_item_aux:wNn - \int_use:N \int_eval:w #1 - \c_one ; } -\cs_new_protected_nopar:Npn \regex_item_dot:T - { \int_compare:nNnF \l_regex_current_char_int < \c_minus_one } -\cs_new_protected_nopar:Npn \regex_break_true:w - #1 \regex_break_point:TF #2 #3 {#2} -\cs_new_protected_nopar:Npn \regex_break_false:w - #1 \regex_break_point:TF #2 #3 {#3} -\cs_new_protected_nopar:Npn \regex_break_point:TF #1 #2 { #2 } -\cs_new_protected_nopar:Npn \regex_item_caseful_equal:n #1 +\cs_new_protected:Npn \regex_item_caseful_equal:n #1 { \if_num:w #1 = \l_regex_current_char_int \exp_after:wN \regex_break_true:w \fi: } -\cs_new_protected_nopar:Npn \regex_item_caseful_range:nn #1 #2 +\cs_new_protected:Npn \regex_item_caseful_range:nn #1 #2 { \reverse_if:N \if_num:w #1 > \l_regex_current_char_int \reverse_if:N \if_num:w #2 < \l_regex_current_char_int @@ -263,13 +262,13 @@ \fi: \fi: } -\cs_new_protected_nopar:Npn \regex_item_caseful_geq:n #1 +\cs_new_protected:Npn \regex_item_caseful_geq:n #1 { \reverse_if:N \if_num:w #1 > \l_regex_current_char_int \exp_after:wN \regex_break_true:w \fi: } -\cs_new_protected_nopar:Npn \regex_item_caseless_equal:n #1 +\cs_new_protected:Npn \regex_item_caseless_equal:n #1 { \if_num:w #1 = \l_regex_current_char_int \exp_after:wN \regex_break_true:w @@ -278,7 +277,7 @@ \exp_after:wN \regex_break_true:w \fi: } -\cs_new_protected_nopar:Npn \regex_item_caseless_range:nn #1 #2 +\cs_new_protected:Npn \regex_item_caseless_range:nn #1 #2 { \reverse_if:N \if_num:w #1 > \l_regex_current_char_int \reverse_if:N \if_num:w #2 < \l_regex_current_char_int @@ -291,7 +290,7 @@ \fi: \fi: } -\cs_new_protected_nopar:Npn \regex_item_caseless_geq:n #1 +\cs_new_protected:Npn \regex_item_caseless_geq:n #1 { \reverse_if:N \if_num:w #1 > \l_regex_current_char_int \exp_after:wN \regex_break_true:w @@ -317,17 +316,19 @@ \cs_set:Npn \regex_item_range:nn { \regex_item_caseful_range:nn } \cs_set:Npn \regex_item_geq:n { \regex_item_caseful_geq:n } } -\cs_new_protected_nopar:Npn \regex_item_catcode:n #1 +\cs_new_protected:Npn \regex_item_catcode:nT #1 { - \if_num:w #1 = \l_regex_current_catcode_int - \exp_after:wN \regex_break_true:w - \fi: - } -\cs_new_protected_nopar:Npn \regex_item_catcode_neq:n #1 - { - \if_num:w #1 = \l_regex_current_catcode_int + \if_int_odd:w \int_eval:w #1 / " + \if_case:w \l_regex_current_catcode_int + 1 \or: 4 \or: 10 \or: 40 + \or: 100 \or: \or: 1000 \or: 4000 + \or: 10000 \or: \or: 100000 \or: 400000 + \or: 1000000 \or: 4000000 \else: 1*\c_zero + \fi: + \int_eval_end: + \exp_after:wN \use:n \else: - \exp_after:wN \regex_break_true:w + \exp_after:wN \use_none:n \fi: } \cs_new_protected:Npn \regex_item_cs:n #1 @@ -357,7 +358,7 @@ { \if_false: } } \fi: \regex_get_digits_aux:NN } -\cs_new_nopar:Npn \regex_get_digits_aux:NN #1#2 +\cs_new:Npn \regex_get_digits_aux:NN #1#2 { \if_meaning:w \regex_build_raw:N #1 \if_charcode:w \c_space_token \exp_not:N #2 @@ -373,7 +374,7 @@ \fi: \regex_get_digits_aux:NN } -\cs_new_nopar:Npn \regex_get_digits_end:w #1 \fi: #2 \regex_get_digits_aux:NN +\cs_new:Npn \regex_get_digits_end:w #1 \fi: #2 \regex_get_digits_aux:NN { \fi: #2 \if_false: { { \fi: } } @@ -425,6 +426,14 @@ \fi: \fi: } +\cs_new_nopar:Npn \regex_build_if_in_class:TF + { + \if_int_odd:w \l_regex_build_mode_int + \exp_after:wN \use_i:nn + \else: + \exp_after:wN \use_ii:nn + \fi: + } \cs_new_protected_nopar:Npn \regex_build_new_state: { \tex_toks:D \l_regex_max_state_int { \s_stop } @@ -432,13 +441,13 @@ \int_set_eq:NN \l_regex_right_state_int \l_regex_max_state_int \int_incr:N \l_regex_max_state_int } -\cs_new_protected_nopar:Npn \regex_build_transition_aux:NN #1#2 +\cs_new_protected:Npn \regex_build_transition:NN #1#2 { \regex_build_new_state: \regex_toks_put_right:Nx \l_regex_left_state_int { #1 { \int_eval:n { #2 - \l_regex_left_state_int } } } } -\cs_new_protected_nopar:Npn \regex_build_transitions_aux:NNNN #1#2#3#4 +\cs_new_protected:Npn \regex_build_transitions:NNNN #1#2#3#4 { \regex_build_new_state: \regex_toks_put_right:Nx \l_regex_left_state_int @@ -449,11 +458,11 @@ } \cs_new_protected:Npn \regex_build:n #1 { - \bool_set_false:N \l_regex_in_csname_bool + \int_set_eq:NN \l_regex_build_mode_int \c_zero \regex_build:w \regex_build_new_state: \regex_toks_put_right:Nx \l_regex_left_state_int - { \regex_action_start_wildcard:nn {0} {1} } + { \regex_action_start_wildcard: } \regex_build_open_aux: \str_escape_use:NNNn \regex_build_i_unescaped:N @@ -461,34 +470,42 @@ \regex_build_i_raw:N { #1 } \prg_do_nothing: \prg_do_nothing: + \prg_do_nothing: \prg_do_nothing: \regex_build_end: } -\cs_new_nopar:Npn \regex_build_i_unescaped:N #1 +\cs_new:Npn \regex_build_i_unescaped:N #1 { \regex_aux_char_if_special:NTF #1 - { \exp_not:N \regex_build_control:N #1 } + { \exp_not:N \regex_build_special:N #1 } { \exp_not:N \regex_build_raw:N #1 } } -\cs_new_nopar:Npn \regex_build_i_escaped:N #1 +\cs_new:Npn \regex_build_i_escaped:N #1 { \regex_aux_char_if_alphanumeric:NTF #1 - { \exp_not:N \regex_build_control:N #1 } + { \exp_not:N \regex_build_escaped:N #1 } { \exp_not:N \regex_build_raw:N #1 } } -\cs_new_nopar:Npn \regex_build_i_raw:N #1 +\cs_new:Npn \regex_build_i_raw:N #1 { \exp_not:N \regex_build_raw:N #1 } -\cs_new_protected_nopar:Npn \regex_build_control:N #1 +\cs_new_protected:Npn \regex_build_special:N #1 { - \cs_if_exist_use:cF { regex_ \l_regex_build_or_class_tl _#1: } - { \use:c { regex_ \l_regex_build_or_class_tl _default_raw:N } #1 } + \cs_if_exist_use:cF { regex_build_#1: } + { \regex_build_raw:N #1 } + } +\cs_new_protected:Npn \regex_build_escaped:N #1 + { + \cs_if_exist_use:cF { regex_build_/#1: } + { \regex_build_raw:N #1 } } \cs_new_protected_nopar:Npn \regex_build:w { - \cs_set_eq:NN \regex_build_raw:N \regex_build_default_raw:N - \tl_set:Nn \l_regex_build_or_class_tl { build } - \int_set_eq:NN \l_regex_capturing_group_int \c_zero + \int_set_eq:NN \l_regex_catcodes_default_int \c_regex_catcodes_all_int + \int_set_eq:NN \l_regex_capturing_group_int \c_zero \int_zero:N \l_regex_max_state_int \regex_build_new_state: + \tl_clear:N \l_regex_class_tl + \bool_set_true:N \l_regex_class_bool + \int_set_eq:NN \l_regex_catcodes_int \l_regex_catcodes_default_int } \cs_new_protected_nopar:Npn \regex_build_end: { @@ -506,77 +523,158 @@ { \regex_action_success: } \int_incr:N \l_regex_capturing_group_int } -\cs_new_protected_nopar:cpn { regex_build_^: } - { \regex_build_anchor_start:N \l_regex_min_step_int } -\cs_new_protected_nopar:Npn \regex_build_A: - { \regex_build_anchor_start:N \l_regex_min_step_int } -\cs_new_protected_nopar:Npn \regex_build_G: - { \regex_build_anchor_start:N \l_regex_start_step_int } -\cs_new_protected_nopar:Npn \regex_build_anchor_start:N #1 +\cs_new_protected:Npn \regex_build_one:n #1 + { \regex_build_one:x { \exp_not:n {#1} } } +\cs_new_protected:Npn \regex_build_one:x #1 { - \regex_build_new_state: - \regex_toks_put_right:Nx \l_regex_left_state_int + \tl_put_right:Nx \l_regex_class_tl { - \exp_not:N \int_compare:nNnT #1 = \l_regex_current_step_int - { - \regex_action_free:n - { - \int_eval:n - { \l_regex_right_state_int - \l_regex_left_state_int } - } - } + \if_num:w \l_regex_catcodes_int = \c_regex_catcodes_all_int + \exp_after:wN \use:n + \else: + \regex_item_catcode:nT { \int_use:N \l_regex_catcodes_int } + \fi: + {#1} } + \if_num:w \l_regex_build_mode_int = \c_two + \l_regex_build_mode_int = \c_zero + \else: + \if_num:w \l_regex_build_mode_int = \c_six + \l_regex_build_mode_int = \c_three + \fi: + \fi: + \if_int_odd:w \l_regex_build_mode_int \else: + \exp_after:wN \regex_build_one_quantifier: + \fi: } -\cs_new_protected_nopar:cpn { regex_build_$: } % $ +\cs_new:Npn \regex_build_tmp_class:n #1 { - \regex_build_new_state: - \regex_toks_put_right:Nx \l_regex_left_state_int + \exp_not:o \l_regex_class_tl + \bool_if:NTF \l_regex_class_bool + { \regex_break_point:TF { \regex_action_cost:n {#1} } { } } + { \regex_break_point:TF { } { \regex_action_cost:n {#1} } } + } +\cs_new_protected:Npn \regex_class_put:N #1 + { + \tl_put_right:Nx \l_regex_class_tl + { \regex_item_equal:n { \int_value:w `#1 ~ } } + } +\cs_new_protected:Npn \regex_class_put:NN #1#2 + { + \tl_put_right:Nx \l_regex_class_tl + { \regex_item_range:nn { \int_value:w `#1 ~ } { \int_value:w `#2 ~ } } + } +\cs_new_protected:Npn \regex_build_raw_alphanum_is_error:N #1 + { + \regex_aux_char_if_alphanumeric:NTF #1 + { \msg_kernel_error:nnx { regex } { class-bad-escape } { #1 } } + { \regex_build_raw:N #1 } + } +\cs_new_protected:Npn \regex_build_raw:N #1#2#3 + { + \regex_build_if_in_class:TF + { \str_if_eq:nnTF {#2#3} { \regex_build_special:N - } } + { \use_ii:nn } + { \regex_class_range:Nw #1 } { - \exp_not:N \int_compare:nNnT - \l_regex_current_char_int < \c_minus_one - { - \regex_action_free:n - { - \int_eval:n - { \l_regex_right_state_int - \l_regex_left_state_int } - } - } + \regex_build_one:x { \regex_item_equal:n { \int_value:w `#1 ~ } } + #2 #3 } } -\cs_new_eq:Nc \regex_build_Z: { regex_build_$: } %$ -\cs_new_eq:Nc \regex_build_z: { regex_build_$: } %$ -\cs_new_protected_nopar:Npn \regex_build_b: +\cs_new_protected:Npn \regex_class_range:Nw #1#2#3 { - \regex_build_new_state: - \regex_toks_put_right:Nx \l_regex_left_state_int + \token_if_eq_meaning:NNTF #2 \regex_build_escaped:N % [ + { \use_i:nn } { \str_if_eq:nnTF { #2#3 } { \regex_build_special:N ] } } { - \exp_not:N \regex_if_word_boundary:TF - { - \regex_action_free:n - { - \int_eval:n - { \l_regex_right_state_int - \l_regex_left_state_int } - } - } - { } + \msg_kernel_warning:nnx { regex } { end-range-missing } % [ + { #1 - \if_meaning:w #3 ] \else: \c_backslash_str \fi: #3 } + \regex_class_put:N #1 + \regex_class_put:N - + #2#3 + } + { + \if_num:w `#1 > `#3 \exp_stop_f: + \msg_kernel_error:nnxx { regex } { backwards-range } {#1} {#3} + \else: + \if_num:w `#1 = `#3 \exp_stop_f: + \regex_class_put:N #3 + \else: + \regex_class_put:NN #1#3 + \fi: + \fi: } } -\cs_new_protected_nopar:Npn \regex_build_B: +\cs_new_protected_nopar:cpn { regex_build_.: } { - \regex_build_new_state: - \regex_toks_put_right:Nx \l_regex_left_state_int + \regex_build_if_in_class:TF + { \regex_build_raw:N . } + { \regex_build_one:x \regex_item_dot: } + } +\tl_map_inline:nn { dDhHsSvVwWN } + { + \cs_new_protected_nopar:cpx { regex_build_/#1: } + { \regex_build_one:n \exp_not:c { c_regex_#1_tl } } + } +\cs_new_protected:Npn \regex_build_simple_assertion:Nn #1#2 + { + \regex_build_if_in_class:TF + { \regex_build_raw_alphanum_is_error:N #1 } { - \exp_not:N \regex_if_word_boundary:TF - { } + \regex_build_new_state: + \regex_toks_put_right:Nx \l_regex_left_state_int { - \regex_action_free:n + \exp_not:n {#2} { - \int_eval:n - { \l_regex_right_state_int - \l_regex_left_state_int } + \regex_action_free:n + { + \int_eval:n + { \l_regex_right_state_int - \l_regex_left_state_int } + } } } + %^^A \regex_assertion_quantifier: } } +\cs_new_protected_nopar:cpn { regex_build_^: } + { + \regex_build_simple_assertion:Nn ^ + { \int_compare:nNnT \l_regex_min_step_int = \l_regex_current_step_int } + } +\cs_new_protected_nopar:cpn { regex_build_/A: } + { + \regex_build_simple_assertion:Nn A + { \int_compare:nNnT \l_regex_min_step_int = \l_regex_current_step_int } + } +\cs_new_protected_nopar:cpn { regex_build_/G: } + { + \regex_build_simple_assertion:Nn G + { \int_compare:nNnT \l_regex_start_step_int = \l_regex_current_step_int } + } +\cs_new_protected_nopar:cpn { regex_build_$: } % $ + { + \regex_build_simple_assertion:Nn $ % $ + { \int_compare:nNnT \l_regex_current_char_int < \c_minus_one } + } +\cs_new_protected_nopar:cpn { regex_build_/Z: } + { + \regex_build_simple_assertion:Nn Z + { \int_compare:nNnT \l_regex_current_char_int < \c_minus_one } + } +\cs_new_protected_nopar:cpn { regex_build_/z: } + { + \regex_build_simple_assertion:Nn z + { \int_compare:nNnT \l_regex_current_char_int < \c_minus_one } + } +\cs_new_protected_nopar:cpn { regex_build_/b: } + { + \regex_build_simple_assertion:Nn b + { \regex_if_word_boundary:TF \use:n \use_none:n } + } +\cs_new_protected_nopar:cpn { regex_build_/B: } + { + \regex_build_simple_assertion:Nn B + { \regex_if_word_boundary:TF { } } + } \cs_new_protected_nopar:Npn \regex_if_word_boundary:TF { \group_begin: @@ -587,211 +685,179 @@ { \group_end: \c_regex_w_tl } \regex_break_point:TF } -\cs_new_protected:Npn \regex_build_one:n #1 - { \regex_build_one:x { \exp_not:n {#1} } } -\cs_new_protected:Npn \regex_build_one:x #1 - { - \cs_set_nopar:Npx \regex_build_tmp_class:n ##1 - { - \exp_not:N \exp_not:n {#1} - \regex_break_point:TF { \regex_action_cost:n {##1} } { } - } - \regex_build_one_quantifier: - } -\cs_new_protected_nopar:Npn \regex_build_default_raw:N #1 - { \regex_build_one:x { \regex_item_equal:n { \int_value:w `#1 ~ } } } -\cs_new_protected_nopar:cpn { regex_build_.: } - { - \cs_set:Npn \regex_build_tmp_class:n ##1 - { \regex_item_dot:T { \regex_action_cost:n {##1} } } - \regex_build_one_quantifier: - } -\tl_map_inline:nn { dDhHsSvVwWN } - { - \cs_new_protected_nopar:cpx { regex_build_#1: } - { \regex_build_one:n \exp_not:c { c_regex_#1_tl } } - } -\cs_new_protected:Npn \regex_class_one:n - { \tl_put_right:Nn \l_regex_class_tl } -\cs_new_protected:Npn \regex_class_one:x - { \tl_put_right:Nx \l_regex_class_tl } \cs_new_protected_nopar:cpn { regex_build_[: } { - \tl_clear:N \l_regex_class_tl - \cs_set_eq:NN \regex_build_raw:N \regex_class_default_raw:N - \tl_set:Nn \l_regex_build_or_class_tl { class } - \regex_class_first:NN + \regex_build_if_in_class:TF + { \regex_build_raw:N [ } + { \regex_class_first:NNNN } } -\cs_new_protected_nopar:cpn { regex_class_]: } +\cs_new_protected:cpn { regex_build_]: } { - \tl_if_empty:NTF \l_regex_class_tl %[ - { \regex_class_default_raw:N ] } + \regex_build_if_in_class:TF { - \cs_set_eq:NN \regex_build_raw:N \regex_build_default_raw:N - \tl_set:Nn \l_regex_build_or_class_tl { build } - \cs_set:Npn \regex_build_tmp_class:n ##1 - { - \exp_not:o \l_regex_class_tl - \bool_if:NTF \l_regex_class_bool - { \regex_break_point:TF { \regex_action_cost:n {##1} } { } } - { \regex_break_point:TF { } { \regex_action_cost:n {##1} } } - } - \regex_build_one_quantifier: + \if_num:w \l_regex_build_mode_int > \c_sixteen + \tl_set:Nx \l_regex_class_tl + { + \exp_not:o \l_regex_class_saved_tl + \if_num:w \l_regex_catcodes_int < \c_regex_catcodes_all_int + \regex_item_catcode:nT { \int_use:N \l_regex_catcodes_int } + \else: + \exp_after:wN \use:n + \fi: + { + \exp_not:o \l_regex_class_tl + \bool_if:NF \l_regex_class_bool + { \regex_break_point:TF { } { \regex_break_true:w } } + } + } + \bool_set_eq:NN \l_regex_class_bool \l_regex_class_saved_bool + \fi: + \tex_advance:D \l_regex_build_mode_int - \c_fifteen + \tex_divide:D \l_regex_build_mode_int \c_thirteen + \if_int_odd:w \l_regex_build_mode_int \else: + \exp_after:wN \regex_build_one_quantifier: + \fi: } + { \regex_build_raw:N ] } } -\cs_new_protected_nopar:Npn \regex_class_first:NN #1#2 +\cs_new_protected:Npn \regex_class_first:NNNN #1#2#3#4 { - \str_if_eq:nnTF {#1#2} { \regex_build_control:N ^ } - { \bool_set_false:N \l_regex_class_bool } + \l_regex_build_mode_int = \int_value:w \l_regex_build_mode_int 3 ~ % + \if_num:w \l_regex_build_mode_int > \c_sixteen + \tl_set_eq:NN \l_regex_class_saved_tl \l_regex_class_tl + \bool_set_eq:NN \l_regex_class_saved_bool \l_regex_class_bool + \fi: + \token_if_eq_meaning:NNTF #1 \regex_build_special:N { - \bool_set_true:N \l_regex_class_bool - #1 #2 + \token_if_eq_charcode:NNTF #2 ^ + { + \bool_set_false:N \l_regex_class_bool % [ + \str_if_eq:nnTF {#3#4} { \regex_build_special:N ] } + { \regex_build_raw:N } + } + { % [ + \token_if_eq_charcode:NNTF #2 ] + { \regex_build_raw:N #2 } + { #1 #2 } + } } + { #1 #2 } + #3 #4 } -\cs_new_protected_nopar:Npn \regex_class_default_raw:N #1#2#3 +\cs_new_protected:cpn { regex_build_/c: } { - \str_if_eq:nnTF {#2#3} { \regex_build_control:N - } - { \regex_class_range:Nw #1 } - { - \regex_class_single:N #1 - #2 #3 - } + \if_case:w \l_regex_build_mode_int + \exp_after:wN \regex_build_c_aux:wNN + \or: \or: \or: \exp_after:wN \regex_build_c_aux:wNN + \fi: + \msg_kernel_error:nn { regex } { c-bad-mode } + \s_stop } -\cs_new_protected_nopar:Npn \regex_class_single:N #1 - { \regex_class_one:x { \regex_item_equal:n { \int_value:w `#1 } } } -\cs_new_protected_nopar:Npn \regex_class_range:Nw #1#2#3 +\cs_new_protected:Npn \regex_build_c_aux:wNN #1 \s_stop #2#3 { - \token_if_eq_meaning:NNTF #2 \regex_build_control:N + \token_if_eq_meaning:NNTF #2 \regex_build_raw:N { - \cs_if_exist:cTF { regex_class_#3: } + \cs_if_exist:cTF { c_regex_catcode_#3_int } { - \regex_class_single:N #1 - \regex_class_single:N - - #2#3 + \int_set_eq:Nc \l_regex_catcodes_int { c_regex_catcode_#3_int } + \l_regex_build_mode_int + = \if_case:w \l_regex_build_mode_int \c_two \else: \c_six \fi: } - { \regex_class_range_put:NN #1#3 } } - { \regex_class_range_put:NN #1#3 } + { \cs_if_exist_use:cF { regex_build_c_#3: } } + { + \msg_kernel_error:nnxx { regex } { c-command } + { regular~expression } { #3 } + #2 #3 + } } -\cs_new_protected_nopar:Npn \regex_class_range_put:NN #1#2 +\cs_new_protected:cpn { regex_build_c_ \c_lbrace_str : } { - \if_num:w `#1 > `#2 \exp_stop_f: - \msg_kernel_error:nnxx { regex } { backwards-range } {#1} {#2} - \else: - \regex_class_one:x - { - \if_num:w `#1 = `#2 \exp_stop_f: - \regex_item_equal:n - \else: - \regex_item_range:nn { \int_value:w `#1 } - \fi: - { \int_value:w `#2 } - } - \fi: + \group_begin: + \l_regex_build_mode_int + = - \if_case:w \l_regex_build_mode_int \c_two \else: \c_six \fi: + \regex_build:w } -\tl_map_inline:nn { dDhHsSvVwWN } +\cs_new_protected:cpn { regex_build_c_[: } #1#2 { - \cs_new_protected_nopar:cpx { regex_class_#1: } - { \regex_class_one:n \exp_not:c { c_regex_#1_tl } } + \int_zero:N \l_regex_catcodes_int + \str_if_eq:nnTF { #1 #2 } { \regex_build_special:N ^ } + { + \bool_set_false:N \l_regex_catcodes_bool + \regex_build_c_lbrack_loop:NN + } + { + \bool_set_true:N \l_regex_catcodes_bool + \regex_build_c_lbrack_loop:NN + #1#2 + } } -\cs_new_protected_nopar:Npn \regex_build_c: - { \regex_aux_c:NNNN \regex_item_catcode:n \use_i:nn } -\cs_new_protected_nopar:Npn \regex_build_C: - { \regex_aux_c:NNNN \regex_item_catcode_neq:n \use_ii:nn } -\cs_new_eq:NN \regex_class_c: \regex_build_c: -\cs_new_eq:NN \regex_class_C: \regex_build_C: -\cs_new_protected:Npn \regex_aux_c:NNNN #1#2#3#4 +\cs_new_protected:Npn \regex_build_c_lbrack_loop:NN #1#2 { - \token_if_eq_meaning:NNTF #3 \regex_build_raw:N + \token_if_eq_meaning:NNTF #1 \regex_build_raw:N { - \regex_aux_c_test:NTF #4 + \cs_if_exist:cTF { c_regex_catcode_#2_int } { - \use:c { regex_ \l_regex_build_or_class_tl _one:x } - { #1 { \int_use:N \l_regex_current_catcode_int } } - } - { - \msg_kernel_error:nnx { regex } { build-c } { #4 } - #3 #4 + \exp_args:Nc \regex_build_c_lbrack_add:N + { c_regex_catcode_#2_int } + \regex_build_c_lbrack_loop:NN } } - { - \if_charcode:w \c_lbrace_str \exp_not:N #4 - \exp_after:wN #2 - \else: - \exp_after:wN \use_ii:nn - \fi: - { - \group_begin: - \bool_set_true:N \l_regex_in_csname_bool - \regex_build:w - } - { - \msg_kernel_error:nnx { regex } { build-c } { #4 } - #3 #4 - } + { % [ + \token_if_eq_charcode:NNTF #2 ] + { \regex_build_c_lbrack_end: } } + { + \msg_kernel_error:nnxx { regex } { c-command } + { regular-expression } { #2 } + \regex_build_c_lbrack_end: + } } -\cs_new_protected:Npn \regex_aux_c_test:NTF #1 +\cs_new_protected_nopar:Npn \regex_build_c_lbrack_end: { - \int_set:Nn \l_regex_current_catcode_int - { - \if_case:w \int_eval:w `#1 - `A \int_eval_end: - \c_thirteen % Active - \or: \c_one % Begin-group - \or: \c_zero % Control sequence - \or: \c_eight % Down (subscript) - \or: \c_two % End-group - \else: - \if_case:w \int_eval:w `#1 - `L \int_eval_end: - \c_eleven % Letter - \or: \c_three % Math toggle - \or: \c_minus_one - \or: \c_twelve % Other - \or: \c_six % Parameter - \or: \c_minus_one - \or: \c_minus_one - \or: \c_ten % Space - \or: \c_four % Tab (alignment) - \or: \c_seven % Up (superscript) - \else: \c_minus_one - \fi: - \fi: - } - \if_num:w \l_regex_current_catcode_int = \c_minus_one - \exp_after:wN \use_ii:nn + \l_regex_build_mode_int + = \if_case:w \l_regex_build_mode_int \c_two \else: \c_six \fi: + \if_meaning:w \c_false_bool \l_regex_catcodes_bool + \int_set:Nn \l_regex_catcodes_int + { \c_regex_catcodes_all_int - \l_regex_catcodes_int } + \fi: + } +\cs_new_protected:Npn \regex_build_c_lbrack_add:N #1 + { + \if_int_odd:w \int_eval:w \l_regex_catcodes_int / #1 \int_eval_end: \else: - \exp_after:wN \use_i:nn + \tex_advance:D \l_regex_catcodes_int #1 \fi: } \cs_new_protected:cpn { regex_build_ \c_rbrace_str : } - { - \bool_if:NTF \l_regex_in_csname_bool + { %^^A incorrect recovery for \c{...(...[...} with missing ) or ]. + \int_compare:nNnTF \l_regex_build_mode_int < \c_zero { - \regex_build_Z: + \use:c { regex_build_/Z: } \regex_toks_put_right:Nx \l_regex_right_state_int { \regex_action_success: } \int_incr:N \l_regex_capturing_group_int \use:x { \group_end: - \exp_not:n { \use:c { regex_ \l_regex_build_or_class_tl _one:n } } - { \regex_item_cs:n { \regex_set_aux:N ? } } + \regex_build_one:n + { \regex_item_cs:n { \regex_set_aux:N ? } } } } { \exp_after:wN \regex_build_raw:N \c_rbrace_str } } -\cs_new_protected_nopar:Npn \regex_build_quantifier:w #1#2 +\cs_new_protected:Npn \regex_build_quantifier:w #1#2 { - \token_if_eq_meaning:NNTF #1 \regex_build_control:N + \token_if_eq_meaning:NNTF #1 \regex_build_special:N { \cs_if_exist_use:cF { regex_build_quantifier_#2:w } { - \regex_build_quantifier_end:n { } + \regex_build_quantifier_end:nn { } { } #1 #2 } } { - \regex_build_quantifier_end:n { } + \regex_build_quantifier_end:nn { } { } #1 #2 } } @@ -801,55 +867,55 @@ { \regex_build_quantifier_aux:nnNN { } { * } } \cs_new_protected_nopar:cpn { regex_build_quantifier_+:w } { \regex_build_quantifier_aux:nnNN { } { + } } -\cs_new_protected_nopar:Npn \regex_build_quantifier_aux:nnNN #1#2#3#4 +\cs_new_protected:Npn \regex_build_quantifier_aux:nnNN #1#2#3#4 { - \str_if_eq:nnTF { #3 #4 } { \regex_build_control:N ? } - { \regex_build_quantifier_end:n { #2 #4 } #1 } + \str_if_eq:nnTF { #3 #4 } { \regex_build_special:N ? } + { \regex_build_quantifier_end:nn { #2 #4 } {#1} } { - \regex_build_quantifier_end:n { #2 } #1 + \regex_build_quantifier_end:nn { #2 } {#1} #3 #4 } } \cs_new_protected_nopar:cpn { regex_build_quantifier_ \c_lbrace_str :w } { \regex_get_digits:nw { \regex_build_quantifier_lbrace:n } } -\cs_new_protected_nopar:Npn \regex_build_quantifier_lbrace:n #1 +\cs_new_protected:Npn \regex_build_quantifier_lbrace:n #1 { \tl_if_empty:nTF {#1} { - \regex_build_quantifier_end:n { } + \regex_build_quantifier_end:nn { } { } \exp_after:wN \regex_build_raw:N \c_lbrace_str } { \regex_build_quantifier_lbrace:nw {#1} } } -\cs_new_protected_nopar:Npx \regex_build_quantifier_lbrace:nw #1#2#3 +\cs_new_protected:Npx \regex_build_quantifier_lbrace:nw #1#2#3 { \exp_not:N \prg_case_str:nnn { #2 #3 } { - { \exp_not:N \regex_build_control:N , } + { \exp_not:N \regex_build_special:N , } { \exp_not:N \regex_get_digits:nw { \exp_not:N \regex_build_quantifier_lbrace:nnw {#1} } } - { \exp_not:N \regex_build_control:N \c_rbrace_str } - { \exp_not:N \regex_build_quantifier_end:n {n} {#1} } + { \exp_not:N \regex_build_special:N \c_rbrace_str } + { \exp_not:N \regex_build_quantifier_end:nn {n} { {#1} } } } { - \exp_not:N \regex_build_quantifier_end:n { } + \exp_not:N \regex_build_quantifier_end:nn { } { } \exp_not:N \regex_build_raw:N \c_lbrace_str #1#2 } } -\cs_new_protected_nopar:Npn \regex_build_quantifier_lbrace:nnw #1#2#3#4 +\cs_new_protected:Npn \regex_build_quantifier_lbrace:nnw #1#2#3#4 { \str_if_eq:xxTF { \exp_not:n {#3#4} } - { \exp_not:N \regex_build_control:N \c_rbrace_str } + { \exp_not:N \regex_build_special:N \c_rbrace_str } { \tl_if_empty:nTF {#2} { \regex_build_quantifier_aux:nnNN { {#1} } { n* } } { \regex_build_quantifier_aux:nnNN { {#1} {#2} } { nn } } } %^^A todo: catch the case m>n { - \regex_build_quantifier_end:n { } + \regex_build_quantifier_end:nn { } { } \use:x { \exp_args:No \tl_map_function:nN @@ -859,8 +925,13 @@ #3 #4 } } -\cs_new_protected_nopar:Npn \regex_build_quantifier_end:n #1 - { \use:c { regex_build_ \l_regex_one_or_group_tl _ #1 : } } +\cs_new_protected:Npn \regex_build_quantifier_end:nn #1#2 + { + \use:c { regex_build_ \l_regex_one_or_group_tl _ #1 : } #2 + \tl_clear:N \l_regex_class_tl + \bool_set_true:N \l_regex_class_bool + \int_set_eq:NN \l_regex_catcodes_int \l_regex_catcodes_default_int + } \cs_new_protected_nopar:Npn \regex_build_one_quantifier: { \tl_set:Nx \l_regex_one_or_group_tl { one } @@ -868,30 +939,30 @@ } \cs_new_protected_nopar:Npn \regex_build_one_: { - \regex_build_transition_aux:NN + \regex_build_transition:NN \regex_build_tmp_class:n \l_regex_right_state_int } \cs_new_protected_nopar:cpn { regex_build_one_?: } { - \regex_build_transitions_aux:NNNN + \regex_build_transitions:NNNN \regex_build_tmp_class:n \l_regex_right_state_int \regex_action_free:n \l_regex_right_state_int } \cs_new_protected_nopar:cpn { regex_build_one_??: } { - \regex_build_transitions_aux:NNNN + \regex_build_transitions:NNNN \regex_action_free:n \l_regex_right_state_int \regex_build_tmp_class:n \l_regex_right_state_int } \cs_new_protected_nopar:cpn { regex_build_one_*: } { - \regex_build_transitions_aux:NNNN + \regex_build_transitions:NNNN \regex_build_tmp_class:n \l_regex_left_state_int \regex_action_free:n \l_regex_right_state_int } \cs_new_protected_nopar:cpn { regex_build_one_*?: } { - \regex_build_transitions_aux:NNNN + \regex_build_transitions:NNNN \regex_action_free:n \l_regex_right_state_int \regex_build_tmp_class:n \l_regex_left_state_int } @@ -899,7 +970,7 @@ { \regex_build_one_: \int_set_eq:NN \l_regex_tmpa_int \l_regex_left_state_int - \regex_build_transitions_aux:NNNN + \regex_build_transitions:NNNN \regex_action_free:n \l_regex_tmpa_int \regex_action_free:n \l_regex_right_state_int } @@ -907,24 +978,24 @@ { \regex_build_one_: \int_set_eq:NN \l_regex_tmpa_int \l_regex_left_state_int - \regex_build_transitions_aux:NNNN + \regex_build_transitions:NNNN \regex_action_free:n \l_regex_right_state_int \regex_action_free:n \l_regex_tmpa_int } -\cs_new_protected_nopar:Npn \regex_build_one_n: #1 +\cs_new_protected:Npn \regex_build_one_n: #1 { \prg_replicate:nn {#1} { \regex_build_one_: } } \cs_new_eq:cN { regex_build_one_n?: } \regex_build_one_n: -\cs_new_protected_nopar:cpx { regex_build_one_n*: } #1 +\cs_new_protected:cpx { regex_build_one_n*: } #1 { \exp_not:N \prg_replicate:nn {#1} { \exp_not:N \regex_build_one_: } \exp_not:c { regex_build_one_*: } } -\cs_new_protected_nopar:cpx { regex_build_one_n*?: } #1 +\cs_new_protected:cpx { regex_build_one_n*?: } #1 { \exp_not:N \prg_replicate:nn {#1} { \exp_not:N \regex_build_one_: } \exp_not:c { regex_build_one_*?: } } -\cs_new_protected_nopar:Npn \regex_build_one_nn_aux:Nnn #1#2#3 +\cs_new_protected:Npn \regex_build_one_nn_aux:Nnn #1#2#3 { \prg_replicate:nn {#2} { \regex_build_one_: } \prg_replicate:nn {#3-#2} {#1} @@ -933,17 +1004,24 @@ { \regex_build_one_nn_aux:Nnn \exp_not:c { regex_build_one_?: } } \cs_new_protected_nopar:cpx { regex_build_one_nn?: } { \regex_build_one_nn_aux:Nnn \exp_not:c { regex_build_one_??: } } -\cs_new_protected_nopar:cpn { regex_build_(: } #1#2 +\cs_new_protected:cpn { regex_build_(: } #1#2 { - \str_if_eq:nnTF { #1 #2 } { \regex_build_control:N ? } - { \regex_build_special_group:NN } + \regex_build_if_in_class:TF { - \int_incr:N \l_regex_capturing_group_int - \regex_seq_push_int:NN - \l_regex_capturing_group_seq \l_regex_capturing_group_int - \regex_build_open_aux: + \regex_build_raw:N ( #1 #2 } + { + \str_if_eq:nnTF { #1 #2 } { \regex_build_special:N ? } + { \regex_build_special_group:NN } + { + \int_incr:N \l_regex_capturing_group_int + \regex_seq_push_int:NN + \l_regex_capturing_group_seq \l_regex_capturing_group_int + \regex_build_open_aux: + #1 #2 + } + } } \cs_new_protected_nopar:Npn \regex_build_open_aux: { @@ -958,16 +1036,22 @@ } \cs_new_protected_nopar:cpn { regex_build_|: } { - \regex_build_end_alternation: - \regex_build_begin_alternation: + \regex_build_if_in_class:TF { \regex_build_raw:N | } + { + \regex_build_end_alternation: + \regex_build_begin_alternation: + } } \cs_new_protected_nopar:cpn { regex_build_): } { - \seq_if_empty:NTF \l_regex_capturing_group_seq - { \msg_kernel_error:nn { regex } { extra-rparen } } + \regex_build_if_in_class:TF { \regex_build_raw:N ) } { - \regex_build_close_aux: - \regex_build_group_quantifier: + \seq_if_empty:NTF \l_regex_capturing_group_seq + { \msg_kernel_error:nn { regex } { extra-rparen } } + { + \regex_build_close_aux: + \regex_build_group_quantifier: + } } } \cs_new_protected_nopar:Npn \regex_build_close_aux: @@ -1005,13 +1089,13 @@ } \regex_seq_get_use:N \l_regex_end_alternation_seq } -\cs_new_protected_nopar:Npn \regex_build_special_group:NN #1#2 +\cs_new_protected:Npn \regex_build_special_group:NN #1#2 { \cs_if_exist_use:cF { regex_build_special_group_\token_to_str:N #2 : } { \msg_kernel_error:nnx { regex } { unsupported } { (? \token_to_str:N #2 } %) - \regex_build_control:N ( % ) + \regex_build_special:N ( % ) \regex_build_raw:N ? #1 #2 } @@ -1060,7 +1144,7 @@ { \regex_build_options:NNN - } -\cs_new_protected_nopar:Npn \regex_build_options:NNN #1#2#3 +\cs_new_protected:Npn \regex_build_options:NNN #1#2#3 { \token_if_eq_meaning:NNTF \regex_build_raw:N #2 { @@ -1090,7 +1174,7 @@ \tl_set:Nn \l_regex_one_or_group_tl { group } \regex_build_quantifier:w } -\cs_new_protected_nopar:Npn \regex_build_group_submatches:NN #1#2 +\cs_new_protected:Npn \regex_build_group_submatches:NN #1#2 { \seq_pop:NN \l_regex_capturing_group_seq \l_regex_tmpa_tl \int_compare:nNnF { \l_regex_tmpa_tl } < \c_zero @@ -1105,10 +1189,10 @@ { \regex_build_group_submatches:NN \l_regex_left_state_int \l_regex_right_state_int - \regex_build_transition_aux:NN + \regex_build_transition:NN \regex_action_free:n \l_regex_right_state_int } -\cs_new_protected_nopar:Npn \regex_build_group_shift:N #1 +\cs_new_protected:Npn \regex_build_group_shift:N #1 { \int_set_eq:NN \l_regex_tmpa_int \l_regex_left_state_int \regex_build_new_state: @@ -1130,11 +1214,11 @@ \regex_build_group_submatches:NN \l_regex_right_state_int \l_regex_left_state_int } -\cs_new_protected_nopar:Npn \regex_build_group_qs_aux:NN #1#2 +\cs_new_protected:Npn \regex_build_group_qs_aux:NN #1#2 { \regex_build_group_shift:N \regex_action_free:n \int_set_eq:NN \l_regex_right_state_int \l_regex_left_state_int - \regex_build_transition_aux:NN \regex_action_free:n #1 + \regex_build_transition:NN \regex_action_free:n #1 #2 \l_regex_tmpa_int { \regex_action_free:n @@ -1166,7 +1250,7 @@ \regex_build_group_submatches:NN \l_regex_left_state_int \l_regex_right_state_int \int_set_eq:NN \l_regex_tmpa_int \l_regex_left_state_int - \regex_build_transitions_aux:NNNN + \regex_build_transitions:NNNN \regex_action_free:n \l_regex_tmpa_int \regex_action_free:n \l_regex_right_state_int } @@ -1175,11 +1259,11 @@ \regex_build_group_submatches:NN \l_regex_left_state_int \l_regex_right_state_int \int_set_eq:NN \l_regex_tmpa_int \l_regex_left_state_int - \regex_build_transitions_aux:NNNN + \regex_build_transitions:NNNN \regex_action_free:n \l_regex_right_state_int \regex_action_free:n \l_regex_tmpa_int } -\cs_new_protected_nopar:Npn \regex_build_group_n_aux:n #1 +\cs_new_protected:Npn \regex_build_group_n_aux:n #1 { \regex_toks_put_right:Nx \l_regex_right_state_int { @@ -1203,39 +1287,39 @@ \int_incr:N \l_regex_tmpb_int } } -\cs_new_protected_nopar:Npn \regex_build_group_n: #1 +\cs_new_protected:Npn \regex_build_group_n: #1 { % ^^A todo: catch case #1 <= 0. \regex_build_group_n_aux:n {#1} - \regex_build_transition_aux:NN + \regex_build_transition:NN \regex_action_free:n \l_regex_right_state_int \regex_build_group_submatches:NN \l_regex_tmpa_int \l_regex_left_state_int } \cs_new_eq:cN { regex_build_group_n?: } \regex_build_group_n: -\cs_new_protected_nopar:cpn { regex_build_group_n*: } #1 +\cs_new_protected:cpn { regex_build_group_n*: } #1 { % ^^A todo: catch case #1 <= 0. \regex_build_group_n_aux:n {#1} - \regex_build_transitions_aux:NNNN + \regex_build_transitions:NNNN \regex_action_free:n \l_regex_tmpa_int \regex_action_free:n \l_regex_right_state_int \regex_build_group_submatches:NN \l_regex_tmpa_int \l_regex_left_state_int } -\cs_new_protected_nopar:cpn { regex_build_group_n*?: } #1 +\cs_new_protected:cpn { regex_build_group_n*?: } #1 { % ^^A todo: catch case #1 <= 0. \regex_build_group_n_aux:n {#1} - \regex_build_transitions_aux:NNNN + \regex_build_transitions:NNNN \regex_action_free:n \l_regex_right_state_int \regex_action_free:n \l_regex_tmpa_int \regex_build_group_submatches:NN \l_regex_tmpa_int \l_regex_left_state_int } -\cs_new_protected_nopar:Npn \regex_build_group_nn: #1#2 +\cs_new_protected:Npn \regex_build_group_nn: #1#2 { % ^^A Not Implemented Yet! \msg_expandable_error:n { Quantifier~{m,n}~not~implemented~yet } \use:c { regex_build_group_n*: } {#1} } -\cs_new_protected_nopar:cpn { regex_build_group_nn?: } #1#2 +\cs_new_protected:cpn { regex_build_group_nn?: } #1#2 { % ^^A Not Implemented Yet! \msg_expandable_error:n { Quantifier~{m,n}~not~implemented~yet } \use:c { regex_build_group_n*?: } {#1} @@ -1250,7 +1334,7 @@ { \regex_state_use_aux:n { } } \cs_new_protected_nopar:Npn \regex_state_use: { \regex_state_use_aux:n { \exp_after:wN \use_none_delimit_by_s_stop:w } } -\cs_new_protected_nopar:Npn \regex_state_use_aux:n #1 +\cs_new_protected:Npn \regex_state_use_aux:n #1 { \if_num:w \tex_dimen:D \l_regex_current_state_int < \l_regex_unique_id_int @@ -1315,7 +1399,7 @@ \int_set_eq:NN \l_regex_min_step_int \l_regex_current_step_int \exp_after:wN \regex_query_set_loop:ww \l_regex_tmpa_tl - \q_mark { ? \prg_map_break: } , + \s_tl { ? \prg_map_break: } \s_tl \prg_break_point:n { } \int_set_eq:NN \l_regex_max_step_int \l_regex_current_step_int \regex_query_set:nnn { } { -1 } { -2 } @@ -1323,7 +1407,7 @@ \regex_match_initial_setup: \regex_match_once: } -\cs_new:Npn \regex_query_set_loop:ww #1 \q_mark #2#3 , +\cs_new:Npn \regex_query_set_loop:ww #1 \s_tl #2#3 \s_tl { \use_none:n #2 \regex_query_set:nnn {#1} {"#2} {#3} @@ -1414,7 +1498,7 @@ \fi: \regex_match_loop: } -\cs_new_nopar:Npn \regex_match_one_index:w #1; +\cs_new:Npn \regex_match_one_index:w #1; { \if_num:w #1 > \l_regex_max_index_int \exp_after:wN \prg_map_break: @@ -1424,7 +1508,7 @@ \exp_after:wN \regex_match_one_index:w \int_use:N \int_eval:w #1 + \c_one ; } -\cs_new_protected_nopar:Npn \regex_match_one_index_aux:n #1 +\cs_new_protected:Npn \regex_match_one_index_aux:n #1 { \int_set:Nn \l_regex_current_state_int {#1} \prop_clear:N \l_regex_current_submatches_prop @@ -1448,14 +1532,14 @@ \fi: \fi: } -\cs_new_protected_nopar:Npn \regex_action_start_wildcard:nn #1#2 +\cs_new_protected_nopar:Npn \regex_action_start_wildcard: { \bool_set_true:N \l_regex_fresh_thread_bool - \regex_action_free:n {#2} + \regex_action_free:n {1} \bool_set_false:N \l_regex_fresh_thread_bool - \regex_action_cost:n {#1} + \regex_action_cost:n {0} } -\cs_new_protected_nopar:Npn \regex_action_cost:n #1 +\cs_new_protected:Npn \regex_action_cost:n #1 { \exp_args:Nf \regex_store_state:n { \int_eval:n { \l_regex_current_state_int + #1 } } @@ -1473,7 +1557,7 @@ \prg_map_break: } } -\cs_new_protected_nopar:Npn \regex_action_free:n #1 +\cs_new_protected:Npn \regex_action_free:n #1 { \cs_set_nopar:Npx \regex_tmp:w { @@ -1486,7 +1570,7 @@ } \regex_tmp:w } -\cs_new_protected_nopar:Npn \regex_action_submatch:n #1 +\cs_new_protected:Npn \regex_action_submatch:n #1 { \prop_put:Nno \l_regex_current_submatches_prop {#1} { \int_use:N \l_regex_current_step_int } @@ -1511,7 +1595,7 @@ \regex_replacement_raw:N {#1} \prg_do_nothing: \prg_do_nothing: - \cs_set_nopar:Npx \regex_nesting:n ##1 + \cs_set:Npx \regex_nesting:n ##1 { + \int_use:N \l_regex_nesting_int \l_regex_nesting_tl @@ -1519,7 +1603,7 @@ } \use:x { - \exp_not:n { \cs_set_nopar:Npn \regex_replacement_tl:n ##1 } + \exp_not:n { \cs_set:Npn \regex_replacement_tl:n ##1 } { \str_aux_toks_range:nn \c_zero \l_regex_replacement_int } } % ^^A rename! Careful with \cP\#. @@ -1574,7 +1658,8 @@ } \cs_new_protected:Npn \regex_replacement_error:NNN #1#2#3 { - \msg_kernel_error:nn { regex } { replacement-#1 } + \msg_kernel_error:nnxx { regex } { #1-command } + { replacement~text } {#3} #2 #3 } \cs_new_protected:Npn \regex_replacement_g:w #1#2 @@ -1611,7 +1696,7 @@ { \regex_replacement_error:NNN g } #1 #2 } -\cs_new_protected_nopar:Npn \regex_replacement_c:w #1#2 +\cs_new_protected:Npn \regex_replacement_c:w #1#2 { \token_if_eq_meaning:NNTF #1 \regex_replacement_unescaped:N { @@ -1626,7 +1711,9 @@ \regex_replacement_put:n { \exp_not:n { \exp_after:wN \regex_replacement_exp_not:N \cs:w } } } -\cs_new_nopar:Npn \regex_replacement_exp_not:N #1 { \exp_not:n {#1} } +\cs_new_eq:cc { regex_replacement_c_C:w } + { regex_replacement_c_ \c_lbrace_str :w } +\cs_new:Npn \regex_replacement_exp_not:N #1 { \exp_not:n {#1} } \group_begin: \char_set_catcode_math_superscript:N \^^@ @@ -1637,7 +1724,7 @@ \cs_new_protected_nopar:Npn \regex_replacement_c_T:w { \regex_replacement_char:nNN { ^^@ } } - \cs_new_protected_nopar:Npn \regex_replacement_c_S:w #1#2 + \cs_new_protected:Npn \regex_replacement_c_S:w #1#2 { \int_compare:nNnTF { `#2 } = \c_zero { \regex_replacement_error:NNN c #1#2 } @@ -1649,7 +1736,7 @@ \char_set_catcode_parameter:N \^^@ \cs_new_protected_nopar:Npn \regex_replacement_c_P:w - { \regex_replacement_char:nNN { ^^@^^@ } } + { \regex_replacement_char:nNN { ^^@^^@^^@^^@^^@^^@^^@^^@ } } \char_set_catcode_other:N \^^@ \cs_new_protected_nopar:Npn \regex_replacement_c_O:w @@ -1687,7 +1774,7 @@ \group_end: -\cs_new_protected_nopar:Npn \regex_replacement_char:nNN #1#2#3 +\cs_new_protected:Npn \regex_replacement_char:nNN #1#2#3 { \char_set_lccode:nn \c_zero { `#3 } \tl_to_lowercase:n @@ -1728,7 +1815,7 @@ \regex_set_aux:n \s_stop } -\cs_new_nopar:Npn \regex_set_aux:n #1 +\cs_new:Npn \regex_set_aux:n #1 { \tex_toks:D #1 { \tex_the:D \tex_toks:D #1 } } \cs_new:Npn \regex_nfa:Nw #1 { @@ -1737,13 +1824,13 @@ } \cs_new_protected_nopar:Npn \regex_use:N { \exp_last_unbraced:No \use_none:nn } -\cs_new_nopar:Npn \regex_to_str:N #1 +\cs_new:Npn \regex_to_str:N #1 { \exp_after:wN \regex_to_str_aux:Nw #1 \tex_toks:D \q_stop \prg_map_break: \tex_toks:D \prg_break_point:n { } } -\cs_new_nopar:Npn \regex_to_str_aux:Nw #1#2\tex_toks:D +\cs_new:Npn \regex_to_str_aux:Nw #1#2\tex_toks:D { \use_none_delimit_by_q_stop:w #2 \q_stop \tl_to_str:n {#1#2} \iow_newline: @@ -1821,12 +1908,12 @@ } \fi: } -\cs_new_protected_nopar:Npn \regex_extract_aux_b:wn #1 < #2 +\cs_new_protected:Npn \regex_extract_aux_b:wn #1 < #2 { \tex_skip:D #1 = #2 sp plus \etex_gluestretch:D \tex_skip:D #1 \scan_stop: } -\cs_new_protected_nopar:Npn \regex_extract_aux_e:wn #1 > #2 +\cs_new_protected:Npn \regex_extract_aux_e:wn #1 > #2 { \tex_skip:D #1 = 1 \tex_skip:D #1 plus #2 sp \scan_stop: @@ -1851,7 +1938,7 @@ \exp_args:NNNo \group_end: \tl_set:Nn #1 \l_regex_tmpa_tl } -\cs_new_nopar:Npn \regex_extract_seq_aux:n #1 +\cs_new:Npn \regex_extract_seq_aux:n #1 { \seq_item:n { @@ -1859,7 +1946,7 @@ \int_value:w \regex_submatch_nesting_aux:n {#1} ; #1; } } -\cs_new_nopar:Npn \regex_extract_seq_aux:ww #1; #2; +\cs_new:Npn \regex_extract_seq_aux:ww #1; #2; { %^^A todo: use flags \if_num:w #1 < \c_zero \flag_raise:N \l_regex_group_end_flag @@ -1989,7 +2076,7 @@ \group_end: \fi: } -\cs_new_protected_nopar:Npn \regex_replace_once_aux:w #1; +\cs_new_protected:Npn \regex_replace_once_aux:w #1; { } \cs_new_protected:Npn \regex_replace_all_aux:NnnN #1#2#3#4 @@ -2041,7 +2128,7 @@ \exp_args:NNNo \group_end: \tl_set:Nn #4 \l_regex_tmpa_tl } -\cs_new_nopar:Npn \regex_replace_all_aux:n #1 +\cs_new:Npn \regex_replace_all_aux:n #1 { \regex_query_substr:nn { \etex_glueshrink:D \tex_skip:D #1 } { \tex_skip:D #1 } @@ -2119,12 +2206,12 @@ is~\\\\ \ \ \ \ \token_to_str:N #1 = \token_to_meaning:N #1 . } -\msg_kernel_new:nnnn { regex } { build-c } - { Misused~\iow_char:N\\c~or\iow_char:N\\C~command~in~regular~expression. } +\msg_kernel_new:nnnn { regex } { c-command } + { Misused~\iow_char:N\\c~or\iow_char:N\\C~command~in~a~#1. } { - The~\iow_char:N\\C~escape~sequence~can~be~followed~by~ - one~of~the~letters~ABCDELMOPSTU.~The~\iow_char:N\\c~ - escape~sequence~can~also~be~followed~by~a~brace~group. + In~a~#1,~the~\iow_char:N\\C~escape~sequence~ + can~be~followed~by~one~of~the~letters~ABCDELMOPSTU~ + or~a~brace~group,~not~by~'#2'. } \msg_kernel_new:nnnn { regex } { unknown-option } { Unknown~option~`#1'~for~regular~expressions. } @@ -2138,19 +2225,13 @@ The~character~or~escape~sequence~`#1'~is~not~defined~ as~an~option~within~regular~expressions. } -\msg_kernel_new:nnnn { regex } { replacement-g } +\msg_kernel_new:nnnn { regex } { g-command } { Missing~brace~for~the~\iow_char:N\\g~construction~in~a~replacement~text. } { In~the~replacement~text~for~a~regular~expression~search,~ submatches~are~represented~either~as~\iow_char:N \\g{dd..d},~ or~\\d,~where~`d'~are~single~digits.~Here,~a~brace~is~missing. } -\msg_kernel_new:nnnn { regex } { replacement-c } - { Something~is~wrong~with~the~replacement~text. } - { - The~\iow_char:N\\c~escape~sequence~can~only~be~followed~by~ - ABCDELMN~or~by~a~brace. - } \msg_kernel_new:nnn { regex } { nfa-misused } { Automaton~#1 used~incorrectly. } %% |