parser(events).vb

来自「大名鼎鼎的mono是.NET平台的跨平台(支持linux」· VB 代码 · 共 295 行

VB
295
字号
' ' Visual Basic.Net Compiler' Copyright (C) 2004 - 2007 Rolf Bjarne Kvinge, RKvinge@novell.com' ' This library is free software; you can redistribute it and/or' modify it under the terms of the GNU Lesser General Public' License as published by the Free Software Foundation; either' version 2.1 of the License, or (at your option) any later version.' ' This library is distributed in the hope that it will be useful,' but WITHOUT ANY WARRANTY; without even the implied warranty of' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU' Lesser General Public License for more details.' ' You should have received a copy of the GNU Lesser General Public' License along with this library; if not, write to the Free Software' Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA' Partial Class Parser    ''' <summary>    ''' EventAccessorDeclaration  ::= AddHandlerDeclaration | RemoveHandlerDeclaration | RaiseEventDeclaration    ''' </summary>    ''' <remarks></remarks>    Private Function ParseEventAccessorDeclarations(ByVal Parent As EventDeclaration, ByVal EventName As Identifier, ByVal EventModifiers As Modifiers) As EventAccessorDeclarations        Dim result As New EventAccessorDeclarations(Parent)        Dim parsing As Boolean = True        Dim m_AddHandler As CustomEventHandlerDeclaration = Nothing        Dim m_RemoveHandler As CustomEventHandlerDeclaration = Nothing        Dim m_RaiseEvent As CustomEventHandlerDeclaration = Nothing        Do            Dim attributes As Attributes            attributes = New Attributes(result)            If vbnc.Attributes.IsMe(tm) Then                ParseAttributes(result, attributes)            End If            If CustomEventHandlerDeclaration.IsMe(tm) Then                Dim newMember As CustomEventHandlerDeclaration                newMember = ParseCustomEventHandlerDeclaration(Parent, New ParseAttributableInfo(Compiler, attributes), EventName, EventModifiers)                If newMember Is Nothing Then Helper.ErrorRecoveryNotImplemented()                Select Case newMember.HandlerType                    Case KS.AddHandler                        m_AddHandler = newMember                    Case KS.RemoveHandler                        m_RemoveHandler = newMember                    Case KS.RaiseEvent                        m_RaiseEvent = newMember                    Case Else                        Throw New InternalException(result)                End Select            Else                If attributes IsNot Nothing AndAlso attributes.Count > 0 Then                    Helper.AddError()                End If                Exit Do            End If        Loop        result.Init(m_AddHandler, m_RemoveHandler, m_RaiseEvent)        result.HasErrors = m_AddHandler IsNot Nothing AndAlso m_RemoveHandler IsNot Nothing AndAlso m_RaiseEvent IsNot Nothing        Return result    End Function    ''' <summary>    ''' CustomEventMemberDeclaration  ::=    '''	[  Attributes  ]  [  EventModifiers+  ]  "Custom" "Event" Identifier "As" TypeName  [  ImplementsClause  ]    '''		StatementTerminator    '''		EventAccessorDeclaration+    '''	"End" "Event" StatementTerminator    '''     ''' LAMESPEC!!! Using the following:    ''' CustomEventMemberDeclaration  ::=    '''	[  Attributes  ]  [  EventModifiers+  ]  "Custom" "Event" Identifier "As" NonArrayTypeName  [  ImplementsClause  ]    '''		StatementTerminator    '''		EventAccessorDeclaration+    '''	"End" "Event" StatementTerminator    ''' </summary>    ''' <remarks></remarks>    Private Function ParseCustomEventMemberDeclaration(ByVal Parent As TypeDeclaration, ByVal Info As ParseAttributableInfo) As CustomEventDeclaration        Dim result As New CustomEventDeclaration(Parent)        Dim m_Modifiers As Modifiers        Dim m_Identifier As Identifier        Dim m_TypeName As NonArrayTypeName        Dim m_ImplementsClause As MemberImplementsClause = Nothing        Dim m_EventAccessorDeclarations As EventAccessorDeclarations = Nothing        m_Modifiers = ParseModifiers(result, ModifierMasks.EventModifiers)        tm.AcceptIfNotInternalError(KS.CustomEvent)        m_Identifier = ParseIdentifier(result)        If m_Identifier Is Nothing Then Helper.ErrorRecoveryNotImplemented()        If tm.AcceptIfNotError(KS.As) = False Then Helper.ErrorRecoveryNotImplemented()        m_TypeName = ParseNonArrayTypeName(result)        If m_TypeName Is Nothing Then Helper.ErrorRecoveryNotImplemented()        If tm.AcceptEndOfStatement = False Then            m_ImplementsClause = ParseImplementsClause(result)            If m_ImplementsClause Is Nothing Then Helper.ErrorRecoveryNotImplemented()            If tm.AcceptEndOfStatement(, True) = False Then Helper.ErrorRecoveryNotImplemented()        End If        m_EventAccessorDeclarations = ParseEventAccessorDeclarations(result, m_Identifier, m_Modifiers)        If m_EventAccessorDeclarations Is Nothing Then Helper.ErrorRecoveryNotImplemented()        If tm.AcceptIfNotError(KS.End_Event) = False Then Helper.ErrorRecoveryNotImplemented()        If tm.AcceptEndOfStatement(, True) = False Then Helper.ErrorRecoveryNotImplemented()        result.Init(Info.Attributes, m_Modifiers, m_Identifier, m_TypeName, m_ImplementsClause)        result.AddMethod = m_EventAccessorDeclarations.AddHandler        result.RemoveMethod = m_EventAccessorDeclarations.RemoveHandler        result.RaiseMethod = m_EventAccessorDeclarations.RaiseEvent        Return result    End Function    ''' <summary>    ''' InterfaceEventMemberDeclaration  ::=    '''	[  Attributes  ]  [  InterfaceEventModifiers+  ]  "Event"  Identifier  ParametersOrType  StatementTerminator    ''' </summary>    ''' <remarks></remarks>    Private Function ParseInterfaceEventMemberDeclaration(ByVal Parent As TypeDeclaration, ByVal Info As ParseAttributableInfo) As InterfaceEventMemberDeclaration        Dim result As New InterfaceEventMemberDeclaration(Parent)        Dim m_Modifiers As Modifiers        Dim m_Identifier As Identifier        Dim m_ParametersOrType As ParametersOrType        m_Modifiers = ParseModifiers(result, ModifierMasks.InterfaceEventModifiers)        tm.AcceptIfNotInternalError(KS.Event)        m_Identifier = ParseIdentifier(result)        If m_Identifier Is Nothing Then Helper.ErrorRecoveryNotImplemented()        m_ParametersOrType = ParseParametersOrType(result)        If tm.AcceptEndOfStatement(, True) = False Then Helper.ErrorRecoveryNotImplemented()        result.Init(Info.Attributes, m_Modifiers, m_Identifier, m_ParametersOrType, Nothing)        Return result    End Function    ''' <summary>    ''' ParametersOrType  ::= [  "(" [  ParameterList  ]  ")"  ]  | "As"  NonArrayTypeName    ''' </summary>    ''' <remarks></remarks>    Private Function ParseParametersOrType(ByVal Parent As ParsedObject) As ParametersOrType        Dim result As New ParametersOrType(Parent)        Dim m_NonArrayTypeName As NonArrayTypeName        Dim m_ParameterList As ParameterList        If tm.Accept(KS.As) Then            m_NonArrayTypeName = ParseNonArrayTypeName(result)            result.Init(m_NonArrayTypeName)        Else            m_ParameterList = New ParameterList(result)            If tm.Accept(KS.LParenthesis) Then                If tm.Accept(KS.RParenthesis) = False Then                    If ParseList(Of Parameter)(m_ParameterList, New ParseDelegate_Parent(Of Parameter)(AddressOf ParseParameter), m_ParameterList) = False Then                        Helper.ErrorRecoveryNotImplemented()                    End If                    If tm.AcceptIfNotError(KS.RParenthesis) = False Then Helper.ErrorRecoveryNotImplemented()                Else                    m_ParameterList = New ParameterList(result)                End If                result.Init(m_ParameterList)            Else                result.Init(m_ParameterList)            End If        End If        Return result    End Function    ''' <summary>    ''' RegularEventMemberDeclaration  ::=    ''' 	[  Attributes  ]  [  EventModifiers+  ]  "Event"  Identifier  ParametersOrType  [  ImplementsClause  ] StatementTerminator    ''' </summary>    ''' <remarks></remarks>    Private Function ParseRegularEventDeclaration(ByVal Parent As TypeDeclaration, ByVal Info As ParseAttributableInfo) As RegularEventDeclaration        Dim result As New RegularEventDeclaration(Parent)        Dim m_Modifiers As Modifiers        Dim m_Identifier As Identifier        Dim m_ParametersOrType As ParametersOrType        Dim m_ImplementsClause As MemberImplementsClause        m_Modifiers = ParseModifiers(result, ModifierMasks.EventModifiers)        tm.AcceptIfNotInternalError(KS.Event)        m_Identifier = ParseIdentifier(result)        If m_Identifier Is Nothing Then Helper.ErrorRecoveryNotImplemented()        m_ParametersOrType = ParseParametersOrType(result)        If MemberImplementsClause.IsMe(tm) Then            m_ImplementsClause = ParseImplementsClause(result)            If m_ImplementsClause Is Nothing Then Helper.ErrorRecoveryNotImplemented()        Else            m_ImplementsClause = Nothing        End If        If tm.AcceptEndOfStatement(, True) = False Then Helper.ErrorRecoveryNotImplemented()        result.Init(Info.Attributes, m_Modifiers, m_Identifier, m_ParametersOrType, m_ImplementsClause)        Return result    End Function    ''' <summary>    ''' AddHandlerDeclaration  ::=    '''	[  Attributes  ]  "AddHandler" "(" ParameterList ")" LineTerminator    '''	[  Block  ]    '''	"End" "AddHandler" StatementTerminator    '''     ''' RemoveHandlerDeclaration  ::=    '''	[  Attributes  ]  "RemoveHandler" "("  ParameterList  ")"  LineTerminator    '''	[  Block  ]    '''	"End" "RemoveHandler" StatementTerminator    '''     ''' LAMESPEC: should be:    ''' RemoveHandlerDeclaration  ::=    '''	[  Attributes  ]  "RemoveHandler" "("  [ ParameterList  ] ")"  LineTerminator    '''	[  Block  ]    '''	"End" "RemoveHandler" StatementTerminator    '''     ''' RaiseEventDeclaration  ::=    '''	[  Attributes  ]  "RaiseEvent" (  ParameterList  )  LineTerminator    '''	[  Block  ]    '''	"End" "RaiseEvent" StatementTerminator    ''' </summary>    ''' <remarks></remarks>    Private Function ParseCustomEventHandlerDeclaration(ByVal Parent As EventDeclaration, ByVal Info As ParseAttributableInfo, ByVal EventName As Identifier, ByVal EventModifiers As Modifiers) As CustomEventHandlerDeclaration        Dim result As New CustomEventHandlerDeclaration(Parent)        Dim m_ParameterList As New ParameterList(result)        Dim m_Block As CodeBlock        Dim m_HandlerType As KS        Dim m_Modifiers As Modifiers        Dim endkeyword As KS        If tm.CurrentToken.Equals(KS.AddHandler, KS.RemoveHandler, KS.RaiseEvent) Then            m_HandlerType = tm.CurrentToken.Keyword            endkeyword = Enums.GetKSStringAttribute(m_HandlerType).MultiKeyword            tm.NextToken()        Else            Throw New InternalException(result)        End If        If tm.AcceptIfNotError(KS.LParenthesis) = False Then Helper.ErrorRecoveryNotImplemented()        If tm.Accept(KS.RParenthesis) = False Then            If ParseList(Of Parameter)(m_ParameterList, New ParseDelegate_Parent(Of Parameter)(AddressOf ParseParameter), m_ParameterList) = False Then                Helper.ErrorRecoveryNotImplemented()            End If            If tm.AcceptIfNotError(KS.RParenthesis) = False Then Helper.ErrorRecoveryNotImplemented()        End If        If tm.AcceptEndOfStatement(, True) = False Then Helper.ErrorRecoveryNotImplemented()        m_Block = ParseCodeBlock(result, False)        If m_Block Is Nothing Then Helper.ErrorRecoveryNotImplemented()        If tm.AcceptIfNotError(endkeyword) = False Then Helper.ErrorRecoveryNotImplemented()        If tm.AcceptEndOfStatement(, True) = False Then Helper.ErrorRecoveryNotImplemented()        If m_ParameterList Is Nothing Then m_ParameterList = New ParameterList(result)        If m_HandlerType = KS.RaiseEvent Then            m_Modifiers = New Modifiers(ModifierMasks.Private)        Else            m_modifiers = EventModifiers        End If        result.Init(Info.Attributes, m_Modifiers, m_ParameterList, m_Block, m_HandlerType, EventName)        Return result    End FunctionEnd Class

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?