def test(): f = FSM('INIT') f.add_default_transition(Error, 'INIT') f.add_transition('<', 'INIT', None, 'TAG') f.add_transition(ANY, 'INIT', None, 'INIT') # Ignore white space between tags f.add_transition('?', 'TAG', None, 'XML_DECLARATION') f.add_transition(ANY, 'XML_DECLARATION', None, 'XML_DECLARATION') f.add_transition('?', 'XML_DECLARATION', None, 'XML_DECLARATION_END') f.add_transition('>', 'XML_DECLARATION_END', None, 'INIT') # Handle building tags f.add_transition(ANY, 'TAG', StartBuildTag, 'BUILD_TAG') f.add_transition(ANY, 'BUILD_TAG', BuildTag, 'BUILD_TAG') f.add_transition(' ', 'BUILD_TAG', None, 'ELEMENT_PARAMETERS') f.add_transition('/', 'TAG', None, 'END_TAG') f.add_transition('/', 'BUILD_TAG', None, 'EMPTY_ELEMENT') f.add_transition('>', 'BUILD_TAG', DoneBuildTag, 'INIT') # Handle element parameters f.add_transition('>', 'ELEMENT_PARAMETERS', DoneBuildTag, 'INIT') f.add_transition('/', 'ELEMENT_PARAMETERS', None, 'EMPTY_ELEMENT') f.add_transition('"', 'ELEMENT_PARAMETERS', None, 'DOUBLE_QUOTE') f.add_transition(ANY, 'ELEMENT_PARAMETERS', None, 'ELEMENT_PARAMETERS') # Handle quoting inside of parameter lists f.add_transition(ANY, 'DOUBLE_QUOTE', None, 'DOUBLE_QUOTE') f.add_transition('"', 'DOUBLE_QUOTE', None, 'ELEMENT_PARAMETERS') # Handle empty element tags f.add_transition('>', 'EMPTY_ELEMENT', DoneEmptyElement, 'INIT') # Handle end tags f.add_transition(ANY, 'END_TAG', StartBuildEndTag, 'BUILD_END_TAG') f.add_transition(ANY, 'BUILD_END_TAG', BuildEndTag, 'BUILD_END_TAG') f.add_transition('>', 'BUILD_END_TAG', DoneBuildEndTag, 'INIT') f.process_string(XML_TEST_DATA) return len(f.stack)
def test(): f = FSM('INIT') f.add_default_transition (Error, 'INIT') f.add_transition ('<', 'INIT', None, 'TAG') f.add_transition (ANY, 'INIT', None, 'INIT') # Ignore white space between tags f.add_transition ('?', 'TAG', None, 'XML_DECLARATION') f.add_transition (ANY, 'XML_DECLARATION', None, 'XML_DECLARATION') f.add_transition ('?', 'XML_DECLARATION', None, 'XML_DECLARATION_END') f.add_transition ('>', 'XML_DECLARATION_END', None, 'INIT') # Handle building tags f.add_transition (ANY, 'TAG', StartBuildTag, 'BUILD_TAG') f.add_transition (ANY, 'BUILD_TAG', BuildTag, 'BUILD_TAG') f.add_transition (' ', 'BUILD_TAG', None, 'ELEMENT_PARAMETERS') f.add_transition ('/', 'TAG', None, 'END_TAG') f.add_transition ('/', 'BUILD_TAG', None, 'EMPTY_ELEMENT') f.add_transition ('>', 'BUILD_TAG', DoneBuildTag, 'INIT') # Handle element parameters f.add_transition ('>', 'ELEMENT_PARAMETERS', DoneBuildTag, 'INIT') f.add_transition ('/', 'ELEMENT_PARAMETERS', None, 'EMPTY_ELEMENT') f.add_transition ('"', 'ELEMENT_PARAMETERS', None, 'DOUBLE_QUOTE') f.add_transition (ANY, 'ELEMENT_PARAMETERS', None, 'ELEMENT_PARAMETERS') # Handle quoting inside of parameter lists f.add_transition (ANY, 'DOUBLE_QUOTE', None, 'DOUBLE_QUOTE') f.add_transition ('"', 'DOUBLE_QUOTE', None, 'ELEMENT_PARAMETERS') # Handle empty element tags f.add_transition ('>', 'EMPTY_ELEMENT', DoneEmptyElement, 'INIT') # Handle end tags f.add_transition (ANY, 'END_TAG', StartBuildEndTag, 'BUILD_END_TAG') f.add_transition (ANY, 'BUILD_END_TAG', BuildEndTag, 'BUILD_END_TAG') f.add_transition ('>', 'BUILD_END_TAG', DoneBuildEndTag, 'INIT') f.process_string (XML_TEST_DATA) return len(f.stack)
def _init(self): f = FSM(0) f.arg = "" f.add_default_transition(self._error, 0) # normally add text to args f.add_transition(ANY, 0, self._addtext, 0) f.add_transition_list(" \t", 0, self._wordbreak, 0) f.add_transition_list(";\n", 0, self._doit, 0) # slashes f.add_transition("\\", 0, None, 1) f.add_transition("\\", 3, None, 6) f.add_transition(ANY, 1, self._slashescape, 0) f.add_transition(ANY, 6, self._slashescape, 3) # vars f.add_transition("$", 0, self._startvar, 7) f.add_transition("{", 7, self._vartext, 9) f.add_transition_list(self.VARNAME, 7, self._vartext, 7) f.add_transition(ANY, 7, self._endvar, 0) f.add_transition("}", 9, self._endvar, 0) f.add_transition(ANY, 9, self._vartext, 9) # vars in singlequote f.add_transition("$", 3, self._startvar, 8) f.add_transition("{", 8, self._vartext, 10) f.add_transition_list(self.VARNAME, 8, self._vartext, 8) f.add_transition(ANY, 8, self._endvar, 3) f.add_transition("}", 10, self._endvar, 3) f.add_transition(ANY, 10, self._vartext, 10) # single quotes quote all f.add_transition("'", 0, None, 2) f.add_transition("'", 2, self._singlequote, 0) f.add_transition(ANY, 2, self._addtext, 2) # double quotes allow embedding word breaks and such f.add_transition('"', 0, None, 3) f.add_transition('"', 3, self._doublequote, 0) f.add_transition(ANY, 3, self._addtext, 3) # single-quotes withing double quotes f.add_transition("'", 3, None, 5) f.add_transition("'", 5, self._singlequote, 3) f.add_transition(ANY, 5, self._addtext, 5) self._fsm = f