Ejemplo n.º 1
0
    def stateParse(cls, parserState: ParserState):
        currentBlock = parserState.Block

        if isinstance(currentBlock, SensitivityList.OpenBlock):
            return
        elif isinstance(
                currentBlock,
            (SensitivityList.ItemBlock, SensitivityList.DelimiterBlock)):
            return
        elif isinstance(currentBlock, SensitivityList.CloseBlock):
            parserState.Pop()
            return
        elif isinstance(currentBlock, (LinebreakBlock, IndentationBlock)):
            parserState.PushState = WhitespaceGroup.stateParse
            parserState.NextGroup = WhitespaceGroup(parserState.LastGroup,
                                                    currentBlock)
            parserState.BlockMarker = currentBlock
            parserState.ReIssue = True
            return
        elif isinstance(currentBlock, CommentBlock):
            parserState.PushState = CommentGroup.stateParse
            parserState.NextGroup = CommentGroup(parserState.LastGroup,
                                                 currentBlock)
            parserState.BlockMarker = currentBlock
            parserState.ReIssue = True
            return

        if isinstance(currentBlock, EndOfDocumentBlock):
            parserState.NextGroup = EndOfDocumentGroup(currentBlock)
            return

        raise GroupParserException("End of generic list not found.",
                                   currentBlock)
Ejemplo n.º 2
0
    def stateParse(cls, parserState: ParserState):
        currentBlock = parserState.Block

        if isinstance(currentBlock, Architecture.NameBlock):
            parserState.NextState = cls.stateParseDeclarations
            return
        elif isinstance(currentBlock, (LinebreakBlock, IndentationBlock)):
            parserState.PushState = WhitespaceGroup.stateParse
            parserState.NextGroup = WhitespaceGroup(parserState.LastGroup,
                                                    currentBlock)
            parserState.BlockMarker = currentBlock
            parserState.ReIssue = True
            return
        elif isinstance(currentBlock, CommentBlock):
            parserState.PushState = CommentGroup.stateParse
            parserState.NextGroup = CommentGroup(parserState.LastGroup,
                                                 currentBlock)
            parserState.BlockMarker = currentBlock
            parserState.ReIssue = True
            return
        elif isinstance(currentBlock, EndOfDocumentBlock):
            parserState.NextGroup = EndOfDocumentGroup(currentBlock)
            return

        raise GroupParserException(
            "End of architecture declaration not found.".format(
                block=currentBlock.__class__.__qualname__), currentBlock)
Ejemplo n.º 3
0
    def stateParsePorts(cls, parserState: ParserState):
        currentBlock = parserState.Block

        if isinstance(currentBlock, PortList.OpenBlock):
            parserState.NextState = cls.stateParseDeclarations
            parserState.PushState = PortListGroup.stateParse
            parserState.NextGroup = PortListGroup(parserState.LastGroup,
                                                  currentBlock)
            parserState.BlockMarker = currentBlock
            parserState.ReIssue = True
            return
        elif isinstance(currentBlock, (LinebreakBlock, IndentationBlock)):
            parserState.PushState = WhitespaceGroup.stateParse
            parserState.NextGroup = WhitespaceGroup(parserState.LastGroup,
                                                    currentBlock)
            parserState.BlockMarker = currentBlock
            parserState.ReIssue = True
            return
        elif isinstance(currentBlock, CommentBlock):
            parserState.PushState = CommentGroup.stateParse
            parserState.NextGroup = CommentGroup(parserState.LastGroup,
                                                 currentBlock)
            parserState.BlockMarker = currentBlock
            parserState.ReIssue = True
            return

        if isinstance(currentBlock, EndOfDocumentBlock):
            parserState.NextGroup = EndOfDocumentGroup(currentBlock)
            return

        raise GroupParserException("End of port clause not found.",
                                   currentBlock)
Ejemplo n.º 4
0
	def stateParse(cls, parserState: ParserState):
		for block in parserState.GetBlockIterator:
			if (not isinstance(block, (WhitespaceBlock, LinebreakBlock, IndentationBlock))):
				parserState.NextGroup = cls(parserState.LastGroup, parserState.BlockMarker, block.PreviousBlock)
				parserState.Pop()
				parserState.ReIssue =   True
				return

		raise GroupParserException("End of library clause not found.", block)
