parser.vb

来自「大名鼎鼎的mono是.NET平台的跨平台(支持linux」· VB 代码 · 共 1,498 行 · 第 1/4 页

VB
1,498
字号
' ' 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' #If DEBUG Then#Const EXTENDEDDEBUG = 0#End IfPartial Public Class Parser    Private tm As tm    Private m_Compiler As Compiler    Private m_ShowErrors As Boolean = True    Private ReadOnly Property ShowErrors() As Boolean        Get            Return m_ShowErrors        End Get    End Property    Public ReadOnly Property Compiler() As Compiler        Get            Return m_Compiler        End Get    End Property    Public Sub New(ByVal Compiler As Compiler)        m_Compiler = Compiler        tm = m_Compiler.tm        Helper.Assert(tm IsNot Nothing)    End Sub    Public Sub New(ByVal Compiler As Compiler, ByVal TokenReader As ITokenReader)        m_Compiler = Compiler        tm = New tm(Compiler, TokenReader)        tm.NextToken()        Helper.Assert(tm IsNot Nothing)    End Sub    Public Function Parse(ByVal RootNamespace As String) As AssemblyDeclaration        Dim result As AssemblyDeclaration        result = ParseAssemblyDeclaration(RootNamespace)        If result Is Nothing Then Helper.ErrorRecoveryNotImplemented()        Return result    End Function    ''' <summary>    ''' Can be called multiple times. (Will just exit).    ''' </summary>    ''' <returns></returns>    ''' <remarks></remarks>    Private Function ParseFileHeader(ByVal CodeFile As CodeFile, ByVal [Assembly] As AssemblyDeclaration) As Boolean        Dim result As Boolean = True        Dim m_OptionExplicit As OptionExplicitStatement = CodeFile.OptionExplicit        Dim m_OptionStrict As OptionStrictStatement = CodeFile.OptionStrict        Dim m_OptionCompare As OptionCompareStatement = CodeFile.OptionCompare        Dim m_Imports As ImportsClauses = CodeFile.Imports        While tm.CurrentToken.Equals(KS.Option)            If OptionExplicitStatement.IsMe(tm) Then                If m_OptionExplicit IsNot Nothing Then                    Helper.NotImplemented() 'AddError                End If                m_OptionExplicit = ParseOptionExplicitStatement(CodeFile)                If m_OptionExplicit Is Nothing Then Helper.ErrorRecoveryNotImplemented()            ElseIf OptionStrictStatement.IsMe(tm) Then                If m_OptionStrict IsNot Nothing Then                    Helper.NotImplemented() 'AddError                End If                m_OptionStrict = ParseOptionStrictStatement(CodeFile)                If m_OptionStrict Is Nothing Then Helper.ErrorRecoveryNotImplemented()            ElseIf OptionCompareStatement.IsMe(tm) Then                If m_OptionCompare IsNot Nothing Then                    Helper.NotImplemented() 'AddError                End If                m_OptionCompare = ParseOptionCompareStatement(CodeFile)                If m_OptionCompare Is Nothing Then Helper.ErrorRecoveryNotImplemented()            Else                Helper.NotImplemented()            End If        End While        If m_Imports Is Nothing Then m_Imports = New ImportsClauses([Assembly])        Dim tmpImportsStatements As Generic.List(Of ImportsStatement)        tmpImportsStatements = ParseImportsStatements([Assembly])        For Each imp As ImportsStatement In tmpImportsStatements            m_Imports.AddRange(imp.Clauses)        Next        CodeFile.Init(m_OptionCompare, m_OptionStrict, m_OptionExplicit, m_Imports)        Return result    End Function    ''' <summary>    ''' OptionCompareStatement  ::=  "Option" "Compare" CompareOption  StatementTerminator    ''' CompareOption  ::=  "Binary" | "Text"    ''' </summary>    ''' <remarks></remarks>    Private Function ParseOptionCompareStatement(ByVal Parent As IBaseObject) As OptionCompareStatement        Dim result As New OptionCompareStatement(Parent)        Dim m_IsBinary As Boolean        tm.AcceptIfNotInternalError(KS.Option)        tm.AcceptIfNotInternalError("Compare")        If tm.Accept("Text") Then            m_IsBinary = False        ElseIf tm.Accept("Binary") Then            m_IsBinary = True        Else            Helper.NotImplemented() 'AddError        End If        If tm.AcceptEndOfStatement(, True) = False Then Helper.ErrorRecoveryNotImplemented()        result.Init(m_IsBinary)        Return result    End Function    ''' <summary>    ''' OptionStrictStatement  ::=  "Option" "Strict" [  OnOff  ]  StatementTerminator    ''' </summary>    ''' <remarks></remarks>    Private Function ParseOptionStrictStatement(ByVal Parent As IBaseObject) As OptionStrictStatement        Dim result As New OptionStrictStatement(Parent)        Dim m_Off As Boolean        tm.AcceptIfNotInternalError(KS.Option)        tm.AcceptIfNotInternalError("Strict")        If tm.Accept(KS.On) Then            m_Off = False        ElseIf tm.Accept("Off") Then            Compiler.Report.ShowMessage(Messages.VBNC99999, tm.PeekToken(-1).Location, "Option Strict Off will probably fail.")            m_Off = True        End If        If tm.AcceptEndOfStatement(, True) = False Then Helper.ErrorRecoveryNotImplemented()        result.Init(m_Off)        Return result    End Function    ''' <summary>    ''' OptionExplicitStatement  ::=  Option  Explicit  [  OnOff  ]  StatementTerminator    ''' </summary>    ''' <remarks></remarks>    Private Function ParseOptionExplicitStatement(ByVal Parent As IBaseObject) As OptionExplicitStatement        Dim result As New OptionExplicitStatement(Parent)        Dim m_Off As Boolean        tm.AcceptIfNotInternalError(KS.Option)        tm.AcceptIfNotInternalError("Explicit")        If tm.Accept(KS.On) Then            m_Off = False        ElseIf tm.Accept("Off") Then            m_Off = True        End If        If tm.AcceptEndOfStatement(, True) = False Then Helper.ErrorRecoveryNotImplemented()        result.Init(m_Off)        Return result    End Function    ''' <summary>    ''' ImportsClauses  ::= ImportsClause  | ImportsClauses  ","  ImportsClause    ''' </summary>    ''' <remarks></remarks>    Private Function ParseImportsClauses(ByVal Parent As ImportsStatement) As ImportsClauses        Dim result As New ImportsClauses(Parent)        If ParseList(Of ImportsClause)(result, New ParseDelegate_Parent(Of ImportsClause)(AddressOf ParseImportsClause), result) = False Then            Helper.ErrorRecoveryNotImplemented()        End If        Return result    End Function    ''' <summary>    ''' Parses clauses seen on the command line.    ''' ImportsClauses  ::= ImportsClause  | ImportsClauses  ","  ImportsClause    ''' </summary>    ''' <param name="str"></param>    ''' <returns></returns>    ''' <remarks></remarks>    Shared Function ParseImportsClauses(ByVal Parent As ImportsClauses, ByVal str As String) As Boolean        Dim result As Boolean = True        For Each clause As String In str.Split(","c)            If clause <> "" Then                Dim newClause As ImportsClause                newClause = ParseImportsClause(Parent, str)                If newClause Is Nothing Then Helper.ErrorRecoveryNotImplemented()                If Parent.Exists(newClause) Then                    If newClause.IsNamespaceClause Then '                        'ignore the duplication                    ElseIf newClause.IsAliasClause Then                        Parent.Compiler.Report.SaveMessage(Messages.VBNC30572, newClause.AsAliasClause.Name)                    Else                        Throw New InternalException("")                    End If                Else                    Parent.Add(newClause)                End If            End If        Next        Return result    End Function    ''' <summary>    ''' ImportsClause  ::=  ImportsAliasClause  |  ImportsNamespaceClause    ''' </summary>    ''' <remarks></remarks>    Private Shared Function ParseImportsClause(ByVal Parent As ParsedObject, ByVal str As String) As ImportsClause        Dim result As New ImportsClause(Parent)        If ImportsAliasClause.IsMe(str) Then            Dim m_Clause As ImportsAliasClause            m_Clause = ParseImportsAliasClause(Parent, str)            If m_Clause Is Nothing Then Helper.ErrorRecoveryNotImplemented()            result.Init(m_Clause)        Else            Dim m_Clause As ImportsNamespaceClause            m_Clause = ParseImportsNamespaceClause(Parent, str)            If m_Clause Is Nothing Then Helper.ErrorRecoveryNotImplemented()            result.Init(m_Clause)        End If        Return result    End Function    ''' <summary>    ''' ImportsClause  ::=  ImportsAliasClause  |  ImportsNamespaceClause    ''' </summary>    ''' <remarks></remarks>    Private Function ParseImportsClause(ByVal Parent As ParsedObject) As ImportsClause        Dim result As New ImportsClause(Parent)        If ImportsAliasClause.IsMe(tm) Then            Dim m_Clause As ImportsAliasClause            m_Clause = ParseImportsAliasClause(result)            If m_Clause Is Nothing Then Helper.ErrorRecoveryNotImplemented()            result.Init(m_Clause)        Else            Dim m_Clause As ImportsNamespaceClause            m_Clause = ParseImportsNamespaceClause(result)            If m_Clause Is Nothing Then Helper.ErrorRecoveryNotImplemented()            result.Init(m_Clause)        End If        Return result    End Function    ''' <summary>    ''' ImportsAliasClause  ::=    '''	Identifier  =  QualifiedIdentifier  |    '''	Identifier  =  ConstructedTypeName    '''     ''' ConstructedTypeName  ::=    '''	QualifiedIdentifier  "("  "Of"  TypeArgumentList  ")"    '''     ''' This overload is used when parsing commandline imports.    ''' </summary>    ''' <param name="str"></param>    ''' <returns></returns>    ''' <remarks></remarks>    Private Shared Function ParseImportsAliasClause(ByVal Parent As ParsedObject, ByVal str As String) As ImportsAliasClause        Dim result As New ImportsAliasClause(Parent)        Dim m_Identifier As Token = Nothing        Dim m_Second As ImportsNamespaceClause = Nothing        Dim values() As String = str.Split("="c)        If values.Length <> 2 Then Return Nothing        m_Identifier = Token.CreateIdentifierToken(Span.CommandLineSpan, values(0), TypeCharacters.Characters.None, False)        m_Second = ParseImportsNamespaceClause(result, values(1))        If m_Second Is Nothing Then Helper.ErrorRecoveryNotImplemented()        result.Init(m_Identifier, m_Second)        Return result    End Function    ''' <summary>    ''' ImportsAliasClause  ::=    '''	Identifier  =  QualifiedIdentifier  |    '''	Identifier  =  ConstructedTypeName    '''     ''' ConstructedTypeName  ::=    '''	QualifiedIdentifier  "("  "Of"  TypeArgumentList  ")"    ''' </summary>    ''' <remarks></remarks>    Private Function ParseImportsAliasClause(ByVal Parent As ParsedObject) As ImportsAliasClause        Dim result As New ImportsAliasClause(Parent)        Dim m_Identifier As Token = Nothing        Dim m_Second As ImportsNamespaceClause = Nothing        If tm.AcceptIdentifier(m_Identifier) = False Then Helper.ErrorRecoveryNotImplemented()        tm.AcceptIfNotInternalError(KS.Equals)        m_Second = ParseImportsNamespaceClause(result)        If m_Second Is Nothing Then Helper.ErrorRecoveryNotImplemented()        result.Init(m_Identifier, m_Second)        Return result    End Function    ''' <summary>    ''' ImportsNamespaceClause  ::=	QualifiedIdentifier  |	ConstructedTypeName    '''     ''' ConstructedTypeName  ::=    '''	QualifiedIdentifier  "("  "Of"  TypeArgumentList  ")"    '''        ''' Only namespaces, classes, structures, enumerated types, and standard modules may be imported.    ''' This overload is used when parsing commandline imports.    ''' </summary>    ''' <remarks></remarks>    Private Shared Function ParseImportsNamespaceClause(ByVal Parent As ParsedObject, ByVal str As String) As ImportsNamespaceClause        Dim result As New ImportsNamespaceClause(Parent)        Dim qi As QualifiedIdentifier = Nothing        qi = ParseQualifiedIdentifier(result, str)        If qi Is Nothing Then Helper.ErrorRecoveryNotImplemented()        result.Init(qi)        Return result    End Function    ''' <summary>    ''' ImportsNamespaceClause  ::=	QualifiedIdentifier  |	ConstructedTypeName    '''     ''' ConstructedTypeName  ::=    '''	QualifiedIdentifier  "("  "Of"  TypeArgumentList  ")"    '''        ''' Only namespaces, classes, structures, enumerated types, and standard modules may be imported.    ''' </summary>    ''' <remarks></remarks>    Private Function ParseImportsNamespaceClause(ByVal Parent As ParsedObject) As ImportsNamespaceClause        Dim result As New ImportsNamespaceClause(Parent)        Dim iCurrent As RestorablePoint = tm.GetRestorablePoint        Dim qi As QualifiedIdentifier        qi = ParseQualifiedIdentifier(result)

⌨️ 快捷键说明

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