def _ParseFSMState(self, template):
    """Extracts State and associated Rules from body of template file.

    After the Value definitions the remainder of the template is
    state definitions. The routine is expected to be called iteratively
    until no more states remain - indicated by returning None.

    The routine checks that the state names are a well formed string, do
    not clash with reserved names and are unique.

    Args:
      template: Valid template file after Value definitions
      have already been read.

    Returns:
      Name of the state parsed from file. None otherwise.

    Raises:
      TextFSMTemplateError: If any state definitions are invalid.
    """

    if not template:
      return

    state_name = ''
    # Strip off extra white space lines (including comments).
    for line in template:
      self._line_num += 1
      line = line.rstrip()

      # First line is state definition
      if line and not self.comment_regex.match(line):
         # Ensure statename has valid syntax and is not a reserved word.
        if (not self.state_name_re.match(line) or
            len(line) > self.MAX_NAME_LEN or
            line in TextFSMRule.LINE_OP or
            line in TextFSMRule.RECORD_OP):
          raise TextFSMTemplateError("Invalid state name: '%s'. Line: %s"
                                     % (line, self._line_num))

        state_name = line
        if state_name in self.states:
          raise TextFSMTemplateError("Duplicate state name: '%s'. Line: %s"
                                     % (line, self._line_num))
        self.states[state_name] = []
        self.state_list.append(state_name)
        break

    # Parse each rule in the state.
    for line in template:
      self._line_num += 1
      line = line.rstrip()

      # Finish rules processing on blank line.
      if not line:
        break

      if self.comment_regex.match(line):
        continue

      # A rule within a state, starts with whitespace
      if not (line.startswith('  ^') or line.startswith('\t^')):
        raise TextFSMTemplateError(
            "Missing white space or carat ('^') before rule. Line: %s" %
            self._line_num)

      self.states[state_name].append(
          TextFSMRule(line, self._line_num, self.value_map))

    return state_name
def _ParseFSMState ( self , template ) : if not template : return state_name = '' for line in template : self . _line_num += 1 line = line . rstrip ( ) if line and not self . comment_regex . match ( line ) : if ( not self . state_name_re . match ( line ) or len ( line ) > self . MAX_NAME_LEN or line in TextFSMRule . LINE_OP or line in TextFSMRule . RECORD_OP ) : raise TextFSMTemplateError ( "Invalid state name: '%s'. Line: %s" % ( line , self . _line_num ) ) state_name = line if state_name in self . states : raise TextFSMTemplateError ( "Duplicate state name: '%s'. Line: %s" % ( line , self . _line_num ) ) self . states [ state_name ] = [ ] self . state_list . append ( state_name ) break for line in template : self . _line_num += 1 line = line . rstrip ( ) if not line : break if self . comment_regex . match ( line ) : continue if not ( line . startswith ( '  ^' ) or line . startswith ( '\t^' ) ) : raise TextFSMTemplateError ( "Missing white space or carat ('^') before rule. Line: %s" % self . _line_num ) self . states [ state_name ] . append ( TextFSMRule ( line , self . _line_num , self . value_map ) ) return state_name
Extracts State and associated Rules from body of template file.

    After the Value definitions the remainder of the template is
    state definitions. The routine is expected to be called iteratively
    until no more states remain - indicated by returning None.

    The routine checks that the state names are a well formed string, do
    not clash with reserved names and are unique.

    Args:
      template: Valid template file after Value definitions
      have already been read.

    Returns:
      Name of the state parsed from file. None otherwise.

    Raises:
      TextFSMTemplateError: If any state definitions are invalid.