Ejemplo n.º 5
0
    def stateParse(cls, parserState: ParserState):
        for block in parserState.GetBlockIterator:
            if isinstance(block, Use.EndBlock):
                parserState.NextGroup = cls(parserState.LastGroup,
                                            parserState.BlockMarker, block)
                parserState.Pop()
                return

        raise GroupParserException("End of library clause not found.", block)
Ejemplo n.º 6
0
	def stateParse(cls, parserState: ParserState):
		for block in parserState.GetBlockIterator:
			if (not isinstance(block, CommentBlock)):
				parserState.NextGroup = cls(parserState.LastGroup, parserState.BlockMarker, block)
				parserState.Pop()
				parserState.ReIssue =   True
				return

		raise GroupParserException("End of library clause not found.", block)
Ejemplo n.º 7
0
	def stateParse(cls, parserState: ParserState):
		currentBlock = parserState.Block

		# consume OpenBlock
		if isinstance(currentBlock, Procedure.NameBlock):
			parserState.NextGroup =   cls(parserState.LastGroup, currentBlock)
			parserState.BlockMarker = currentBlock
			parserState.NextState =   cls.stateParseGenerics
			return
		else:
			raise GroupParserException("Begin of procedure expected.", currentBlock)
Ejemplo n.º 8
0
    def stateParse(cls, parserState: ParserState):
        currentBlock = parserState.Block

        # consume OpenBlock
        if isinstance(currentBlock, Process.OpenBlock):
            parserState.NextGroup = cls(parserState.LastGroup, currentBlock)
            parserState.BlockMarker = currentBlock
            parserState.NextState = cls.stateParseSensitivityList
            return
        else:
            raise GroupParserException("Begin of process expected.",
                                       currentBlock)
Ejemplo n.º 9
0
    def stateParse(cls, parserState: ParserState):
        for block in parserState.GetBlockIterator:
            if isinstance(block, GenericList.DelimiterBlock):
                parserState.Pop()
                return
            elif isinstance(block, GenericList.CloseBlock):
                # parserState.NextGroup = cls(parserState.LastGroup, parserState.BlockMarker, block)
                parserState.Pop()
                parserState.ReIssue = True
                return

        raise GroupParserException("End of generic not found.", block)
Ejemplo n.º 10
0
    def stateParse(cls, parserState: ParserState):
        currentBlock = parserState.Block

        if isinstance(currentBlock, PackageBody.NameBlock):
            return
        elif isinstance(currentBlock, PackageBody.EndBlock):
            parserState.NextGroup = cls(parserState.LastGroup,
                                        parserState.BlockMarker,
                                        parserState.Block)
            parserState.Pop()
            parserState.BlockMarker = None
            return
        elif isinstance(currentBlock, (LinebreakBlock, IndentationBlock)):
            parserState.PushState = WhitespaceGroup.stateParse
            parserState.NextGroup = WhitespaceGroup(parserState.LastGroup,
                                                    currentBlock)
            parserState.BlockMarker = currentBlock
            parserState.ReIssue = True
            return
        elif isinstance(currentBlock, CommentBlock):
            parserState.PushState = CommentGroup.stateParse
            parserState.NextGroup = CommentGroup(parserState.LastGroup,
                                                 currentBlock)
            parserState.BlockMarker = currentBlock
            parserState.ReIssue = True
            return
        else:
            for block in cls.DECLARATION_SIMPLE_BLOCKS:
                if isinstance(currentBlock, block):
                    group = cls.DECLARATION_SIMPLE_BLOCKS[block]
                    parserState.PushState = group.stateParse
                    parserState.BlockMarker = currentBlock
                    parserState.ReIssue = True
                    return

            for block in cls.DECLARATION_COMPOUND_BLOCKS:
                if isinstance(currentBlock, block):
                    group = cls.DECLARATION_COMPOUND_BLOCKS[block]
                    parserState.PushState = group.stateParse
                    parserState.NextGroup = group(parserState.LastGroup,
                                                  parserState.BlockMarker,
                                                  currentBlock)
                    parserState.BlockMarker = currentBlock
                    parserState.ReIssue = True
                    return

        if isinstance(currentBlock, EndOfDocumentBlock):
            parserState.NextGroup = EndOfDocumentGroup(currentBlock)
            return

        raise GroupParserException(
            "End of package body declaration not found.".format(
                block=currentBlock.__class__.__qualname__), currentBlock)
