aboutsummaryrefslogblamecommitdiffstats
path: root/library/cpp/config/markupfsm.h.rl6
blob: b709faaebffdbd372c6bc6aa51d5f3bae62904f9 (plain) (tree)















































































                                                                                         
%%{
    machine ParseXml;

    action startText {
        l = p;
    }

    action endText {
        cb->DoText(TStringBuf(l + 1, p));
    }

    action startSTag {
        l = p;
    }

    action endSTag {
        cb->DoTagOpen(TStringBuf(l, p));
    }

    action startETag {
        l = p;
    }

    action endETag {
        cb->DoTagClose(TStringBuf(l, p));
    }

    action startKey {
        l = p;
    }

    action endKey {
        cb->DoAttrKey(TStringBuf(l, p));
    }

    action startValue {
        l = p;
    }

    action endValue {
        cb->DoAttrValue(TStringBuf(l, p));
    }

    spacesym = [ \r\n\t];
    gsym     = (spacesym | '<' | '>' | '/');
    sym      = any -- gsym;
    asym     = sym -- ('=' | '"');
    tag      = sym+;
    xattrkey = asym+;
    xattrval = asym*;
    xspace   = spacesym*;
    mspace   = spacesym+;
    attr     = (xattrkey >startKey %endKey) '=' '"' (xattrval >startValue %endValue) '"';
    attrs    = (mspace attr)*;
    text     = ('>' (any -- '<')*) >startText %endText;
    stag     = '<' xspace (tag >startSTag %endSTag) attrs xspace;
    etag     = '<' xspace '/' xspace (tag >startETag %endETag) xspace;

    main    := spacesym* ((stag | etag) text)*;
}%%

#if defined(MACHINE_DATA)
#undef MACHINE_DATA
%%{
    write data;
}%%
#endif

#if defined(MACHINE_INIT)
#undef MACHINE_INIT
%%{
    write init;
}%%
#endif

#if defined(MACHINE_EXEC)
#undef MACHINE_EXEC
%%{
    write exec;
}%%
#endif