def stateParse(cls, document, group): # iterate blocks to find the contexts name for block in group: if isinstance(block, ContextBlocks.NameBlock): for token in block: if isinstance(token, IdentifierToken): contextName = token.Value break else: raise BlockParserException( "ContextName not found.", None) # FIXME: change to DOMParserException if (len(document.Libraries) != 0): raise BlockParserException( "A context (library statements) is not allowed for a context declaration.", None) # FIXME: change to DOMParserException if (len(document.PackageReferences) != 0): raise BlockParserException( "A context (use statements) is not allowed for a context declaration.", None) # FIXME: change to DOMParserException context = cls(contextName) print( "Found context '{name}'. Adding to current node '{node!s}'." .format(name=contextName, node=document)) document.AddContext(context) break subGroupIterator = iter(group.GetSubGroups())
def stateParseArchitectureName( cls, parserState: ParserState): #document, group): assert isinstance(parserState.CurrentGroup, ArchitectureBlock.NameBlock) tokenIterator = iter(parserState) # iterate architetures NameBlock to find the architecture name for token in tokenIterator: if isinstance(token, IdentifierToken): architectureName = token.Value break else: raise BlockParserException( "", None) # FIXME: change to DOMParserException for token in tokenIterator: if isinstance(token, IdentifierToken): entityName = token.Value break else: raise BlockParserException( "", None) # FIXME: change to DOMParserException oldNode = parserState.CurrentNode architecture = cls(architectureName, entityName) parserState.CurrentNode.AddArchitecture(architecture) parserState.CurrentNode = architecture parserState.CurrentNode.AddLibraryReferences(oldNode.Libraries) parserState.CurrentNode.AddUses(oldNode.PackageReferences) oldNode.Libraries.clear() oldNode.PackageReferences.clear()
def stateParse(cls, document, group): assert isinstance(group, PackageBlock.NameBlock) cls.stateParsePackageName(parserState) for block in group: if isinstance(block, GenericListBlocks.OpenBlock): parserState.PushState = cls.stateParseGenericList parserState.ReIssue() elif isinstance(block, ConstantBlock): parserState.PushState = Constant.stateParse parserState.ReIssue() elif isinstance(block, FunctionBlock.NameBlock): parserState.PushState = Function.stateParse parserState.ReIssue() elif isinstance(block, PackageBlock.EndBlock): break else: raise BlockParserException( "Block '{0!r}' not supported in a package.".format(block), block) # FIXME: change to DOMParserException else: raise BlockParserException( "", None) # FIXME: change to DOMParserException parserState.Pop()
def stateParseArchitectureName(cls, document, group): assert isinstance(parserState.CurrentGroup, ArchitectureBlock.NameBlock) tokenIterator = iter(parserState) for token in tokenIterator: if isinstance(token, IdentifierToken): architectureName = token.Value break else: raise BlockParserException("", None) for token in tokenIterator: if isinstance(token, IdentifierToken): entityName = token.Value break else: raise BlockParserException("", None) oldNode = parserState.CurrentNode architecture = cls(architectureName, entityName) parserState.CurrentNode.AddArchitecture(architecture) parserState.CurrentNode = architecture parserState.CurrentNode.AddLibraryReferences(oldNode.Libraries) parserState.CurrentNode.AddUses(oldNode.Uses) oldNode.Libraries.clear() oldNode.Uses.clear()
def stateParse(cls, document, group): assert isinstance(parserState.CurrentGroup, PackageBodyBlock.NameBlock) cls.stateParsePackageBodyName(parserState) for block in parserState.GroupIterator: if isinstance(block, GenericListBlocks.OpenBlock): parserState.PushState = cls.stateParseGenericList parserState.ReIssue() elif isinstance(block, PortListBlocks.OpenBlock): parserState.PushState = cls.stateParsePortList parserState.ReIssue() elif isinstance(block, ConstantBlock): parserState.PushState = Constant.stateParse parserState.ReIssue() elif isinstance(block, Function.BeginBlock): parserState.PushState = Function.stateParse parserState.ReIssue() elif isinstance(block, PackageBodyBlock.EndBlock): break else: raise BlockParserException( "Block '{0!r}' not supported in a package body.".format( block), block) else: raise BlockParserException("", None) parserState.Pop()
def stateExpression(cls, parserState: ParserState): token = parserState.Token if isinstance(token, FusedCharacterToken): parserState.NewToken = cls.FUSED_CHARACTER_TRANSLATION[token.Value](token) return elif isinstance(token, CharacterToken): if (token == ";"): if (parserState.Counter == 0): parserState.NewToken = EndToken(token) parserState.NewBlock = cls(parserState.LastBlock, parserState.TokenMarker, endToken=parserState.NewToken.PreviousToken) _ = cls.END_BLOCK(parserState.NewBlock, parserState.NewToken, endToken=parserState.NewToken) parserState.Pop(2) return else: raise BlockParserException("Mismatch in opening and closing parenthesis. Counter={0}".format(parserState.Counter), token) elif (token == "("): parserState.NewToken = OpeningRoundBracketToken(token) parserState.Counter += 1 return elif (token == ")"): if (parserState.Counter == -1): raise BlockParserException("Mismatch in opening and closing parenthesis. Counter={0}".format(parserState.Counter), token) else: parserState.NewToken = ClosingRoundBracketToken(token) parserState.Counter -= 1 return else: parserState.NewToken = cls.CHARACTER_TRANSLATION[token.Value](token) return elif isinstance(token, WordToken): try: parserState.NewToken = cls.OPERATOR_TRANSLATIONS[token.Value](token) except KeyError: parserState.NewToken = IdentifierToken(token) return elif isinstance(token, LiteralToken): return elif isinstance(token, SpaceToken): parserState.NextState = cls.stateWhitespace1 return elif isinstance(token, (LinebreakToken, CommentToken)): block = LinebreakBlock if isinstance(token, LinebreakToken) else CommentBlock parserState.NewBlock = cls(parserState.LastBlock, parserState.TokenMarker, endToken=token.PreviousToken, multiPart=True) _ = block(parserState.NewBlock, token) parserState.TokenMarker = None parserState.NextState = cls.stateWhitespace1 return raise BlockParserException("Expected operator, '(', ')', ';' or whitespace.", token)
def stateDeclarativeRegion(cls, parserState: ParserState): errorMessage = "Expected one of these keywords: generic, port, begin, end." token = parserState.Token if isinstance(parserState.Token, CharacterToken): if (token == "\n"): parserState.NewToken = LinebreakToken(token) parserState.NewBlock = LinebreakBlock(parserState.LastBlock, parserState.NewToken) parserState.TokenMarker = parserState.NewToken return elif (token == "-"): parserState.PushState = SingleLineCommentBlock.statePossibleCommentStart parserState.TokenMarker = token return elif (token == "/"): parserState.PushState = MultiLineCommentBlock.statePossibleCommentStart parserState.TokenMarker = token return elif isinstance(token, SpaceToken): parserState.NewToken = IndentationToken(token) parserState.NewBlock = IndentationBlock(parserState.LastBlock, parserState.NewToken) return elif isinstance(token, WordToken): keyword = token.Value.lower() if (keyword == "generic"): newToken = GenericKeyword(token) parserState.PushState = GenericList.OpenBlock.stateGenericKeyword elif (keyword == "port"): newToken = PortKeyword(token) parserState.PushState = PortList.OpenBlock.statePortKeyword elif (keyword == "end"): newToken = EndKeyword(token) parserState.NextState = EndGenerateBlock.stateEndKeyword elif (keyword == "begin"): parserState.NewToken = BeginKeyword(token) parserState.NewBlock = BeginBlock(parserState.LastBlock, parserState.NewToken) parserState.NextState = BeginBlock.stateBeginKeyword return else: raise BlockParserException(errorMessage, token) parserState.NewToken = newToken parserState.TokenMarker = newToken return raise BlockParserException(errorMessage, token)
def stateWhitespace1(cls, parserState: ParserState): token = parserState.Token errorMessage = "Expected '(' after keyword GENERIC." if isinstance(token, CharacterToken): if (token == "("): parserState.NewToken = BoundaryToken(token) parserState.NewBlock = OpenBlock(parserState.LastBlock, parserState.TokenMarker, endToken=parserState.NewToken) parserState.NextState = CloseBlock.stateClosingParenthesis parserState.PushState = OpenBlock.stateOpeningParenthesis parserState.Counter = 1 return elif (token == "\n"): parserState.NewToken = LinebreakToken(token) if (not isinstance(parserState.LastBlock, MultiLineCommentBlock)): parserState.NewBlock = OpenBlock( parserState.LastBlock, parserState.TokenMarker, endToken=parserState.NewToken.PreviousToken, multiPart=True) _ = LinebreakBlock(parserState.NewBlock, parserState.NewToken) else: parserState.NewBlock = LinebreakBlock( parserState.LastBlock, parserState.NewToken) parserState.TokenMarker = None parserState.NextState = cls.stateWhitespace1 parserState.PushState = LinebreakBlock.stateLinebreak return elif (token == "-"): parserState.NewBlock = OpenBlock(parserState.LastBlock, parserState.TokenMarker, endToken=token.PreviousToken, multiPart=True) parserState.TokenMarker = None parserState.NextState = cls.stateWhitespace1 parserState.PushState = SingleLineCommentBlock.statePossibleCommentStart parserState.TokenMarker = token return elif (token == "/"): parserState.NewBlock = OpenBlock(parserState.LastBlock, parserState.TokenMarker, endToken=token.PreviousToken, multiPart=True) parserState.TokenMarker = None parserState.NextState = cls.stateWhitespace1 parserState.PushState = MultiLineCommentBlock.statePossibleCommentStart parserState.TokenMarker = token return elif (isinstance(token, SpaceToken) and isinstance(parserState.LastBlock, MultiLineCommentBlock)): parserState.NewToken = BoundaryToken(token) parserState.NewBlock = WhitespaceBlock(parserState.LastBlock, parserState.NewToken) parserState.TokenMarker = None return raise BlockParserException(errorMessage, token)
def stateItemRemainder(cls, parserState: ParserState): token = parserState.Token if isinstance(token, CharacterToken): if (token == "("): parserState.NewToken = OpeningRoundBracketToken(token) parserState.Counter += 1 elif (token == ")"): parserState.Counter -= 1 if (parserState.Counter == 0): parserState.NewToken = BoundaryToken(token) parserState.NewBlock = ItemBlock( parserState.LastBlock, parserState.TokenMarker, endToken=parserState.NewToken.PreviousToken) parserState.Pop() parserState.TokenMarker = parserState.NewToken else: parserState.NewToken = ClosingRoundBracketToken(token) elif (token == ";"): if (parserState.Counter == 1): parserState.NewToken = DelimiterToken(token) parserState.NewBlock = ItemBlock( parserState.LastBlock, parserState.TokenMarker, endToken=parserState.NewToken.PreviousToken) _ = DelimiterBlock(parserState.NewBlock, parserState.NewToken) parserState.NextState = DelimiterBlock.stateItemDelimiter else: raise BlockParserException( "Mismatch in opening and closing parenthesis: open={0}" .format(parserState.Counter), token)
def stateWhitespace1(cls, parserState: ParserState): token = parserState.Token if isinstance(token, WordToken): parserState.NewToken = IdentifierToken(token) parserState.TokenMarker = parserState.NewToken parserState.NextState = ReferenceNameBlock.stateLibraryName return elif isinstance(token, ExtendedIdentifier): parserState.NextState = ReferenceNameBlock.stateLibraryName return elif isinstance(token, (LinebreakToken, CommentToken)): block = LinebreakBlock if isinstance( token, LinebreakToken) else CommentBlock parserState.NewBlock = block(parserState.LastBlock, token) parserState.TokenMarker = None return elif (isinstance(token, IndentationToken) and isinstance(token.PreviousToken, (LinebreakToken, SingleLineCommentToken))): return elif (isinstance(token, SpaceToken) and (isinstance(parserState.LastBlock, CommentBlock) and isinstance( parserState.LastBlock.StartToken, MultiLineCommentToken))): parserState.NewToken = BoundaryToken(token) parserState.NewBlock = WhitespaceBlock(parserState.LastBlock, parserState.NewToken) parserState.TokenMarker = None return raise BlockParserException("Expected library name (identifier).", token)
def stateObjectName(cls, parserState: ParserState): token = parserState.Token if (isinstance(token, CharacterToken) and (token == ":")): parserState.NewToken = BoundaryToken(token) parserState.NextState = cls.stateColon1 return elif isinstance(token, SpaceToken): parserState.NewToken = BoundaryToken(token) parserState.NextState = cls.stateWhitespace2 return elif isinstance(token, (LinebreakToken, CommentToken)): block = LinebreakBlock if isinstance( token, LinebreakToken) else CommentBlock parserState.NewBlock = cls(parserState.LastBlock, parserState.TokenMarker, endToken=token.PreviousToken, multiPart=True) _ = block(parserState.NewBlock, token) parserState.TokenMarker = None parserState.NextState = cls.stateWhitespace2 return raise BlockParserException( "Expected ':' or whitespace after {0} name.".format( cls.OBJECT_KIND), token)
def stateWhitespace2(cls, parserState: ParserState): token = parserState.Token if (isinstance(token, CharacterToken) and (token == ":")): parserState.NewToken = BoundaryToken(token) parserState.NextState = cls.stateColon1 return elif isinstance(token, LinebreakToken): if (not (isinstance(parserState.LastBlock, CommentBlock) and isinstance(parserState.LastBlock.StartToken, MultiLineCommentToken))): parserState.NewBlock = cls(parserState.LastBlock, parserState.TokenMarker, endToken=token.PreviousToken, multiPart=True) _ = LinebreakBlock(parserState.NewBlock, token) else: parserState.NewBlock = LinebreakBlock(parserState.LastBlock, token) parserState.TokenMarker = None return elif isinstance(token, CommentToken): parserState.NewBlock = CommentBlock(parserState.LastBlock, token) parserState.TokenMarker = None return elif (isinstance(token, SpaceToken) and (isinstance(parserState.LastBlock, CommentBlock) and isinstance( parserState.LastBlock.StartToken, MultiLineCommentToken))): parserState.NewToken = BoundaryToken(token) parserState.NewBlock = WhitespaceBlock(parserState.LastBlock, parserState.NewToken) parserState.TokenMarker = None return raise BlockParserException( "Expected colon after {0} name.".format(cls.OBJECT_KIND), token)
def stateAllKeyword(cls, parserState: ParserState): token = parserState.Token if (isinstance(token, CharacterToken) and (token == ")")): parserState.NewToken = BoundaryToken(token) parserState.NewBlock = CloseBlock(parserState.LastBlock, parserState.NewToken, endToken=parserState.NewToken) parserState.Pop() return elif isinstance(token, SpaceToken): parserState.NextState = cls.stateWhitespace1 return elif isinstance(token, (LinebreakToken, CommentToken)): block = LinebreakBlock if isinstance( token, LinebreakToken) else CommentBlock parserState.NewBlock = cls(parserState.LastBlock, parserState.TokenMarker, endToken=token.PreviousToken, multiPart=True) _ = block(parserState.NewBlock, token) parserState.TokenMarker = None parserState.NextState = cls.stateWhitespace1 return raise BlockParserException( "Expected ')' or whitespace after keyword ALL.", token)
def stateItemDelimiter(cls, parserState: ParserState): token = parserState.Token if isinstance(token, WordToken): parserState.NewToken = IdentifierToken(token) parserState.TokenMarker = parserState.NewToken parserState.NextState = ItemBlock.stateItemRemainder return elif isinstance(token, ExtendedIdentifier): parserState.NextState = ItemBlock.stateItemRemainder return elif isinstance(token, SpaceToken): parserState.NextState = OpenBlock.stateOpeningParenthesis return elif isinstance(token, LinebreakToken): parserState.NewBlock = LinebreakBlock(parserState.LastBlock, token) parserState.TokenMarker = token parserState.NextState = OpenBlock.stateOpeningParenthesis return elif isinstance(token, CommentToken): parserState.NewBlock = cls(parserState.LastBlock, parserState.TokenMarker, endToken=token.PreviousToken, multiPart=True) _ = CommentBlock(parserState.NewBlock, token) parserState.TokenMarker = None return raise BlockParserException("Expected signal name (identifier).", token)
def stateWhitespace1(cls, parserState: ParserState): token = parserState.Token if isinstance(token, WordToken): if (token <= "body"): parserState.NewToken = BodyKeyword(token) parserState.NextState = PackageBody.NameBlock.stateBodyKeyword return else: parserState.NewToken = IdentifierToken(token) parserState.NextState = cls.statePackageName return elif isinstance(token, LinebreakToken): if (not (isinstance(parserState.LastBlock, CommentBlock) and isinstance(parserState.LastBlock.StartToken, MultiLineCommentToken))): parserState.NewBlock = cls(parserState.LastBlock, parserState.TokenMarker, endToken=token.PreviousToken, multiPart=True) _ = LinebreakBlock(parserState.NewBlock, token) else: parserState.NewBlock = LinebreakBlock(parserState.LastBlock, token) parserState.TokenMarker = None return elif isinstance(token, CommentToken): parserState.NewBlock = cls(parserState.LastBlock, parserState.TokenMarker, endToken=token.PreviousToken, multiPart=True) _ = CommentBlock(parserState.NewBlock, token) parserState.TokenMarker = None return elif (isinstance(token, SpaceToken) and (isinstance(parserState.LastBlock, CommentBlock) and isinstance(parserState.LastBlock.StartToken, MultiLineCommentToken))): parserState.NewToken = BoundaryToken(token) parserState.NewBlock = WhitespaceBlock(parserState.LastBlock, parserState.NewToken) parserState.TokenMarker = None return raise BlockParserException("Expected package name (identifier).", token)
def stateWhitespace1(cls, parserState: ParserState): token = parserState.Token if (isinstance(token, CharacterToken) and (token == ";")): parserState.NewToken = EndToken(token) parserState.NewBlock = cls(parserState.LastBlock, parserState.TokenMarker, endToken=parserState.NewToken) parserState.Pop() return elif isinstance(token, (LinebreakToken, CommentToken)): block = LinebreakBlock if isinstance( token, LinebreakToken) else CommentBlock parserState.NewBlock = block(parserState.LastBlock, token) parserState.TokenMarker = None return elif (isinstance(token, IndentationToken) and isinstance(token.PreviousToken, (LinebreakToken, SingleLineCommentToken))): return elif (isinstance(token, SpaceToken) and (isinstance(parserState.LastBlock, CommentBlock) and isinstance( parserState.LastBlock.StartToken, MultiLineCommentToken))): parserState.NewToken = BoundaryToken(token) parserState.NewBlock = WhitespaceBlock(parserState.LastBlock, parserState.NewToken) parserState.TokenMarker = None return raise BlockParserException("Expected ';'.", token)
def stateParse(cls, parserState: ParserState): #document, group): for block in parserState.CurrentGroup: if isinstance(block, EntityBlocks.NameBlock): for token in block: if isinstance(token, IdentifierToken): entityName = token.Value break else: raise BlockParserException( "EntityName not found.", None) # FIXME: change to DOMParserException entity = cls(entityName) entity.AddLibraryReferences(document.Libraries) entity.AddUses(document.PackageReferences) print("Found library '{0}'. Adding to current node '{1!s}'.". format(entityName, document)) document.AddEntity(entity) break subGroupIterator = iter(parserState.CurrentGroup.GetSubGroups()) subGroup = next(subGroupIterator) if isinstance(subGroup, GenericListGroup): cls.stateParseGenericList(document, subGroup) subGroup = next(subGroupIterator) if isinstance(subGroup, PortListGroup): cls.stateParsePortList(document, subGroup) subGroup = next(subGroupIterator)
def stateEndKeyword(cls, parserState: ParserState): token = parserState.Token if isinstance(token, CharacterToken): if ((cls.KEYWORD_IS_OPTIONAL is True) and (token == ";")): parserState.NewToken = EndToken(token) parserState.NewBlock = cls(parserState.LastBlock, parserState.TokenMarker, endToken=parserState.NewToken) parserState.Pop() return elif isinstance(token, SpaceToken): parserState.NewToken = BoundaryToken(token) parserState.NextState = cls.stateWhitespace1 return elif isinstance(token, LinebreakToken): parserState.NewBlock = cls(parserState.LastBlock, parserState.TokenMarker, endToken=token, multiPart=True) parserState.TokenMarker = None parserState.NextState = cls.stateWhitespace1 return elif isinstance(token, CommentToken): parserState.NewBlock = cls(parserState.LastBlock, parserState.TokenMarker, endToken=token.PreviousToken, multiPart=True) _ = CommentBlock(parserState.NewBlock, token) parserState.TokenMarker = None parserState.NextState = cls.stateWhitespace1 return raise BlockParserException("Expected ';' or whitespace.", token)
def StripAndFuse( generator: Generator[Block, Any, None]) -> Generator[Block, Any, None]: iterator = iter(generator) lastBlock = next(iterator) # don't filter the first block yield lastBlock for block in iterator: if isinstance(block, (IndentationBlock, CommentBlock, LinebreakBlock)): continue else: if (block.MultiPart == True): while True: nextBlock = next(iterator) if isinstance(nextBlock, (WhitespaceBlock, CommentBlock)): continue if (type(block) is not type(nextBlock)): raise BlockParserException( "Error in multipart blocks. {0} <-> {1}".format( type(block), type(nextBlock)), None) # TODO: review exception type nextBlock.StartToken.PreviousToken = block.EndToken block.EndToken = nextBlock.EndToken if (nextBlock.MultiPart == False): break block.PreviousBlock = lastBlock block.StartToken.PreviousToken = lastBlock.EndToken yield block lastBlock = block
def stateColon1(cls, parserState: ParserState): token = parserState.Token if isinstance(token, WordToken): try: parserState.NewToken = cls.MODES[token.Value.lower()](token) parserState.NextState = cls.stateModeKeyword return except KeyError: parserState.NewToken = IdentifierToken(token) parserState.NextState = cls.stateSubtypeIndication return elif isinstance(token, SpaceToken): parserState.NewToken = BoundaryToken(token) parserState.NextState = cls.stateWhitespace3 return elif isinstance(token, (LinebreakToken, CommentToken)): block = LinebreakBlock if isinstance( token, LinebreakToken) else CommentBlock parserState.NewBlock = cls(parserState.LastBlock, parserState.TokenMarker, endToken=token.PreviousToken, multiPart=True) _ = block(parserState.NewBlock, token) parserState.TokenMarker = None parserState.NextState = cls.stateWhitespace3 return raise BlockParserException( "Expected subtype indication or whitespace after colon.", token)
def stateWhitespace3(cls, parserState: ParserState): token = parserState.Token if isinstance(token, WordToken): parserState.NewToken = IdentifierToken(token) parserState.NextState = cls.stateSubtypeIndication return elif isinstance(token, LinebreakToken): if (not (isinstance(parserState.LastBlock, CommentBlock) and isinstance(parserState.LastBlock.StartToken, MultiLineCommentToken))): parserState.NewBlock = cls(parserState.LastBlock, parserState.TokenMarker, endToken=token.PreviousToken, multiPart=True) _ = LinebreakBlock(parserState.NewBlock, token) else: parserState.NewBlock = LinebreakBlock(parserState.LastBlock, token) parserState.TokenMarker = None return elif isinstance(token, CommentToken): parserState.NewBlock = CommentBlock(parserState.LastBlock, token) parserState.TokenMarker = None return elif (isinstance(token, SpaceToken) and (isinstance(parserState.LastBlock, CommentBlock) and isinstance( parserState.LastBlock.StartToken, MultiLineCommentToken))): parserState.NewToken = BoundaryToken(token) parserState.NewBlock = WhitespaceBlock(parserState.LastBlock, parserState.NewToken) parserState.TokenMarker = None return raise BlockParserException("Expected subtype indication after colon.", token)
def stateAfterParameterList(cls, parserState: ParserState): token = parserState.Token if (isinstance(token, CharacterToken) and (token == ";")): parserState.NewToken = EndToken(token) parserState.NewBlock = cls(parserState.LastBlock, parserState.TokenMarker, endToken=parserState.NewToken) parserState.Pop() return elif isinstance(token, WordToken): if (token <= "is"): parserState.NewToken = IsKeyword(token) parserState.NewBlock = VoidBlock(parserState.LastBlock, parserState.TokenMarker, parserState.NewToken) parserState.NextState = DeclarativeRegion.stateDeclarativeRegion return elif isinstance(token, SpaceToken): parserState.NewToken = BoundaryToken(token) parserState.NextState = cls.stateWhitespace1 return elif isinstance(token, (LinebreakToken, CommentToken)): block = LinebreakBlock if isinstance( token, LinebreakToken) else CommentBlock parserState.NewBlock = block(parserState.LastBlock, token) parserState.TokenMarker = None parserState.NextState = cls.stateWhitespace1 return raise BlockParserException("Expected keyword RETURN.", token)
def stateProcedureName(cls, parserState: ParserState): token = parserState.Token if (isinstance(token, CharacterToken) and (token == "(")): parserState.NewToken = BoundaryToken(token) parserState.NewBlock = cls( parserState.LastBlock, parserState.TokenMarker, endToken=parserState.NewToken.PreviousToken) _ = ParameterList.OpenBlock(parserState.NewBlock, parserState.NewToken) parserState.TokenMarker = None parserState.NextState = VoidBlock.stateAfterParameterList parserState.PushState = ParameterList.OpenBlock.stateOpeningParenthesis parserState.Counter = 1 return elif isinstance(token, SpaceToken): parserState.NewToken = BoundaryToken(token) parserState.NextState = cls.stateWhitespace2 return elif isinstance(token, (LinebreakToken, CommentToken)): block = LinebreakBlock if isinstance( token, LinebreakToken) else CommentBlock parserState.NewBlock = cls(parserState.LastBlock, parserState.TokenMarker, endToken=token.PreviousToken, multiPart=True) _ = block(parserState.NewBlock, token) parserState.TokenMarker = None parserState.NextState = cls.stateWhitespace2 return raise BlockParserException( "Expected '(' or whitespace after procedure name.", token)
def stateDot2(cls, parserState: ParserState): token = parserState.Token if isinstance(token, WordToken): if (token <= "all"): parserState.NewToken = AllKeyword(token) else: parserState.NewToken = IdentifierToken(token) parserState.NextState = cls.stateObjectName return elif isinstance(token, ExtendedIdentifier): parserState.NextState = cls.stateObjectName return elif isinstance(token, SpaceToken): parserState.NewToken = BoundaryToken(token) parserState.NextState = cls.stateWhitespace4 return elif isinstance(token, (LinebreakToken, CommentToken)): block = LinebreakBlock if isinstance( token, LinebreakToken) else CommentBlock parserState.NewBlock = cls(parserState.LastBlock, parserState.TokenMarker, endToken=token.PreviousToken, multiPart=True) _ = block(parserState.NewBlock, token) parserState.TokenMarker = None parserState.NextState = cls.stateWhitespace4 return raise BlockParserException("Expected object name after '.'.", token)
def stateDot1(cls, parserState: ParserState): token = parserState.Token if isinstance(token, WordToken): parserState.NewToken = IdentifierToken(token) parserState.NextState = cls.statePackageName return elif isinstance(token, ExtendedIdentifier): parserState.NextState = cls.statePackageName return elif (isinstance(token, CharacterToken) and (token == ".")): parserState.NewToken = DelimiterToken(token) parserState.NextState = cls.stateDot1 return elif isinstance(token, SpaceToken): #parserState.NewToken = BoundaryToken(token) parserState.NextState = cls.stateWhitespace2 return elif isinstance(token, (LinebreakToken, CommentToken)): block = LinebreakBlock if isinstance( token, LinebreakToken) else CommentBlock parserState.NewBlock = cls(parserState.LastBlock, parserState.TokenMarker, endToken=token.PreviousToken, multiPart=True) _ = block(parserState.NewBlock, token) parserState.TokenMarker = None parserState.NextState = cls.stateWhitespace2 return raise BlockParserException("Expected package name after '.'.", token)
def stateWhitespace2(cls, parserState: ParserState): token = parserState.Token if (isinstance(token, WordToken) and (token <= "is")): parserState.NewToken = IsKeyword(token) parserState.NewBlock = cls(parserState.LastBlock, parserState.TokenMarker, endToken=parserState.NewToken) parserState.NextState = cls.stateDeclarativeRegion return elif isinstance(token, LinebreakToken): if (not (isinstance(parserState.LastBlock, CommentBlock) and isinstance(parserState.LastBlock.StartToken, MultiLineCommentToken))): parserState.NewBlock = cls(parserState.LastBlock, parserState.TokenMarker, endToken=token.PreviousToken, multiPart=True) _ = LinebreakBlock(parserState.NewBlock, token) else: parserState.NewBlock = LinebreakBlock(parserState.LastBlock, token) parserState.TokenMarker = None return elif isinstance(token, CommentToken): parserState.NewBlock = cls(parserState.LastBlock, parserState.TokenMarker, endToken=token.PreviousToken, multiPart=True) _ = CommentBlock(parserState.NewBlock, token) parserState.TokenMarker = None return elif (isinstance(token, IndentationToken) and isinstance(token.PreviousToken, (LinebreakToken, SingleLineCommentToken))): return elif (isinstance(token, SpaceToken) and (isinstance(parserState.LastBlock, CommentBlock) and isinstance(parserState.LastBlock.StartToken, MultiLineCommentToken))): parserState.NewToken = BoundaryToken(token) parserState.NewBlock = WhitespaceBlock(parserState.LastBlock, parserState.NewToken) parserState.TokenMarker = None return raise BlockParserException("Expected keyword IS after context name.", token)
def stateDelimiter(cls, parserState: ParserState): token = parserState.Token if isinstance(token, WordToken): parserState.NewToken = IdentifierToken(token) parserState.NextState = ReferenceNameBlock.stateLibraryName parserState.TokenMarker = parserState.NewToken return elif isinstance(token, ExtendedIdentifier): parserState.NextState = ReferenceNameBlock.stateLibraryName return elif isinstance(token, LinebreakToken): parserState.NewBlock = cls(parserState.LastBlock, parserState.TokenMarker, endToken=token, multiPart=True) parserState.TokenMarker = None return elif isinstance(token, CommentToken): parserState.NewBlock = cls(parserState.LastBlock, parserState.TokenMarker, endToken=token.PreviousToken, multiPart=True) _ = CommentBlock(parserState.NewBlock, token) parserState.TokenMarker = None return elif isinstance(token, SpaceToken): parserState.NewToken = BoundaryToken(token) parserState.TokenMarker = parserState.NewToken parserState.NextState = cls.stateWhitespace1 return raise BlockParserException( "Expected library name (identifier) or whitespace.", token)
def stateDeclarativeRegion(cls, parserState: ParserState): token = parserState.Token if isinstance(token, SpaceToken): blockType = IndentationBlock if isinstance(token, IndentationToken) else WhitespaceBlock parserState.NewBlock = blockType(parserState.LastBlock, token) return elif isinstance(token, (LinebreakToken, CommentToken)): block = LinebreakBlock if isinstance(token, LinebreakToken) else CommentBlock parserState.NewBlock = block(parserState.LastBlock, token) parserState.TokenMarker = None return elif isinstance(token, WordToken): tokenValue = token.Value.lower() for keyword in cls.KEYWORDS: if (tokenValue == keyword.__KEYWORD__): newToken = keyword(token) parserState.PushState = cls.KEYWORDS[keyword] parserState.NewToken = newToken parserState.TokenMarker = newToken return if (tokenValue == "end"): parserState.NewToken = EndKeyword(token) parserState.TokenMarker = parserState.NewToken parserState.NextState = EndBlock.stateEndKeyword return raise BlockParserException( "Expected one of these keywords: END, {keywords}. Found: '{tokenValue}'.".format( keywords=", ".join( [kw.__KEYWORD__.upper() for kw in cls.KEYWORDS] ), tokenValue=token.Value ), token)
def stateGenerateKeyword(cls, parserState: ParserState): token = parserState.Token errorMessage = "Expected whitespace after keyword GENERATE." if isinstance(token, CharacterToken): if (token == "\n"): parserState.NewBlock = CaseBlock(parserState.LastBlock, parserState.TokenMarker, endToken=token.PreviousToken, multiPart=True) parserState.NewToken = LinebreakToken(token) _ = LinebreakBlock(parserState.NewBlock, parserState.NewToken) parserState.TokenMarker = None parserState.NextState = cls.stateWhitespace1 parserState.PushState = LinebreakBlock.stateLinebreak return elif (token == "-"): parserState.NewBlock = CaseBlock(parserState.LastBlock, parserState.TokenMarker, endToken=token.PreviousToken, multiPart=True) parserState.TokenMarker = None parserState.NextState = cls.stateWhitespace1 parserState.PushState = SingleLineCommentBlock.statePossibleCommentStart parserState.TokenMarker = token return elif (token == "/"): parserState.NewBlock = CaseBlock(parserState.LastBlock, parserState.TokenMarker, endToken=token.PreviousToken, multiPart=True) parserState.TokenMarker = None parserState.NextState = cls.stateWhitespace1 parserState.PushState = MultiLineCommentBlock.statePossibleCommentStart parserState.TokenMarker = token return elif isinstance(token, SpaceToken): parserState.NewToken = BoundaryToken(token) parserState.NextState = cls.stateWhitespace1 return raise BlockParserException(errorMessage, token)
def stateWhitespace1(cls, parserState: ParserState): token = parserState.Token if isinstance(token, WordToken): parserState.NewToken = IdentifierToken(token) parserState.NextState = cls.stateContextName return elif isinstance(token, ExtendedIdentifier): parserState.NextState = cls.stateContextName return elif isinstance(token, LinebreakToken): if (not (isinstance(parserState.LastBlock, CommentBlock) and isinstance(parserState.LastBlock.StartToken, MultiLineCommentToken))): parserState.NewBlock = cls(parserState.LastBlock, parserState.TokenMarker, endToken=token.PreviousToken, multiPart=True) _ = LinebreakBlock(parserState.NewBlock, token) else: parserState.NewBlock = LinebreakBlock(parserState.LastBlock, token) parserState.TokenMarker = None return elif isinstance(token, CommentToken): parserState.NewBlock = cls(parserState.LastBlock, parserState.TokenMarker, endToken=token.PreviousToken, multiPart=True) _ = CommentBlock(parserState.NewBlock, token) parserState.TokenMarker = None return elif (isinstance(token, IndentationToken) and isinstance(token.PreviousToken, (LinebreakToken, SingleLineCommentToken))): return elif (isinstance(token, SpaceToken) and (isinstance(parserState.LastBlock, CommentBlock) and isinstance(parserState.LastBlock.StartToken, MultiLineCommentToken))): parserState.NewToken = BoundaryToken(token) parserState.NewBlock = WhitespaceBlock(parserState.LastBlock, parserState.NewToken) parserState.TokenMarker = None return raise BlockParserException("Expected context name (identifier).", token)