Ejemplo n.º 11
0
    def stateParseDeclarations(cls, parserState: ParserState):
        currentBlock = parserState.Block

        if isinstance(currentBlock, Entity.BeginBlock):
            parserState.NextState = cls.stateParseStatements
            return
        elif isinstance(currentBlock, Entity.EndBlock):
            parserState.NextGroup = cls(parserState.LastGroup,
                                        parserState.BlockMarker,
                                        parserState.Block)
            parserState.Pop()
            parserState.BlockMarker = None
            return
        elif isinstance(currentBlock, (LinebreakBlock, IndentationBlock)):
            parserState.PushState = WhitespaceGroup.stateParse
            parserState.NextGroup = WhitespaceGroup(parserState.LastGroup,
                                                    currentBlock)
            parserState.BlockMarker = currentBlock
            parserState.ReIssue = True
            return
        elif isinstance(currentBlock, CommentBlock):
            parserState.PushState = CommentGroup.stateParse
            parserState.NextGroup = CommentGroup(parserState.LastGroup,
                                                 currentBlock)
            parserState.BlockMarker = currentBlock
            parserState.ReIssue = True
            return
        else:
            for block in cls.DECLARATION_SIMPLE_BLOCKS:
                if isinstance(currentBlock, block):
                    group = cls.DECLARATION_SIMPLE_BLOCKS[block]
                    parserState.PushState = group.stateParse
                    parserState.BlockMarker = currentBlock
                    parserState.ReIssue = True
                    return

            for block in cls.DECLARATION_COMPOUND_BLOCKS:
                if isinstance(currentBlock, block):
                    group = cls.DECLARATION_COMPOUND_BLOCKS[block]
                    parserState.PushState = group.stateParse
                    parserState.BlockMarker = currentBlock
                    parserState.ReIssue = True
                    return

        if isinstance(currentBlock, EndOfDocumentBlock):
            parserState.NextGroup = EndOfDocumentGroup(currentBlock)
            return

        raise GroupParserException(
            "End of entity declarative region not found.", currentBlock)
Ejemplo n.º 12
0
	def stateParse(cls, parserState: ParserState):
		marker = parserState.Block
		if parserState.Block.MultiPart:
			for block in parserState.GetBlockIterator:
				if (isinstance(block, ReportBlock) and not block.MultiPart):
					marker2 = block
					break
			else:
				raise GroupParserException("End of multi parted constant declaration not found.", block)
		else:
			marker2 = marker

		parserState.NextGroup = cls(parserState.LastGroup, marker, marker2)
		parserState.Pop()
		return
Ejemplo n.º 13
0
    def __iter__(self):  # XXX: return type; iterator vs. generator
        block = self.StartBlock
        print("group={0}({1})  start={2!s}  end={3!s}".format(
            self.__class__.__name__, self.__class__.__module__,
            self.StartBlock.StartToken, self.EndBlock.EndToken))
        while (block is not self.EndBlock):
            yield block
            if (block.NextBlock is None):
                raise GroupParserException(
                    "Token after {0!r} <- {1!r} <- {2!r} is empty (None).".
                    format(block, block.PreviousToken,
                           block.PreviousToken.PreviousToken), block)
            block = block.NextBlock

        yield self.EndBlock
Ejemplo n.º 14
0
    def stateParseGenerics(cls, parserState: ParserState):
        currentBlock = parserState.Block

        if isinstance(currentBlock, GenericList.OpenBlock):
            parserState.NextState = cls.stateParseParameters
            parserState.PushState = GenericListGroup.stateParse
            parserState.NextGroup = GenericListGroup(parserState.LastGroup,
                                                     currentBlock)
            parserState.BlockMarker = currentBlock
            parserState.ReIssue = True
            return
        elif isinstance(currentBlock, ParameterList.OpenBlock):
            parserState.NextState = cls.stateParseDeclarations
            parserState.PushState = ParameterListGroup.stateParse
            parserState.NextGroup = ParameterListGroup(parserState.LastGroup,
                                                       currentBlock)
            parserState.BlockMarker = currentBlock
            parserState.ReIssue = True
            return
        elif isinstance(currentBlock, Function.ReturnTypeBlock):
            if isinstance(currentBlock.EndToken, EndToken):
                parserState.Pop()
            else:
                parserState.NextState = cls.stateParse2
                parserState.ReIssue = True
            return
        elif isinstance(currentBlock, (LinebreakBlock, IndentationBlock)):
            parserState.PushState = WhitespaceGroup.stateParse
            parserState.NextGroup = WhitespaceGroup(parserState.LastGroup,
                                                    currentBlock)
            parserState.BlockMarker = currentBlock
            parserState.ReIssue = True
            return
        elif isinstance(currentBlock, CommentBlock):
            parserState.PushState = CommentGroup.stateParse
            parserState.NextGroup = CommentGroup(parserState.LastGroup,
                                                 currentBlock)
            parserState.BlockMarker = currentBlock
            parserState.ReIssue = True
            return

        if isinstance(currentBlock, EndOfDocumentBlock):
            parserState.NextGroup = EndOfDocumentGroup(currentBlock)
            return

        raise GroupParserException("End of generic clause not found.",
                                   currentBlock)
