def stateWhitespace2(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, WordToken): parserState.NewToken = IdentifierToken(token) parserState.TokenMarker = parserState.NewToken parserState.NextState = cls.statePackageName 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, 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 package name (identifier).", 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 stateWhitespace1(cls, parserState: ParserState): token = parserState.Token if isinstance(token, StringToken): parserState.NewToken = IdentifierToken(token) parserState.NextState = cls.stateProcedureName 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 TokenParserException("Expected procedure name (designator).", token)
def stateWhitespace0(cls, parserState: ParserState): token = parserState.Token if isinstance(token, WordToken): parserState.NewToken = IdentifierToken(token) parserState.NextState = cls.stateVariableKeyword return elif isinstance(token, ExtendedIdentifier): parserState.NextState = cls.stateVariableKeyword 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 whitespace after keyword SHARED.", token)
def stateItemDelimiter(cls, parserState: ParserState): token = parserState.Token if isinstance(token, StringToken): if (token <= "signal"): parserState.NewToken = SignalKeyword(token) parserState.PushState = PortListInterfaceSignalBlock.stateSignalKeyword parserState.TokenMarker = parserState.NewToken return else: parserState.NewToken = IdentifierToken(token) parserState.PushState = PortListInterfaceSignalBlock.stateObjectName parserState.TokenMarker = parserState.NewToken return elif isinstance(token, ExtendedIdentifier): parserState.NextState = PortListInterfaceSignalBlock.stateObjectName 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 # parserState.NextState = cls.stateWhitespace1 return raise TokenParserException("Expected port name (identifier).", 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 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 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 stateWhitespace1(cls, parserState: ParserState): token = parserState.Token if isinstance(token, StringToken): parserState.NewToken = IdentifierToken(token) parserState.NextState = ReferenceNameBlock.stateLibraryName 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) 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 TokenParserException("Expected library name (identifier).", 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 stateWhitespace3(cls, parserState: ParserState): token = parserState.Token if isinstance(token, StringToken): parserState.NewToken = IdentifierToken(token) parserState.NextState = cls.stateMessage 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 TokenParserException("Expected keyword REPORT after assertion.", token)
def stateColon1(cls, parserState: ParserState): token = parserState.Token if isinstance(token, StringToken): 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 TokenParserException( "Expected subtype indication or whitespace after colon.", 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 stateWhitespace3(cls, parserState: ParserState): token = parserState.Token if isinstance(token, WordToken): parserState.NewToken = IdentifierToken(token) parserState.NextState = cls.stateEntityName return elif isinstance(token, ExtendedIdentifier): parserState.NextState = cls.stateEntityName 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 architecture 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, StringToken): if (token <= "when"): parserState.NewToken = WhenKeyword(token) parserState.NextState = cls.stateWhenKeyword return else: parserState.NewToken = IdentifierToken(token) # parserState.TokenMarker = parserState.NewToken parserState.NextState = cls.stateExitLoopLabel return elif isinstance(token, ExtendedIdentifier): parserState.NextState = cls.stateExitLoopLabel 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 TokenParserException("Expected ';', keyword WHEN or loop label.", token)
def stateWhitespace2(cls, parserState: ParserState): token = parserState.Token errorMessage = "Expected attribute name (identifier)." if isinstance(token, CharacterToken): if (token == ":"): parserState.NewToken = BoundaryToken(token) parserState.NextState = cls.stateColon1 return if (token == "\n"): parserState.NewToken = LinebreakToken(token) if (not isinstance(parserState.LastBlock, MultiLineCommentBlock)): parserState.NewBlock = AttributeDeclarationBlock( 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.PushState = LinebreakBlock.stateLinebreak return elif (token == "-"): parserState.NewBlock = AttributeDeclarationBlock( parserState.LastBlock, parserState.TokenMarker, endToken=token.PreviousToken, multiPart=True) parserState.TokenMarker = None parserState.PushState = SingleLineCommentBlock.statePossibleCommentStart parserState.TokenMarker = token return elif (token == "/"): parserState.NewBlock = AttributeDeclarationBlock( parserState.LastBlock, parserState.TokenMarker, endToken=token.PreviousToken, multiPart=True) parserState.TokenMarker = None parserState.PushState = MultiLineCommentBlock.statePossibleCommentStart parserState.TokenMarker = token return elif isinstance(token, WordToken): parserState.NewToken = IdentifierToken(token) parserState.NextState = cls.stateColon1() 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 TokenParserException(errorMessage, token)
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 == "("): parserState.NewToken = OpeningRoundBracketToken(token) parserState.Counter += 1 return elif (token == ")"): parserState.NewToken = ClosingRoundBracketToken(token) parserState.Counter -= 1 return else: parserState.NewToken = cls.CHARACTER_TRANSLATION[token.Value]( token) return elif isinstance(token, StringToken): if (token <= cls.EXIT_KEYWORD.__KEYWORD__): parserState.NewToken = cls.EXIT_KEYWORD(token) parserState.NewBlock = cls( parserState.LastBlock, parserState.TokenMarker, endToken=parserState.NewToken.PreviousToken) _ = cls.EXIT_BLOCK(parserState.NewBlock, parserState.NewToken) parserState.Pop() # parserState.TokenMarker = parserState.NewToken return else: 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 TokenParserException( "Expected '(' or whitespace after keyword GENERIC.", token)
def stateWhitespace3(cls, parserState: ParserState): token = parserState.Token if isinstance(token, CharacterToken): if (token == ";"): parserState.NewToken = EndToken(token) parserState.NewBlock = cls(parserState.LastBlock, parserState.TokenMarker, endToken=parserState.NewToken) parserState.Pop() return elif isinstance(token, StringToken): parserState.NewToken = IdentifierToken(token) parserState.NextState = cls.stateSimpleName return elif isinstance(token, ExtendedIdentifier): parserState.NextState = cls.stateSimpleName 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 TokenParserException( "Expected ';' or {0} name.".format(cls.EXPECTED_NAME), token)
def stateItemDelimiter(cls, parserState: ParserState): token = parserState.Token if isinstance(token, WordToken): if (token <= "constant"): parserState.NewToken = ConstantKeyword(token) parserState.PushState = GenericListInterfaceConstantBlock.stateConstantKeyword parserState.TokenMarker = parserState.NewToken return elif (token <= "type"): parserState.NewToken = TypeKeyword(token) parserState.PushState = GenericListInterfaceTypeBlock.stateTypeKeyword parserState.TokenMarker = parserState.NewToken return elif (token <= "procedure"): raise NotImplementedError( "Generic procedures are not supported.") elif (token <= "function"): raise NotImplementedError( "Generic functions are not supported.") elif (token <= "impure"): raise NotImplementedError( "Generic impure functions are not supported.") elif (token <= "pure"): raise NotImplementedError( "Generic pure functions are not supported.") else: parserState.NewToken = IdentifierToken(token) parserState.PushState = GenericListInterfaceConstantBlock.stateObjectName parserState.TokenMarker = parserState.NewToken return elif isinstance(token, ExtendedIdentifier): parserState.NextState = GenericListInterfaceConstantBlock.stateObjectName 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 # parserState.NextState = cls.stateWhitespace1 return raise BlockParserException("Expected generic name (identifier).", token)
def stateOpeningParenthesis(cls, parserState: ParserState): token = parserState.Token if isinstance(token, StringToken): if (token <= "constant"): parserState.NewToken = ConstantKeyword(token) parserState.NextState = DelimiterBlock.stateItemDelimiter parserState.PushState = ParameterListInterfaceConstantBlock.stateConstantKeyword parserState.TokenMarker = parserState.NewToken return elif (token <= "variable"): parserState.NewToken = VariableKeyword(token) parserState.NextState = DelimiterBlock.stateItemDelimiter parserState.PushState = ParameterListInterfaceVariableBlock.stateVariableKeyword parserState.TokenMarker = parserState.NewToken return elif (token <= "signal"): parserState.NewToken = SignalKeyword(token) parserState.NextState = DelimiterBlock.stateItemDelimiter parserState.PushState = ParameterListInterfaceSignalBlock.stateSignalKeyword parserState.TokenMarker = parserState.NewToken return else: parserState.NewToken = IdentifierToken(token) parserState.PushState = ParameterListInterfaceConstantBlock.stateObjectName parserState.TokenMarker = parserState.NewToken return elif isinstance(token, ExtendedIdentifier): parserState.NextState = ParameterListInterfaceConstantBlock.stateObjectName return elif isinstance(token, SpaceToken): blockType = IndentationBlock if isinstance( token, IndentationToken) else WhitespaceBlock parserState.NewBlock = blockType(parserState.LastBlock, token) return elif isinstance(token, LinebreakToken): parserState.NewBlock = LinebreakBlock(parserState.LastBlock, token) parserState.TokenMarker = token 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 TokenParserException( "Expected interface element name (identifier).", token)
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 stateColon1(cls, parserState: ParserState): token = parserState.Token errorMessage = "Expected type mark or whitespace after ':'." if isinstance(token, CharacterToken): if (token == "\n"): parserState.NewBlock = AttributeDeclarationBlock( parserState.LastBlock, parserState.TokenMarker, endToken=token.PreviousToken, multiPart=True) parserState.NewToken = LinebreakToken(token) _ = LinebreakBlock(parserState.NewBlock, parserState.NewToken) parserState.TokenMarker = None parserState.NextState = cls.stateWhitespace3 parserState.PushState = LinebreakBlock.stateLinebreak return elif (token == "-"): parserState.NewBlock = AttributeDeclarationBlock( parserState.LastBlock, parserState.TokenMarker, endToken=token.PreviousToken, multiPart=True) parserState.TokenMarker = None parserState.NextState = cls.stateWhitespace3 parserState.PushState = SingleLineCommentBlock.statePossibleCommentStart parserState.TokenMarker = token return elif (token == "/"): parserState.NewBlock = AttributeDeclarationBlock( parserState.LastBlock, parserState.TokenMarker, endToken=token.PreviousToken, multiPart=True) parserState.TokenMarker = None parserState.NextState = cls.stateWhitespace3 parserState.PushState = MultiLineCommentBlock.statePossibleCommentStart parserState.TokenMarker = token return elif isinstance(token, SpaceToken): parserState.NewToken = BoundaryToken(token) parserState.NextState = cls.stateWhitespace3 return elif isinstance(token, WordToken): parserState.NewToken = IdentifierToken(token) parserState.NextState = cls.stateTypeMarkName return raise TokenParserException(errorMessage, token)
def stateWhitespace3(cls, parserState: ParserState): token = parserState.Token if isinstance(token, StringToken): tokenValue = token.Value.lower() try: parserState.NewToken = cls.MODES[tokenValue](token) parserState.NextState = cls.stateModeKeyword return except KeyError: parserState.NewToken = IdentifierToken(token) parserState.NextState = cls.stateSubtypeIndication return elif isinstance(token, ExtendedIdentifier): 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, 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 TokenParserException( "Expected subtype indication or keyword IN.", token)
def stateOpeningParenthesis(cls, parserState: ParserState): token = parserState.Token if (isinstance(token, CharacterToken) and (token == ")")): # if (parserState.TokenMarker != token): # parserState.NewBlock = IndentationBlock(parserState.LastBlock, parserState.TokenMarker, token.PreviousToken) parserState.Pop() parserState.TokenMarker = token return elif isinstance(token, StringToken): if (token <= "signal"): parserState.NewToken = SignalKeyword(token) parserState.NextState = DelimiterBlock.stateItemDelimiter parserState.PushState = PortListInterfaceSignalBlock.stateSignalKeyword parserState.TokenMarker = parserState.NewToken return else: parserState.NewToken = IdentifierToken(token) parserState.NextState = DelimiterBlock.stateItemDelimiter parserState.PushState = PortListInterfaceSignalBlock.stateObjectName parserState.TokenMarker = parserState.NewToken return elif isinstance(token, ExtendedIdentifier): parserState.NextState = PortListInterfaceSignalBlock.stateObjectName return elif isinstance(token, SpaceToken): blockType = IndentationBlock if isinstance( token, IndentationToken) else WhitespaceBlock parserState.NewBlock = blockType(parserState.LastBlock, token) return elif isinstance(token, LinebreakToken): parserState.NewBlock = LinebreakBlock(parserState.LastBlock, token) parserState.TokenMarker = token # 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 TokenParserException( "Expected interface signal name (identifier) or keyword: SIGNAL.", token)
def stateWhitespace4(cls, parserState: ParserState): token = parserState.Token if (isinstance(token, CharacterToken) and (token == ".")): parserState.NewToken = DelimiterToken(token) parserState.NextState = cls.stateDot1 return elif isinstance(token, StringToken): 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, 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, 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 TokenParserException( "Expected object name (identifier) or keyword ALL.", token)
def stateWhitespace5(cls, parserState: ParserState): token = parserState.Token if isinstance(token, WordToken): parserState.NewToken = IdentifierToken(token) parserState.NextState = cls.stateSeverityLevel 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 severity level (expression) after keyword SEVERITY.", token)
def stateBeforeExpression(cls, parserState: ParserState): token = parserState.Token if isinstance(token, CharacterToken): if (token == "("): parserState.NewToken = OpeningRoundBracketToken(token) parserState.Counter += 1 parserState.NextState = cls.stateExpression return else: parserState.NewToken = cls.CHARACTER_TRANSLATION[token.Value]( token) parserState.NextState = cls.stateExpression return elif isinstance(token, StringToken): try: parserState.NewToken = cls.OPERATOR_TRANSLATIONS[token.Value]( token) except KeyError: parserState.NewToken = IdentifierToken(token) parserState.NextState = cls.stateExpression return elif isinstance(token, LiteralToken): parserState.NextState = cls.stateExpression return elif isinstance(token, LinebreakToken): parserState.NewBlock = LinebreakBlock(parserState.LastBlock, token) parserState.TokenMarker = None return elif isinstance(token, CommentToken): parserState.NewBlock = CommentBlock(parserState.NewBlock, token) parserState.TokenMarker = None return elif (isinstance(token, IndentationToken) and isinstance(token.PreviousToken, (LinebreakToken, SingleLineCommentToken))): return elif isinstance(token, SpaceToken): parserState.NextState = cls.stateWhitespace1 return raise TokenParserException( "Expected '(', unary operator, identifier, literal or whitespace.", token)
def stateWhitespace1(cls, parserState: ParserState): token = parserState.Token if isinstance(token, StringToken): parserState.NewToken = IdentifierToken(token) parserState.NextState = cls.stateObjectName return elif isinstance(token, ExtendedIdentifier): parserState.NextState = cls.stateObjectName 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, 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 TokenParserException( "Expected interface {0} name (identifier).".format( cls.OBJECT_KIND), token)
def stateOpeningParenthesis(cls, parserState: ParserState): token = parserState.Token errorMessage = "Expected generic name (identifier)." if isinstance(token, CharacterToken): if (token == ")"): # if (parserState.TokenMarker != token): # parserState.NewBlock = IndentationBlock(parserState.LastBlock, parserState.TokenMarker, token.PreviousToken) parserState.Pop() parserState.TokenMarker = token return elif (token == "\n"): parserState.NewToken = LinebreakToken(token) parserState.NewBlock = LinebreakBlock(parserState.LastBlock, parserState.NewToken) parserState.TokenMarker = None parserState.PushState = LinebreakBlock.stateLinebreak return elif (token == "-"): parserState.TokenMarker = None parserState.PushState = SingleLineCommentBlock.statePossibleCommentStart parserState.TokenMarker = token return elif (token == "/"): parserState.TokenMarker = None 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, StringToken): parserState.NewToken = IdentifierToken(token) parserState.TokenMarker = parserState.NewToken parserState.NextState = ItemBlock.stateItemRemainder # if (parserState.TokenMarker != token): # parserState.NewBlock = IndentationBlock(parserState.LastBlock, parserState.TokenMarker, token) return raise TokenParserException(errorMessage, token)