parser(types).vb

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

VB
326
字号
' ' 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>    ''' ClassDeclaration  ::=    '''	[  Attributes  ]  [  ClassModifier+  ]  "Class"  Identifier  [  TypeParameters  ]  StatementTerminator    '''	[  ClassBase  ]    '''	[  TypeImplementsClause+  ]    '''	[  ClassMemberDeclaration+  ]    '''	"End" "Class" StatementTerminator    '''     ''' ClassBase ::= Inherits NonArrayTypeName StatementTerminator    ''' </summary>    ''' <param name="Parent">Should be the declaring type of the assembly itself it is not a nested type.</param>    ''' <param name="Attributes"></param>    ''' <param name="Namespace"></param>    ''' <returns></returns>    ''' <remarks></remarks>    Private Function ParseClassDeclaration(ByVal Parent As ParsedObject, ByVal Attributes As Attributes, ByVal [Namespace] As String) As ClassDeclaration        Dim result As New ClassDeclaration(Parent, [Namespace])        Dim m_Attributes As Attributes        Dim m_Modifiers As Modifiers        Dim m_Identifier As Token = Nothing        Dim m_TypeParameters As TypeParameters        Dim m_Inherits As NonArrayTypeName        Dim m_TypeImplementsClauses As TypeImplementsClauses        Dim m_Members As MemberDeclarations        Dim m_DeclaringType As TypeDeclaration        m_DeclaringType = TryCast(Parent, TypeDeclaration)        Helper.Assert(m_DeclaringType IsNot Nothing OrElse TypeOf Parent Is AssemblyDeclaration)        m_Attributes = Attributes        m_Modifiers = ParseModifiers(result, ModifierMasks.ClassModifiers)        tm.AcceptIfNotInternalError(KS.Class) 'ClassDeclaration should not be created if no "Class" is found...        If tm.AcceptIdentifier(m_Identifier) = False Then Helper.ErrorRecoveryNotImplemented()        If tm.AcceptEndOfStatement = False Then            m_TypeParameters = ParseTypeParameters(result)            If m_TypeParameters Is Nothing Then Helper.ErrorRecoveryNotImplemented()            If tm.AcceptEndOfStatement(, True) = False Then Helper.ErrorRecoveryNotImplemented()        Else            m_TypeParameters = Nothing        End If        If tm.Accept(KS.Inherits) Then            m_Inherits = ParseNonArrayTypeName(result)            If m_Inherits Is Nothing Then Helper.ErrorRecoveryNotImplemented()            If tm.AcceptEndOfStatement(, True) = False Then Helper.ErrorRecoveryNotImplemented()        Else            m_Inherits = Nothing        End If        If TypeImplementsClauses.IsMe(tm) Then            m_TypeImplementsClauses = ParseTypeImplementsClauses(result)            If m_TypeImplementsClauses Is Nothing Then Helper.ErrorRecoveryNotImplemented()        Else            m_TypeImplementsClauses = Nothing        End If        m_Members = ParseTypeMembers(result)        If m_Members Is Nothing Then Helper.ErrorRecoveryNotImplemented()        If tm.AcceptIfNotError(KS.End_Class) = False Then Helper.ErrorRecoveryNotImplemented()        If tm.AcceptEndOfStatement(, True) = False Then Helper.ErrorRecoveryNotImplemented()        result.Init(attributes, m_Modifiers, m_DeclaringType, m_Members, m_Identifier, m_TypeParameters, m_Inherits, m_TypeImplementsClauses)        Return result    End Function    ''' <summary>    ''' DelegateDeclaration  ::=    ''' [  Attributes  ]  [  TypeModifier+  ]  "Delegate" MethodSignature  StatementTerminator    ''' MethodSignature  ::=  SubSignature  |  FunctionSignature    '''     ''' LAMESPEC: should be something like:    ''' [  Attributes  ]  [  TypeModifier+  ]  "Delegate" FunctionOrSub MethodSignature  StatementTerminator    ''' FunctionOrSub ::= "Function" | "Sub"    ''' </summary>    ''' <remarks></remarks>    Private Function ParseDelegateDeclaration(ByVal Parent As ParsedObject, ByVal Attributes As Attributes, ByVal [Namespace] As String) As DelegateDeclaration        Dim result As New DelegateDeclaration(Parent, [Namespace])        Dim Modifiers As Modifiers        Dim m_Signature As SubSignature        Modifiers = ParseModifiers(result, ModifierMasks.TypeModifiers)        tm.AcceptIfNotInternalError(KS.Delegate)        If tm.Accept(KS.Function) Then            m_Signature = ParseFunctionSignature(result)        ElseIf tm.Accept(KS.Sub) Then            m_Signature = ParseSubSignature(result)        Else            Throw New InternalException(result)        End If        If m_Signature Is Nothing Then Helper.ErrorRecoveryNotImplemented()        If tm.AcceptEndOfStatement(, True) = False Then Helper.ErrorRecoveryNotImplemented()        result.Init(Attributes, Modifiers, m_Signature)        Return result    End Function    ''' <summary>    ''' Parses enum members.    ''' Never returns nothing.    ''' </summary>    ''' <param name="Parent"></param>    ''' <returns></returns>    ''' <remarks></remarks>    Private Function ParseEnumMembers(ByVal Parent As EnumDeclaration) As MemberDeclarations        Dim result As New MemberDeclarations(Parent)        Dim newConst As EnumMemberDeclaration        Dim constAttributes As Attributes        Do Until tm.CurrentToken.Equals(KS.End_Enum)            constAttributes = New Attributes(Parent)            If vbnc.Attributes.IsMe(tm) Then                If ParseAttributes(Parent, constAttributes) = False Then Helper.ErrorRecoveryNotImplemented()            End If            newConst = ParseEnumMemberDeclaration(Parent, New ParseAttributableInfo(Compiler, constAttributes), result.Declarations.Count)            If newConst Is Nothing Then Helper.ErrorRecoveryNotImplemented()            result.Declarations.Add(newConst)        Loop        Return result    End Function    ''' <summary>    ''' EnumDeclaration  ::=    '''	[  Attributes  ]  [  TypeModifier+  ]  "Enum"  Identifier  [  "As"  IntegralTypeName  ]  StatementTerminator    '''	   EnumMemberDeclaration+    '''	"End" "Enum"  StatementTerminator    '''     ''' LAMESPEC: IntegralTypeName is QualifiedName in the spec. (QualifiedName doesn't exist...)    ''' </summary>    ''' <remarks></remarks>    Private Function ParseEnumDeclaration(ByVal Parent As ParsedObject, ByVal Attributes As Attributes, ByVal [Namespace] As String) As EnumDeclaration        Dim result As New EnumDeclaration(Parent, [Namespace])        Dim m_Modifiers As Modifiers        Dim m_Identifier As Token = Nothing        Dim m_QualifiedName As KS = KS.Integer        Dim m_Members As MemberDeclarations        m_Modifiers = ParseModifiers(result, ModifierMasks.TypeModifiers)        tm.AcceptIfNotInternalError(KS.Enum)        If tm.AcceptIdentifier(m_Identifier) = False Then Helper.ErrorRecoveryNotImplemented()        If tm.Accept(KS.As) Then            If tm.CurrentToken.Equals(Enums.IntegralTypeNames) Then                m_QualifiedName = tm.CurrentToken.Keyword                tm.NextToken()            Else                Helper.AddError("Enum type must be integral")            End If        End If        If tm.AcceptEndOfStatement(, True) = False Then Helper.ErrorRecoveryNotImplemented()        m_Members = ParseEnumMembers(result)        If m_Members Is Nothing Then Helper.ErrorRecoveryNotImplemented()        tm.AcceptIfNotInternalError(KS.End_Enum)        If tm.AcceptEndOfStatement(, True) = False Then Helper.ErrorRecoveryNotImplemented()        result.Init(attributes, m_Modifiers, m_Members, m_Identifier, m_QualifiedName)        Return result    End Function    ''' <summary>    ''' InterfaceDeclaration  ::=    '''	[  Attributes  ]  [  TypeModifier+  ]  "Interface" Identifier  [  TypeParameters  ]  StatementTerminator    '''	[  InterfaceBase+  ]    '''	[  InterfaceMemberDeclaration+  ]    '''	"End" "Interface" StatementTerminator    ''' </summary>    ''' <remarks></remarks>    Private Function ParseInterfaceDeclaration(ByVal Parent As ParsedObject, ByVal Attributes As Attributes, ByVal [Namespace] As String) As InterfaceDeclaration        Dim result As New InterfaceDeclaration(Parent, [Namespace])        Dim m_Modifiers As Modifiers        Dim m_Identifier As Token = Nothing        Dim m_TypeParameters As TypeParameters        Dim m_InterfaceBases As InterfaceBases        Dim m_Members As MemberDeclarations        m_Modifiers = ParseModifiers(result, ModifierMasks.TypeModifiers)        tm.AcceptIfNotInternalError(KS.Interface)        If tm.AcceptIdentifier(m_Identifier) = False Then Helper.ErrorRecoveryNotImplemented()        If tm.AcceptEndOfStatement = False Then            m_TypeParameters = ParseTypeParameters(result)            If m_TypeParameters Is Nothing Then Helper.ErrorRecoveryNotImplemented()            If tm.AcceptEndOfStatement(, True) = False Then Helper.ErrorRecoveryNotImplemented()        Else            m_TypeParameters = Nothing        End If        If InterfaceBases.IsMe(tm) Then            m_InterfaceBases = ParseInterfaceBases(result)            If m_InterfaceBases Is Nothing Then Helper.ErrorRecoveryNotImplemented()        Else            m_InterfaceBases = Nothing        End If        m_Members = ParseInterfaceMembers(result)        If m_Members Is Nothing Then Helper.ErrorRecoveryNotImplemented()        If tm.AcceptIfNotError(KS.End_Interface) = False Then Helper.ErrorRecoveryNotImplemented()        If tm.AcceptEndOfStatement(, True) = False Then Helper.ErrorRecoveryNotImplemented()        result.Init(attributes, m_Modifiers, m_Members, m_Identifier, m_TypeParameters, m_InterfaceBases)        Return result    End Function    ''' <summary>    ''' ModuleDeclaration  ::=    '''	[  Attributes  ]  [  TypeModifier+  ]  "Module"  Identifier  StatementTerminator    '''	[  ModuleMemberDeclaration+  ]    '''	"End" "Module" StatementTerminator    ''' </summary>    ''' <remarks></remarks>    Private Function ParseModuleDeclaration(ByVal Parent As ParsedObject, ByVal Attributes As Attributes, ByVal [Namespace] As String) As ModuleDeclaration        Dim result As New ModuleDeclaration(Parent, [Namespace])        Dim m_Modifiers As Modifiers        Dim m_Members As MemberDeclarations        Dim m_Name As Token = Nothing        m_Modifiers = ParseModifiers(result, ModifierMasks.TypeModifiers)        tm.AcceptIfNotInternalError(KS.Module)        If tm.AcceptIdentifier(m_Name) = False Then Helper.ErrorRecoveryNotImplemented()        If tm.AcceptEndOfStatement(, True) = False Then Helper.ErrorRecoveryNotImplemented()        m_Members = ParseTypeMembers(result)        If m_Members Is Nothing Then Helper.ErrorRecoveryNotImplemented()        If tm.AcceptIfNotError(KS.End_Module) = False Then Helper.ErrorRecoveryNotImplemented()        If tm.AcceptEndOfStatement(, True) = False Then Helper.ErrorRecoveryNotImplemented()        result.Init(Attributes, m_Modifiers, m_Members, m_Name, 0)        Return result    End Function    ''' <summary>    ''' StructureDeclaration  ::=    '''	[  Attributes  ]  [  StructureModifier+  ]  "Structure" Identifier  [  TypeParameters  ]	StatementTerminator    '''	[  TypeImplementsClause+  ]    '''	[  StructMemberDeclaration+  ]    '''	"End" "Structure"  StatementTerminator    ''' </summary>    ''' <remarks></remarks>    Private Function ParseStructureDeclaration(ByVal Parent As ParsedObject, ByVal Attributes As Attributes, ByVal [Namespace] As String) As StructureDeclaration        Dim result As New StructureDeclaration(Parent, [Namespace])        Dim m_Modifiers As Modifiers        Dim m_Members As MemberDeclarations        Dim m_Name As Token = Nothing        Dim m_TypeParameters As TypeParameters        Dim m_Implements As TypeImplementsClauses        m_Modifiers = ParseModifiers(result, ModifierMasks.StructureModifiers)        tm.AcceptIfNotInternalError(KS.Structure)        If tm.AcceptIdentifier(m_Name) = False Then Helper.ErrorRecoveryNotImplemented()        If tm.AcceptEndOfStatement = False Then            m_TypeParameters = ParseTypeParameters(result)            If m_TypeParameters Is Nothing Then Helper.ErrorRecoveryNotImplemented()            If tm.AcceptEndOfStatement(, True) = False Then Helper.ErrorRecoveryNotImplemented()        Else            m_TypeParameters = Nothing        End If        m_Implements = ParseTypeImplementsClauses(result)        If m_Implements Is Nothing Then Helper.ErrorRecoveryNotImplemented()        m_Members = ParseTypeMembers(result)        If m_Members Is Nothing Then Helper.ErrorRecoveryNotImplemented()        If tm.AcceptIfNotError(KS.End_Structure) = False Then Helper.ErrorRecoveryNotImplemented()        If tm.AcceptEndOfStatement(, True) = False Then Helper.ErrorRecoveryNotImplemented()        result.Init(Attributes, m_Modifiers, m_Members, m_Name, m_TypeParameters, m_Implements)        Return result    End FunctionEnd Class

⌨️ 快捷键说明

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