proc p_digit str { if {[string is digit -strict [string index $str 0]]} { return [list [string index $str 0] [string range $str 1 end]] } else { return [list] } } proc p_char {str ch} { if {[string index $str 0] eq $ch} { return [list [string index $str 0] [string range $str 1 end]] } else { return [list] } } proc parser_of_char {ch} { pipeset outparser @@ok/result.= { pipeswitch { pipecase .= list $input $ch |data/0,char/1> \ ,'${ch}'@0.= {p_char $data $char} return [list ok [list result [list]]] } } \ ,'result'@@ok/@0.= { .= list $pipe $input |p@,i@> {{*}$p $i} } |result@@ok/result> =result>1/1 return nothing-functor } } $input" pipecase = $input |> \ ,'${ch}'@0.= {list [string index $data 0] [string range $data 1 end] } |> { set data } return nothing } }