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