parser(expressions).vb

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

VB
1,598
字号
                        Dim newDo As DoStatement                        newDo = ParseDoStatement(result, IsOneLiner)                        If newDo Is Nothing Then Helper.ErrorRecoveryNotImplemented()                        result.AddStatement(newDo)                    Case KS.Stop                        Dim newStop As StopStatement                        newStop = ParseStopStatement(result)                        If newStop Is Nothing Then Helper.ErrorRecoveryNotImplemented()                        result.AddStatement(newStop)                    Case KS.End                        Dim newEnd As EndStatement                        newEnd = ParseEndStatement(result)                        If newEnd Is Nothing Then Helper.ErrorRecoveryNotImplemented()                        result.AddStatement(newEnd)                    Case KS.While                        Dim newWhile As WhileStatement                        newWhile = ParseWhileStatement(result, IsOneLiner)                        If newWhile Is Nothing Then Helper.ErrorRecoveryNotImplemented()                        result.AddStatement(newWhile)                    Case KS.Exit                        Dim newExit As ExitStatement                        newExit = ParseExitStatement(result)                        If newExit Is Nothing Then Helper.ErrorRecoveryNotImplemented()                        result.AddStatement(newExit)                    Case KS.Return                        Dim newReturn As ReturnStatement                        newReturn = ParseReturnStatement(result)                        If newReturn Is Nothing Then Helper.ErrorRecoveryNotImplemented()                        result.AddStatement(newReturn)                    Case KS.For                        If tm.PeekToken.Equals(KS.Each) Then                            Dim newFor As ForEachStatement                            newFor = ParseForEachStatement(result, IsOneLiner)                            If newFor Is Nothing Then Helper.ErrorRecoveryNotImplemented()                            result.AddStatement(newFor)                        Else                            Dim newFor As ForStatement                            newFor = ParseForStatement(result, IsOneLiner)                            If newFor Is Nothing Then Helper.ErrorRecoveryNotImplemented()                            result.AddStatement(newFor)                        End If                    Case KS.Continue                        Dim newContinue As ContinueStatement                        newContinue = ParseContinueStatement(result, IsOneLiner)                        If newContinue Is Nothing Then Helper.ErrorRecoveryNotImplemented()                        result.AddStatement(newContinue)                    Case KS.GoTo                        Dim newGoto As GotoStatement                        newGoto = ParseGotoStatement(result)                        If newGoto Is Nothing Then Helper.ErrorRecoveryNotImplemented()                        result.AddStatement(newGoto)                    Case KS.On                        Dim newOnError As OnErrorStatement                        newOnError = ParseOnErrorStatement(result)                        If newOnError Is Nothing Then Helper.ErrorRecoveryNotImplemented()                        result.AddStatement(newOnError)                    Case KS.Error                        Dim newError As ErrorStatement                        newError = ParseErrorStatement(result)                        If newError Is Nothing Then Helper.ErrorRecoveryNotImplemented()                        result.AddStatement(newError)                    Case KS.AddHandler, KS.RemoveHandler                        Dim newAddHandler As AddOrRemoveHandlerStatement                        newAddHandler = ParseAddOrRemoveHandlerStatement(result)                        If newAddHandler Is Nothing Then Helper.ErrorRecoveryNotImplemented()                        result.AddStatement(newAddHandler)                    Case KS.RaiseEvent                        Dim newRaiseEvent As RaiseEventStatement                        newRaiseEvent = ParseRaiseEventStatement(result)                        If newRaiseEvent Is Nothing Then Helper.ErrorRecoveryNotImplemented()                        result.AddStatement(newRaiseEvent)                    Case KS.Call                        Dim newCall As CallStatement                        newCall = ParseCallStatement(result)                        If newCall Is Nothing Then Helper.ErrorRecoveryNotImplemented()                        result.AddStatement(newCall)                    Case KS.Erase                        Dim newErase As EraseStatement                        newErase = ParseEraseStatement(result)                        If newErase Is Nothing Then Helper.ErrorRecoveryNotImplemented()                        result.AddStatement(newErase)                    Case KS.ReDim                        Dim newReDim As ReDimStatement                        newReDim = ParseReDimStatement(result)                        If newReDim Is Nothing Then Helper.ErrorRecoveryNotImplemented()                        result.AddStatement(newReDim)                    Case KS.Resume                        Dim newResume As ResumeStatement                        newResume = ParseResumeStatement(result)                        If newResume Is Nothing Then Helper.ErrorRecoveryNotImplemented()                        result.AddStatement(newResume)                    Case KS.Using                        Dim newUsing As UsingStatement                        newUsing = ParseUsingStatement(result, IsOneLiner)                        If newUsing Is Nothing Then Helper.ErrorRecoveryNotImplemented()                        result.AddStatement(newUsing)                    Case Else                        breakloop = True                End Select            ElseIf tm.CurrentToken.Equals(KS.Colon) Then                'tm.NextToken()            Else                breakloop = True            End If            If breakloop = False Then                If IsOneLiner Then                    If tm.Accept(KS.Colon) = False Then                        breakloop = True                    End If                Else                    If tm.AcceptEndOfStatement(False, True) = False Then Helper.ErrorRecoveryNotImplemented()                End If            End If            If result.FirstStatement Is Nothing AndAlso breakloop = False Then                If result.Statements.Count = 1 Then                    result.FirstStatement = result.Statements(0)                    'ElseIf result.Variables.Count >= 1 Then                    'result.FirstStatement = result.Variables(0)                ElseIf result.Statements.Count > 1 Then 'OrElse result.Variables.Count > 1 Then                    Throw New InternalException(result)                Else                    'Do nothing. No statements were parsed.                End If            End If        Loop Until breakloop = True        Return result    End Function    Private Function ParseExpressionList(ByVal Parent As ParsedObject) As ExpressionList        Dim result As New ExpressionList(Parent)        If ParseList(Of Expression)(result, New ParseDelegate_Parent(Of Expression)(AddressOf ParseExpression), Parent) = False Then            Helper.ErrorRecoveryNotImplemented()        End If        Return result    End Function    <Obsolete()> Private Function ParseExpression() As Expression        Dim result As Expression = Nothing        Helper.NotImplemented()        '        result = ParseOr_OrElse_Xor(Info)        Return result    End Function    Private Function ParseExpression(ByVal Info As ExpressionParseInfo) As Expression        Dim result As Expression = Nothing        result = ParseOr_OrElse_Xor(Info)        Return result    End Function    Public Function ParseExpression(ByVal Parent As ParsedObject) As Expression        Dim result As Expression = Nothing        result = ParseOr_OrElse_Xor(New ExpressionParseInfo(Parent))        Return result    End Function    ''' <summary>    ''' GetTypeExpression ::= "GetType" "(" GetTypeTypeName ")"    ''' </summary>    ''' <returns></returns>    ''' <remarks></remarks>    Private Function ParseGetTypeExpression(ByVal Parent As ParsedObject) As GetTypeExpression        Dim result As New GetTypeExpression(Parent)        tm.AcceptIfNotInternalError(KS.GetType)        If tm.AcceptIfNotError(KS.LParenthesis) = False Then Helper.ErrorRecoveryNotImplemented()        Dim m_TypeName As GetTypeTypeName        m_TypeName = ParseGetTypeTypeName(result)        If tm.AcceptIfNotError(KS.RParenthesis) = False Then Helper.ErrorRecoveryNotImplemented()        result.init(m_TypeName)        Return result    End Function    Private Function Parse(ByVal Info As ExpressionParseInfo) As Expression        Dim result As Expression        result = ParseOr_OrElse_Xor(Info)        Return result    End Function    Private Function ParseIdentifier(ByVal Info As ExpressionParseInfo) As Expression        Dim value As Expression = Nothing        Dim result As Boolean = True        If tm.CurrentToken.IsLiteral Then            value = ParseLiteralExpression(Info.Parent)            If value Is Nothing Then helper.ErrorRecoveryNotImplemented()        ElseIf tm.CurrentToken = KS.Dot Then            value = ParseMemberAccessExpression(Info.Parent, Nothing)            If value Is Nothing Then Helper.ErrorRecoveryNotImplemented()        ElseIf tm.CurrentToken = KS.Exclamation Then            value = ParseDictionaryAccessExpression(Info.Parent, Nothing)            If value Is Nothing Then helper.ErrorRecoveryNotImplemented()        ElseIf tm.CurrentToken.Equals(Enums.BuiltInTypeTypeNames) Then            value = ParseBuiltInTypeExpression(Info.Parent)            If value Is Nothing Then helper.ErrorRecoveryNotImplemented()        ElseIf tm.CurrentToken.IsIdentifier Then            value = ParseSimpleNameExpression(Info.Parent)            If value Is Nothing Then Helper.ErrorRecoveryNotImplemented()        ElseIf tm.CurrentToken = KS.LBrace Then            value = ParseArrayInitializerExpression(Info.Parent)            If value Is Nothing Then helper.ErrorRecoveryNotImplemented()        ElseIf tm.CurrentToken = KS.LParenthesis Then            value = ParseParenthesizedExpression(Info.Parent)            If value Is Nothing Then Helper.ErrorRecoveryNotImplemented()        ElseIf tm.CurrentToken.Equals(KS.Add, KS.Minus) Then            value = ParseUnaryPlusMinus(Info)            If value Is Nothing Then Helper.ErrorRecoveryNotImplemented()        ElseIf tm.CurrentToken.IsKeyword Then            Select Case tm.CurrentToken.Keyword                Case KS.Not                    value = ParseNot(Info)                Case KS.DirectCast, KS.TryCast, KS.CType                    value = ParseCTypeExpression(Info.Parent, tm.CurrentToken.Keyword)                Case KS.AddressOf                    value = ParseAddressOfExpression(Info.Parent)                Case KS.[New]                    value = ParseNewExpression(Info.Parent)                Case KS.CInt                    value = ParseCIntExpression(Info.Parent)                Case KS.CBool                    value = ParseCBoolExpression(Info.Parent)                Case KS.CByte                    value = ParseCByteExpression(Info.Parent)                Case KS.CChar                    value = ParseCCharExpression(Info.Parent)                Case KS.CDate                    value = ParseCDateExpression(Info.Parent)                Case KS.CDbl                    value = ParseCDblExpression(Info.Parent)                Case KS.CDec                    value = ParseCDecExpression(Info.Parent)                Case KS.CLng                    value = ParseCLngExpression(Info.Parent)                Case KS.CObj                    value = ParseCObjExpression(Info.Parent)                Case KS.CSByte                    value = ParseCSByteExpression(Info.Parent)                Case KS.CShort                    value = ParseCShortExpression(Info.Parent)                Case KS.CSng                    value = ParseCSngExpression(Info.Parent)                Case KS.CStr                    value = ParseCStrExpression(Info.Parent)                Case KS.CUInt                    value = ParseCUIntExpression(Info.Parent)                Case KS.CULng                    value = ParseCULngExpression(Info.Parent)                Case KS.CUShort                    value = ParseCUShortExpression(Info.Parent)                Case KS.True, KS.False                    value = ParseBooleanLiteralExpression(Info.Parent)                Case KS.Nothing                    tm.AcceptIfNotInternalError(KS.Nothing)                    value = New NothingConstantExpression(Info.Parent)                Case KS.GetType                    value = ParseGetTypeExpression(Info.Parent)                Case KS.TypeOf                    value = ParseTypeOfExpression(Info.Parent)                Case KS.Me                    value = ParseMeExpression(Info.Parent)                Case KS.MyBase                    value = ParseMyBaseExpression(Info.Parent)                Case KS.MyClass                    value = ParseMyClassExpression(Info.Parent)                Case KS.Global                    Dim newGlobal As GlobalExpression                    newGlobal = ParseGlobalExpression(Info.Parent)                    value = ParseMemberAccessExpression(Info.Parent, newGlobal)                Case Else                    Helper.Stop()            End Select            If value Is Nothing Then Helper.ErrorRecoveryNotImplemented()        Else            value = Nothing        End If        Do While result            If tm.CurrentToken = KS.Dot Then                Dim newExp As MemberAccessExpression                newExp = ParseMemberAccessExpression(Info.Parent, value)                value = newExp            ElseIf tm.CurrentToken = KS.Exclamation Then                Dim newExp As DictionaryAccessExpression                newExp = ParseDictionaryAccessExpression(Info.Parent, value)                value = newExp            ElseIf tm.CurrentToken = KS.LParenthesis Then                Dim newExp As InvocationOrIndexExpression                newExp = ParseInvocationOrIndexExpression(Info.Parent, value)                value = newExp            Else                Exit Do            End If            If value Is Nothing Then Helper.ErrorRecoveryNotImplemented()        Loop        Return value    End Function    Private Function ParseExponent(ByVal Info As ExpressionParseInfo) As Expression        Dim lSide, rSide As Expression        lSide = ParseIdentifier(Info)        While tm.Accept(KS.Power)            rSide = ParseIdentifier(Info)            lSide = New ExponentExpression(Info.Parent, lSide, rSide)

⌨️ 快捷键说明

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