def lex

bend-kit-sigv4@0.11.0.1 · sigv4.bend:662

import bend-kit-sigv4@0.11.0.1/sigv4.bend as Sigv4
import Base

662# One pass over the text. Each step takes one char, so it ends.
663def lex(s: String, m: Lx, st: St) -> St:
664  match s:
665    case SNil{}:
666      st.end(m, st)
667    case SCon{h, t}:
668      match h m:
669        case '<' LText{}:
670          lex(t, LOpen{}, st.nm0(st))
671        case '&' LText{}:
672          lex(t, LEnt{}, st.nm0(st))
673        case c LText{}:
674          lex(t, LText{}, st.txt(st, c))
675        case '/' LOpen{}:
676          lex(t, LEnd{}, st)
677        case '?' LOpen{}:
678          lex(t, LPi{}, st)
679        case '!' LOpen{}:
680          lex(t, LBang{}, st)
681        case c LOpen{}:
682          lex(t, LName{}, st.nm(st, c))
683        case '>' LName{}:
684          lex(t, LText{}, st.open(st))
685        case '/' LName{}:
686          lex(t, LSelf{}, st.open(st))
687        case ' ' LName{}:
688          lex(t, LAttr{}, st.open(st))
689        case Chr{9} LName{}:
690          lex(t, LAttr{}, st.open(st))
691        case Chr{10} LName{}:
692          lex(t, LAttr{}, st.open(st))
693        case Chr{13} LName{}:
694          lex(t, LAttr{}, st.open(st))
695        case c LName{}:
696          lex(t, LName{}, st.nm(st, c))
697        case '"' LAttr{}:
698          lex(t, LDq{}, st)
699        case Chr{39} LAttr{}:
700          lex(t, LSq{}, st)
701        case '>' LAttr{}:
702          lex(t, LText{}, st)
703        case '/' LAttr{}:
704          lex(t, LSelf{}, st)
705        case c LAttr{}:
706          lex(t, LAttr{}, st)
707        case '"' LDq{}:
708          lex(t, LAttr{}, st)
709        case c LDq{}:
710          lex(t, LDq{}, st)
711        case Chr{39} LSq{}:
712          lex(t, LAttr{}, st)
713        case c LSq{}:
714          lex(t, LSq{}, st)
715        case '>' LSelf{}:
716          lex(t, LText{}, st.close.top(st))
717        case c LSelf{}:
718          lex(t, LAttr{}, st)
719        case '>' LEnd{}:
720          lex(t, LText{}, st.close(st))
721        case ' ' LEnd{}:
722          lex(t, LEnd{}, st)
723        case Chr{9} LEnd{}:
724          lex(t, LEnd{}, st)
725        case Chr{10} LEnd{}:
726          lex(t, LEnd{}, st)
727        case Chr{13} LEnd{}:
728          lex(t, LEnd{}, st)
729        case c LEnd{}:
730          lex(t, LEnd{}, st.nm(st, c))
731        case '?' LPi{}:
732          lex(t, LPiQ{}, st)
733        case c LPi{}:
734          lex(t, LPi{}, st)
735        case '>' LPiQ{}:
736          lex(t, LText{}, st)
737        case '?' LPiQ{}:
738          lex(t, LPiQ{}, st)
739        case c LPiQ{}:
740          lex(t, LPi{}, st)
741        case '-' LBang{}:
742          lex(t, LCom{}, st)
743        case '[' LBang{}:
744          lex(t, LCdHead{}, st)
745        case c LBang{}:
746          lex(t, LDecl{}, st)
747        case '-' LCom{}:
748          lex(t, LCom1{}, st)
749        case c LCom{}:
750          lex(t, LCom{}, st)
751        case '-' LCom1{}:
752          lex(t, LCom2{}, st)
753        case c LCom1{}:
754          lex(t, LCom{}, st)
755        case '>' LCom2{}:
756          lex(t, LText{}, st)
757        case '-' LCom2{}:
758          lex(t, LCom2{}, st)
759        case c LCom2{}:
760          lex(t, LCom{}, st)
761        case '[' LCdHead{}:
762          lex(t, LCd{}, st)
763        case c LCdHead{}:
764          lex(t, LCdHead{}, st)
765        case ']' LCd{}:
766          lex(t, LCd1{}, st)
767        case c LCd{}:
768          lex(t, LCd{}, st.txt(st, c))
769        case ']' LCd1{}:
770          lex(t, LCd2{}, st)
771        case c LCd1{}:
772          lex(t, LCd{}, st.txt(st.txt(st, ']'), c))
773        case '>' LCd2{}:
774          lex(t, LText{}, st)
775        case ']' LCd2{}:
776          lex(t, LCd2{}, st.txt(st, ']'))
777        case c LCd2{}:
778          lex(t, LCd{}, st.txt(st.txt(st.txt(st, ']'), ']'), c))
779        case ';' LEnt{}:
780          lex(t, LText{}, st.ent(st))
781        case c LEnt{}:
782          lex(t, LEnt{}, st.nm(st, c))
783        case '>' LDecl{}:
784          lex(t, LText{}, st)
785        case c LDecl{}:
786          lex(t, LDecl{}, st)

Uses (16)

Used by (1)