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 + -
显示快捷键?