Ejemplo n.º 15
0
    def stateParseDeclarations(cls, parserState: ParserState):
        currentBlock = parserState.Block

        if isinstance(currentBlock, Architecture.BeginBlock):
            parserState.NextState = cls.stateParseStatements
            return
        elif isinstance(currentBlock, (LinebreakBlock, IndentationBlock)):
            parserState.PushState = WhitespaceGroup.stateParse
            parserState.NextGroup = WhitespaceGroup(parserState.LastGroup,
                                                    currentBlock)
            parserState.BlockMarker = currentBlock
            parserState.ReIssue = True
            return
        elif isinstance(currentBlock, CommentBlock):
            parserState.PushState = CommentGroup.stateParse
            parserState.NextGroup = CommentGroup(parserState.LastGroup,
                                                 currentBlock)
            parserState.BlockMarker = currentBlock
            parserState.ReIssue = True
            return
        else:
            for block in cls.DECLARATION_SIMPLE_BLOCKS:
                if isinstance(currentBlock, block):
                    group = cls.DECLARATION_SIMPLE_BLOCKS[block]
                    parserState.PushState = group.stateParse
                    parserState.BlockMarker = currentBlock
                    parserState.ReIssue = True
                    return

            for block in cls.DECLARATION_COMPOUND_BLOCKS:
                if isinstance(currentBlock, block):
                    group = cls.DECLARATION_COMPOUND_BLOCKS[block]
                    parserState.PushState = group.stateParse
                    parserState.BlockMarker = currentBlock
                    parserState.ReIssue = True
                    return

        if isinstance(currentBlock, EndOfDocumentBlock):
            parserState.NextGroup = EndOfDocumentGroup(currentBlock)
            return

        raise GroupParserException(
            "End of architecture declaration not found.".format(
                block=currentBlock.__class__.__qualname__), currentBlock)
Ejemplo n.º 16
0
    def stateParseStatements(cls, parserState: ParserState):
        currentBlock = parserState.Block

        if isinstance(currentBlock, Function.EndBlock):
            # parserState.NextGroup =   cls(parserState.LastGroup, parserState.BlockMarker, parserState.Block)
            parserState.Pop()
            return
        elif isinstance(currentBlock, (LinebreakBlock, IndentationBlock)):
            parserState.PushState = WhitespaceGroup.stateParse
            parserState.NextGroup = WhitespaceGroup(parserState.LastGroup,
                                                    currentBlock)
            parserState.BlockMarker = currentBlock
            parserState.ReIssue = True
            return
        elif isinstance(currentBlock, CommentBlock):
            parserState.PushState = CommentGroup.stateParse
            parserState.NextGroup = CommentGroup(parserState.LastGroup,
                                                 currentBlock)
            parserState.BlockMarker = currentBlock
            parserState.ReIssue = True
            return
        else:
            for block in cls.STATEMENT_SIMPLE_BLOCKS:
                if isinstance(currentBlock, block):
                    group = cls.STATEMENT_SIMPLE_BLOCKS[block]
                    parserState.PushState = group.stateParse
                    parserState.BlockMarker = currentBlock
                    parserState.ReIssue = True
                    return

            for block in cls.STATEMENT_COMPOUND_BLOCKS:
                if isinstance(currentBlock, block):
                    group = cls.STATEMENT_COMPOUND_BLOCKS[block]
                    parserState.PushState = group.stateParse
                    parserState.BlockMarker = currentBlock
                    parserState.ReIssue = True
                    return

        if isinstance(currentBlock, EndOfDocumentBlock):
            parserState.NextGroup = EndOfDocumentGroup(currentBlock)
            return

        raise GroupParserException("End of function declaration not found.",
                                   currentBlock)
