parser(expressions).vb

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

VB
1,598
字号
        End While        Return lSide    End Function    Private Function ParseUnaryPlusMinus(ByVal Info As ExpressionParseInfo) As Expression        Dim result As UnaryExpression        If tm.CurrentToken = KS.Add Then            result = ParseUnaryPlusExpression(Info)        ElseIf tm.CurrentToken = KS.Minus Then            result = ParseUnaryMinusExpression(Info)        Else            Return ParseExponent(Info)        End If        Return result    End Function    Private Function ParseMultDiv(ByVal Info As ExpressionParseInfo) As Expression        Dim lSide, rSide As Expression        lSide = ParseUnaryPlusMinus(Info)        While tm.CurrentToken.Equals(KS.Mult, KS.RealDivision)            Dim op As KS            op = tm.CurrentToken.Symbol            tm.NextToken()            rSide = ParseUnaryPlusMinus(Info)            If op = KS.Mult Then                lSide = New MultExpression(Info.Parent, lSide, rSide)            ElseIf op = KS.RealDivision Then                lSide = New RealDivisionExpression(Info.Parent, lSide, rSide)            Else                Throw New InternalException(tm.CurrentToken.Location)            End If        End While        Return lSide    End Function    Private Function ParseIntDiv(ByVal Info As ExpressionParseInfo) As Expression        Dim lSide, rSide As Expression        lSide = ParseMultDiv(Info)        While tm.Accept(KS.IntDivision)            rSide = ParseMultDiv(Info)            lSide = New IntDivisionExpression(Info.Parent, lSide, rSide)        End While        Return lSide    End Function    Private Function ParseMod(ByVal Info As ExpressionParseInfo) As Expression        Dim lSide, rSide As Expression        lSide = ParseIntDiv(Info)        While tm.Accept(KS.Mod)            rSide = ParseIntDiv(Info)            lSide = New ModExpression(Info.Parent, lSide, rSide)        End While        Return lSide    End Function    Private Function ParsePlusMinus(ByVal Info As ExpressionParseInfo) As Expression        Dim lSide, rSide As Expression        lSide = ParseMod(Info)        While tm.CurrentToken.Equals(KS.Add, KS.Minus)            Dim op As KS            op = tm.CurrentToken.Symbol            tm.NextToken()            rSide = ParseMod(Info)            If op = KS.Add Then                lSide = New BinaryAddExpression(Info.Parent, lSide, rSide)            ElseIf op = KS.Minus Then                lSide = New BinarySubExpression(Info.Parent, lSide, rSide)            Else                Throw New InternalException(tm.CurrentToken.Location)            End If        End While        Return lSide    End Function    Private Function ParseConcat(ByVal Info As ExpressionParseInfo) As Expression        Dim lSide, rSide As Expression        lSide = ParsePlusMinus(Info)        While tm.Accept(KS.Concat)            rSide = ParsePlusMinus(Info)            lSide = New ConcatExpression(Info.Parent, lSide, rSide)        End While        Return lSide    End Function    Private Function ParseBitshift(ByVal Info As ExpressionParseInfo) As Expression        Dim lSide, rSide As Expression        lSide = ParseConcat(Info)        While tm.CurrentToken.Equals(KS.ShiftRight, KS.ShiftLeft)            Dim op As KS            op = tm.CurrentToken.Symbol            tm.NextToken()            rSide = ParseConcat(Info)            If op = KS.ShiftRight Then                lSide = New RShiftExpression(Info.Parent, lSide, rSide)            ElseIf op = KS.ShiftLeft Then                lSide = New LShiftExpression(Info.Parent, lSide, rSide)            Else                Throw New InternalException(tm.CurrentToken.Location)            End If        End While        Return lSide    End Function    Private Function ParseComparison(ByVal Info As ExpressionParseInfo) As Expression        Dim lSide, rSide As Expression        lSide = ParseBitshift(Info)        While tm.CurrentToken.Equals(KS.NotEqual, KS.LE, KS.LT, KS.GT, KS.GE, KS.Like, KS.IsNot) OrElse _          (tm.CurrentToken = KS.Equals AndAlso Info.IsLeftSide = False) OrElse _          (tm.CurrentToken = KS.Is AndAlso Info.IsInTypeOf = False)            Dim op As KS            If tm.CurrentToken.IsSymbol Then                op = tm.CurrentToken.Symbol            ElseIf tm.CurrentToken.IsKeyword Then                op = tm.CurrentToken.Keyword            Else                Throw New InternalException(tm.CurrentToken.Location)            End If            tm.NextToken()            rSide = ParseBitshift(Info)            If op = KS.Equals Then                lSide = New EqualsExpression(Info.Parent, lSide, rSide)            ElseIf op = KS.NotEqual Then                lSide = New NotEqualsExpression(Info.Parent, lSide, rSide)            ElseIf op = KS.GE Then                lSide = New GEExpression(Info.Parent, lSide, rSide)            ElseIf op = KS.GT Then                lSide = New GTExpression(Info.Parent, lSide, rSide)            ElseIf op = KS.LE Then                lSide = New LEExpression(Info.Parent, lSide, rSide)            ElseIf op = KS.LT Then                lSide = New LTExpression(Info.Parent, lSide, rSide)            ElseIf op = KS.Is OrElse op = KS.IsNot Then                lSide = New Is_IsNotExpression(Info.Parent, lSide, rSide, op)            ElseIf op = KS.Like Then                lSide = New LikeExpression(Info.Parent, lSide, rSide)            Else                Throw New InternalException(tm.CurrentToken.Location)            End If        End While        Return lSide    End Function    Private Function ParseNot(ByVal Info As ExpressionParseInfo) As Expression        Dim result As UnaryNotExpression        If tm.CurrentToken = KS.Not Then            result = ParseUnaryNotExpression(Info.Parent)        Else            Return ParseComparison(Info)        End If        Return result    End Function    Private Function ParseAnd_AndAlso(ByVal Info As ExpressionParseInfo) As Expression        Dim lSide, rSide As Expression        lSide = ParseNot(Info)        While tm.CurrentToken.Equals(KS.And, KS.AndAlso)            Dim op As KS            op = tm.CurrentToken.Keyword            tm.NextToken()            rSide = ParseNot(Info)            If op = KS.And Then                lSide = New AndExpression(Info.Parent, lSide, rSide)            ElseIf op = KS.AndAlso Then                lSide = New AndAlsoExpression(Info.Parent, lSide, rSide)            Else                Throw New InternalException(tm.CurrentToken.Location)            End If        End While        Return lSide    End Function    Private Function ParseOr_OrElse_Xor(ByVal Info As ExpressionParseInfo) As Expression        Dim lSide, rSide As Expression        lSide = ParseAnd_AndAlso(Info)        While tm.CurrentToken.Equals(KS.Or, KS.OrElse, KS.Xor)            Dim op As KS            op = tm.CurrentToken.Keyword            tm.NextToken()            rSide = ParseAnd_AndAlso(Info)            If op = KS.Or Then                lSide = New OrExpression(Info.Parent, lSide, rSide)            ElseIf op = KS.OrElse Then                lSide = New OrElseExpression(Info.Parent, lSide, rSide)            ElseIf op = KS.Xor Then                lSide = New XOrExpression(Info.Parent, lSide, rSide)            Else                Throw New InternalException(tm.CurrentToken.Location)            End If        End While        Return lSide    End Function    ''' <summary>    ''' AddressOfExpression  ::= "AddressOf" Expression    ''' </summary>    ''' <remarks></remarks>    Private Function ParseAddressOfExpression(ByVal Parent As ParsedObject) As AddressOfExpression        Dim result As New AddressOfExpression(Parent)        Dim m_Expression As Expression        tm.AcceptIfNotInternalError(KS.AddressOf)        m_Expression = ParseExpression(result)        result.Init(m_Expression)        Return result    End Function    ''' <summary>    ''' "TypeOf" Expression "Is" TypeName    ''' </summary>    ''' <remarks></remarks>    Private Function ParseTypeOfExpression(ByVal Parent As ParsedObject) As TypeOfExpression        Dim result As New TypeOfExpression(Parent)        Dim m_Expression As Expression        Dim m_Is As Boolean        Dim m_Type As TypeName        tm.AcceptIfNotInternalError(KS.TypeOf)        m_Expression = ParseExpression(New ExpressionParseInfo(result, False, True))        If m_Expression Is Nothing Then Helper.ErrorRecoveryNotImplemented()        If tm.Accept(KS.Is) Then            m_Is = True        ElseIf tm.Accept(KS.IsNot) Then            m_Is = False        Else            Helper.NotImplemented() 'TODO: compiler.Report.ShowMessage  Messages.VBNC30001            Return Nothing        End If        m_Type = ParseTypeName(result)        If m_Type Is Nothing Then Helper.ErrorRecoveryNotImplemented()        result.Init(m_Expression, m_Is, m_Type)        Return result    End Function    ''' <summary>    ''' LiteralExpression  ::=  Literal    ''' </summary>    ''' <remarks></remarks>    Private Function ParseLiteralExpression(ByVal Parent As ParsedObject) As LiteralExpression        Dim result As LiteralExpression        Dim m_Value As Token        m_Value = tm.CurrentToken        If m_Value.IsLiteral = False Then            result = Nothing        Else            result = New LiteralExpression(Parent)            result.Init(m_Value)            tm.NextToken()        End If        Return result    End Function    Private Function ParseBooleanLiteralExpression(ByVal Parent As ParsedObject) As BooleanLiteralExpression        Dim result As New BooleanLiteralExpression(Parent)        Dim m_Value As Boolean        If tm.Accept(KS.True) Then            m_Value = True        ElseIf tm.Accept(KS.False) Then            m_Value = False        Else            Throw New InternalException(result)        End If        result.Init(m_Value)        Return result    End FunctionEnd Class

⌨️ 快捷键说明

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