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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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
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
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)
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)
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)
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)
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)
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)