Ejemplo n.º 17
0
    def stateParse(cls, parserState: ParserState):
        currentBlock = parserState.Block

        if isinstance(currentBlock, Context.NameBlock):
            parserState.NextGroup = cls(parserState.LastGroup, currentBlock)
            parserState.BlockMarker = currentBlock
            #parserState.NextState =   cls.stateParseGenerics
            return
        elif isinstance(currentBlock, Context.EndBlock):
            #parserState.NextGroup =   cls(parserState.LastGroup, parserState.BlockMarker, parserState.Block)
            #parserState.Pop()
            #parserState.BlockMarker = None
            return
        elif isinstance(currentBlock, (LinebreakBlock, IndentationBlock)):
            parserState.PushState = WhitespaceGroup.stateParse
            parserState.NextGroup = WhitespaceGroup(parserState.LastGroup,
                                                    currentBlock)
            parserState.BlockMarker = currentBlock
            parserState.ReIssue = True
            return
        elif isinstance(currentBlock, CommentBlock):
            parserState.PushState = CommentGroup.stateParse
            parserState.NextGroup = CommentGroup(parserState.LastGroup,
                                                 currentBlock)
            parserState.BlockMarker = currentBlock
            parserState.ReIssue = True
            return
        else:
            for block in cls.SIMPLE_BLOCKS:
                if isinstance(currentBlock, block):
                    group = cls.SIMPLE_BLOCKS[block]
                    parserState.PushState = group.stateParse
                    parserState.BlockMarker = currentBlock
                    parserState.ReIssue = True
                    return

        if isinstance(currentBlock, EndOfDocumentBlock):
            parserState.NextGroup = EndOfDocumentGroup(currentBlock)
            return

        raise GroupParserException(
            "End of context declaration not found.".format(
                block=currentBlock.__class__.__qualname__), currentBlock)
Ejemplo n.º 18
0
    def Pop(self, n: int = 1):
        self.NewGroup = self.NextGroup

        top = None
        for i in range(n):
            top = self._stack.pop()
        self.NextState = top[0]
        self._blockMarker = top[1]
        self.NextGroup = top[2]
        # print("{MAGENTA}appending {0!s} to {1!s}{NOCOLOR}".format(self.NewGroup.__class__.__qualname__, self.NextGroup.__class__,**Console.Foreground))
        if (self.NextGroup.InnerGroup is None):
            self.NextGroup.InnerGroup = self.NewGroup
        if (self.NewGroup.__class__ not in self.NextGroup._subGroups):
            raise GroupParserException(
                "Group '{group1}' not supported in {group2}.".format(
                    group1=self.NewGroup.__class__,
                    group2=self.NextGroup.__class__.__qualname__), self.Block)

        self.NextGroup._subGroups[self.NewGroup.__class__].append(
            self.NewGroup)
Ejemplo n.º 19
0
    def __init__(self, blockGenerator: Generator[Block, Any, None]):
        """Initializes the parser state."""

        self._iterator = iter(BlockIterator(
            self, blockGenerator))  # XXX: review iterator vs. generator
        self._stack = []
        self._blockMarker = None

        startBlock = next(self._iterator)
        startGroup = StartOfDocumentGroup(startBlock)

        if (not isinstance(startBlock, StartOfDocumentBlock)):
            raise GroupParserException(
                "First block is not a StartOfDocumentBlock.", startBlock)

        self.Block = None
        self.NextState = StartOfDocumentGroup.stateDocument
        self.ReIssue = False
        self.NewBlock = None
        self.NewGroup = None
        self.LastGroup = None
        self.NextGroup = startGroup
Ejemplo n.º 20
0
    def stateParse(cls, parserState: ParserState):
        currentBlock = parserState.Block

        if isinstance(currentBlock, GenericList.OpenBlock):
            return
        elif isinstance(
                currentBlock,
                pyVHDLParser.Blocks.InterfaceObject.InterfaceConstantBlock):
            parserState.PushState = GenericListItemGroup.stateParse
            parserState.NextGroup = GenericListItemGroup(
                parserState.LastGroup, currentBlock)
            parserState.BlockMarker = currentBlock
            parserState.ReIssue = True
            return
        elif isinstance(currentBlock, GenericList.CloseBlock):
            parserState.Pop()
            return
        elif isinstance(currentBlock, (LinebreakBlock, IndentationBlock)):
            parserState.PushState = WhitespaceGroup.stateParse
            parserState.NextGroup = WhitespaceGroup(parserState.LastGroup,
                                                    currentBlock)
            parserState.BlockMarker = currentBlock
            parserState.ReIssue = True
            return
        elif isinstance(currentBlock, CommentBlock):
            parserState.PushState = CommentGroup.stateParse
            parserState.NextGroup = CommentGroup(parserState.LastGroup,
                                                 currentBlock)
            parserState.BlockMarker = currentBlock
            parserState.ReIssue = True
            return

        if isinstance(currentBlock, EndOfDocumentBlock):
            parserState.NextGroup = EndOfDocumentGroup(currentBlock)
            return

        raise GroupParserException("End of generic list not found.",
                                   currentBlock)
