Beispiel #1
0
    def stateParseParameters(cls, parserState: ParserState):
        currentBlock = parserState.Block

        if isinstance(currentBlock, GenericList.OpenBlock):
            parserState.NextState = cls.stateParse2
            parserState.PushState = ParameterListGroup.stateParse
            parserState.NextGroup = ParameterListGroup(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 BlockParserException("End of parameters not found.",
                                   currentBlock)
Beispiel #2
0
    def stateParseSensitivityList(cls, parserState: ParserState):
        currentBlock = parserState.Block

        if isinstance(currentBlock, SensitivityList.OpenBlock):
            parserState.NextState = cls.stateParseDeclarations
            parserState.PushState = SensitivityListGroup.stateParse
            parserState.NextGroup = SensitivityListGroup(
                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 BlockParserException(
            "End of process sensitivity list not found.", currentBlock)
Beispiel #3
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 BlockParserException("End of generic list not found.",
                                   currentBlock)
Beispiel #4
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 BlockParserException(
            "End of architecture declaration not found.".format(
                block=currentBlock.__class__.__qualname__), currentBlock)
Beispiel #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 BlockParserException("End of library clause not found.", block)
Beispiel #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 BlockParserException("End of library clause not found.", block)
Beispiel #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 BlockParserException("Begin of procedure expected.", currentBlock)
Beispiel #8
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 BlockParserException("End of generic not found.", block)
Beispiel #9
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 BlockParserException("Begin of process expected.",
                                       currentBlock)
Beispiel #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 BlockParserException(
            "End of package body declaration not found.".format(
                block=currentBlock.__class__.__qualname__), currentBlock)
Beispiel #11
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 BlockParserException("End of library clause not found.", block)
Beispiel #12
0
    def stateParseDeclarations(cls, parserState: ParserState):
        currentBlock = parserState.Block

        if isinstance(currentBlock, Function.BeginBlock):
            parserState.NextState = cls.stateParseStatements
            return
        elif isinstance(currentBlock, Function.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 BlockParserException(
            "End of function declarative region not found.", currentBlock)
Beispiel #13
0
    def __iter__(self):
        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 BlockParserException(
                    "Token after {0!r} <- {1!r} <- {2!r} is None.".format(
                        block, block.PreviousToken,
                        block.PreviousToken.PreviousToken), block)
            block = block.NextBlock

        yield self.EndBlock
Beispiel #14
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 BlockParserException("End of multi parted constant declaration not found.", block)
		else:
			marker2 = marker

		parserState.NextGroup = cls(parserState.LastGroup, marker, marker2)
		parserState.Pop()
		return
Beispiel #15
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 BlockParserException("End of generic clause not found.",
                                   currentBlock)
Beispiel #16
0
    def __init__(self, blockGenerator, debug):
        self.NextState = StartOfDocumentGroup.stateDocument
        self.ReIssue = False
        self.Block: Block = None
        self.NewBlock: Block = None
        self.LastGroup: Group = None

        self._stack = []
        self._iterator = iter(_BlockIterator(self, blockGenerator))
        self._blockMarker: Block = None
        self.NextGroup: Group = StartOfDocumentGroup(next(self._iterator))
        self.NewGroup: Group = None

        self.debug: bool = debug

        if (not isinstance(self.NextGroup.StartBlock, StartOfDocumentBlock)):
            raise BlockParserException(
                "First block is not a StartOfDocumentBlock.",
                self.NextGroup.StartBlock)
Beispiel #17
0
    def Pop(self, n=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 BlockParserException(
                "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)
Beispiel #18
0
    def GetGenerator(self):
        from pyVHDLParser.Groups import BlockParserException

        # 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
                if self.debug:
                    print(
                        "{DARK_GRAY}state={state!s: <50}  block={block!s: <40}     {NOCOLOR}"
                        .format(state=self,
                                block=self.Block,
                                **Console.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 BlockParserException("Unexpected end of document.",
                                       self.Block)
Beispiel #19
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 BlockParserException("End of generic list not found.",
                                   currentBlock)
Beispiel #20
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 BlockParserException(
            "Expected keywords: architecture, context, entity, library, package, use. Found '{block!s}'."
            .format(block=currentBlock.__class__.__qualname__), currentBlock)