Ejemplo n.º 21
0
    def GetGenerator(self):  # XXX: return type
        from pyVHDLParser.Groups import GroupParserException

        # yield StartOfDocumentGroup
        self.LastGroup = self.NextGroup
        yield self.LastGroup

        for block in self._iterator:
            # an empty marker means: set on next yield run
            if (self._blockMarker is None):
                # if self.debug: print("  new block marker: None -> {0!s}".format(block))
                self._blockMarker = block

            # if self.debug: print("{MAGENTA}------ iteration end ------{NOCOLOR}".format(**Console.Foreground))
            # execute a state and reissue execution if needed
            self.ReIssue = True
            while self.ReIssue:
                self.ReIssue = False
                LineTerminal().WriteDryRun(
                    "{DARK_GRAY}reissue state={state!s: <50}  block={block!s: <40}     {NOCOLOR}"
                    .format(state=self,
                            block=self.Block,
                            **LineTerminal.Foreground))
                self.NextState(self)

                # yield a new group
                if (self.NewGroup is not None):
                    yield self.NewGroup
                    self.LastGroup = self.NewGroup
                    self.NewGroup = None

                    if (isinstance(self.Block, EndOfDocumentBlock) and
                            isinstance(self.LastGroup, EndOfDocumentGroup)):
                        return

        else:
            raise GroupParserException("Unexpected end of document.",
                                       self.Block)
Ejemplo n.º 22
0
    def stateDocument(cls, parserState: ParserState):
        from pyVHDLParser.Groups.DesignUnit import ContextGroup, EntityGroup, ArchitectureGroup, PackageGroup, PackageBodyGroup, ConfigurationGroup
        from pyVHDLParser.Groups.Reference import LibraryGroup, UseGroup
        from pyVHDLParser.Groups.Comment import CommentGroup, WhitespaceGroup

        SIMPLE_BLOCKS = {
            Library.StartBlock: LibraryGroup,
            Use.StartBlock: UseGroup
        }
        COMPOUND_BLOCKS = {
            Context.NameBlock: ContextGroup,
            Entity.NameBlock: EntityGroup,
            Architecture.NameBlock: ArchitectureGroup,
            Package.NameBlock: PackageGroup,
            PackageBody.NameBlock: PackageBodyGroup,
            Configuration.NameBlock: ConfigurationGroup
        }

        currentBlock = parserState.Block

        if isinstance(currentBlock, (LinebreakBlock, IndentationBlock)):
            parserState.PushState = WhitespaceGroup.stateParse
            parserState.NextGroup = WhitespaceGroup(parserState.LastGroup,
                                                    currentBlock)
            parserState.BlockMarker = currentBlock
            parserState.ReIssue = True
            return
        elif isinstance(currentBlock, CommentBlock):
            parserState.PushState = CommentGroup.stateParse
            parserState.NextGroup = CommentGroup(parserState.LastGroup,
                                                 currentBlock)
            parserState.BlockMarker = currentBlock
            parserState.ReIssue = True
            return
        else:
            for blk in SIMPLE_BLOCKS:
                if isinstance(currentBlock, blk):
                    group = SIMPLE_BLOCKS[blk]
                    parserState.PushState = group.stateParse
                    parserState.NextGroup = group(parserState.LastGroup,
                                                  currentBlock)
                    parserState.BlockMarker = currentBlock
                    parserState.ReIssue = True
                    return

            for blk in COMPOUND_BLOCKS:
                if isinstance(currentBlock, blk):
                    group = COMPOUND_BLOCKS[blk]
                    parserState.PushState = group.stateParse
                    parserState.NextGroup = group(parserState.LastGroup,
                                                  currentBlock)
                    parserState.BlockMarker = currentBlock
                    parserState.ReIssue = True
                    return

            if isinstance(currentBlock, EndOfDocumentBlock):
                parserState.NewGroup = EndOfDocumentGroup(currentBlock)
                return

        raise GroupParserException(
            "Expected keywords: architecture, context, entity, library, package, use. Found '{block!s}'."
            .format(block=currentBlock.__class__.__qualname__), currentBlock)