parser(statements).vb

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

VB
1,146
字号
            If IsOneLiner = False Then                m_OneLiner = Not tm.AcceptEndOfStatement(False, False)            Else                m_OneLiner = True            End If        End If        m_TrueCode = ParseCodeBlock(result, m_OneLiner)        If m_TrueCode Is Nothing Then Helper.ErrorRecoveryNotImplemented()        m_ElseIfs = New BaseObjects(Of ElseIfStatement)(result)        While tm.CurrentToken = KS.ElseIf OrElse (m_OneLiner = False AndAlso tm.CurrentToken = KS.Else AndAlso tm.PeekToken = KS.If)            Dim newElseIf As ElseIfStatement            newElseIf = ParseElseIfStatement(result, m_OneLiner)            m_ElseIfs.Add(newElseIf)        End While        If tm.Accept(KS.Else) Then            If m_OneLiner = False Then                If tm.AcceptEndOfStatement(False, True) = False Then Helper.ErrorRecoveryNotImplemented()            End If            m_FalseCode = ParseCodeBlock(result, m_OneLiner)            If m_FalseCode Is Nothing Then Helper.ErrorRecoveryNotImplemented()        Else            m_FalseCode = Nothing        End If        If m_OneLiner = False Then tm.AcceptIfNotError(KS.End_If)        result.Init(m_Condition, m_FalseCode, m_TrueCode, m_OneLiner, m_ElseIfs)        Return result    End Function    ''' <summary>    ''' ElseIfStatement  ::=    '''	   "ElseIf" BooleanExpression  [  Then  ]  StatementTerminator    '''	        [  Block  ]    ''' </summary>    ''' <remarks></remarks>    Private Function ParseElseIfStatement(ByVal Parent As ParsedObject, ByVal IsOneLiner As Boolean) As ElseIfStatement        Dim result As New ElseIfStatement(Parent)        Dim m_Condition As Expression        Dim m_Code As CodeBlock        If tm.Accept(KS.Else) Then            'This is not in the spec, but MS is accepting it anyway.            'See test Bugs/aspnet2.vb for a test case.            tm.AcceptIfNotInternalError(KS.If)        Else            tm.AcceptIfNotInternalError(KS.ElseIf)        End If        m_Condition = ParseExpression(result)        If m_Condition Is Nothing Then Helper.ErrorRecoveryNotImplemented()        'ElseIf cannot be a oneliner...        tm.Accept(KS.Then) '"Then" is not required.        If tm.AcceptEndOfStatement(, True) = False Then Helper.ErrorRecoveryNotImplemented()        If IsOneLiner Then            Helper.AddError()            'TODO: Add error,         End If        m_Code = ParseCodeBlock(result, IsOneLiner)        If m_Code Is Nothing Then Helper.ErrorRecoveryNotImplemented()        result.Init(m_Code, m_Condition)        Return result    End Function    ''' <summary>    ''' SelectStatement  ::=    '''	   "Select" [ "Case" ]  Expression  StatementTerminator    '''	        [  CaseStatement+  ]    '''	        [  CaseElseStatement  ]    '''	   "End" "Select" StatementTerminator    ''' </summary>    ''' <remarks></remarks>    Private Function ParseSelectStatement(ByVal Parent As ParsedObject, ByVal IsOneLiner As Boolean) As SelectStatement        Dim result As New SelectStatement(Parent)        Dim m_Test As Expression        Dim m_Cases As BaseObjects(Of CaseStatement)        tm.AcceptIfNotInternalError(KS.Select)        tm.Accept(KS.Case) '"Case" is not required        m_Test = ParseExpression(result)        If m_Test Is Nothing Then Helper.ErrorRecoveryNotImplemented()        If tm.AcceptEndOfStatement(IsOneLiner, True) = False Then Helper.ErrorRecoveryNotImplemented()        m_Cases = New BaseObjects(Of CaseStatement)(result)        While tm.CurrentToken = KS.Case            Dim newCase As CaseStatement            newCase = ParseCaseStatement(result, IsOneLiner)            m_Cases.Add(newCase)        End While        If tm.Accept(KS.End_Select) = False Then Helper.ErrorRecoveryNotImplemented()        result.Init(m_Test, m_Cases)        Return result    End Function    ''' <summary>    ''' CaseStatement  ::=    '''	   "Case" CaseClauses  StatementTerminator    '''	        [  Block  ]    ''' CaseElseStatement  ::=    '''	   "Case" "Else" StatementTerminator    '''	   [  Block  ]    ''' </summary>    ''' <remarks></remarks>    Private Function ParseCaseStatement(ByVal Parent As ParsedObject, ByVal IsOneLiner As Boolean) As CaseStatement        Dim result As New CaseStatement(Parent)        Dim m_IsElse As Boolean        Dim m_Clauses As CaseClauses        Dim m_Block As CodeBlock        tm.AcceptIfNotInternalError(KS.Case)        If tm.Accept(KS.Else) Then            m_IsElse = True            m_Clauses = Nothing        Else            m_Clauses = New CaseClauses(result)            If ParseList(Of CaseClause)(m_Clauses, New ParseDelegate_Parent(Of CaseClause)(AddressOf ParseCaseClause), result) = False Then                Helper.ErrorRecoveryNotImplemented()            End If        End If        If tm.AcceptEndOfStatement(IsOneLiner, True) = False Then Helper.NotImplemented()        m_Block = ParseCodeBlock(result, IsOneLiner)        If m_Block Is Nothing Then Helper.NotImplemented()        result.Init(m_IsElse, m_Clauses, m_Block)        Return result    End Function    Private Function ParseCallStatement(ByVal Parent As ParsedObject) As CallStatement        Dim result As New CallStatement(Parent)        Dim m_Target As Expression        tm.AcceptIfNotInternalError(KS.Call)        m_Target = ParseExpression(result)        result.Init(m_Target)        Return result    End Function    ''' <summary>    ''' ForEachStatement  ::=    '''	   "For" "Each" LoopControlVariable "In" Expression  StatementTerminator    '''	         [  Block  ]    '''	   "Next" [Expression  ]  StatementTerminator    ''' </summary>    ''' <remarks></remarks>    Private Function ParseForEachStatement(ByVal Parent As ParsedObject, ByVal IsOneLiner As Boolean) As ForEachStatement        Dim result As New ForEachStatement(Parent)        Dim m_LoopControlVariable As LoopControlVariable        Dim m_InExpression As Expression        Dim m_NextExpression As Expression        Dim m_Code As CodeBlock        tm.AcceptIfNotInternalError(KS.For)        tm.AcceptIfNotInternalError(KS.Each)        m_LoopControlVariable = ParseLoopControlVariable(result)        If m_LoopControlVariable Is Nothing Then Helper.ErrorRecoveryNotImplemented()        If tm.AcceptIfNotError(KS.In) = False Then Helper.ErrorRecoveryNotImplemented()        m_InExpression = ParseExpression(result)        If m_InExpression Is Nothing Then Helper.ErrorRecoveryNotImplemented()        If tm.AcceptEndOfStatement(, True) = False Then Helper.ErrorRecoveryNotImplemented()        m_Code = ParseCodeBlock(result, IsOneLiner)        If m_Code Is Nothing Then Helper.ErrorRecoveryNotImplemented()        If tm.AcceptIfNotError(KS.Next) = False Then Helper.ErrorRecoveryNotImplemented()        If tm.CurrentToken.IsEndOfStatement = False Then            m_NextExpression = ParseExpression(result)            If m_NextExpression Is Nothing Then Helper.ErrorRecoveryNotImplemented()        Else            m_NextExpression = Nothing        End If        result.Init(m_LoopControlVariable, m_InExpression, m_NextExpression, m_Code)        Return result    End Function    ''' <summary>    ''' ForStatement  ::=    '''	   "For" LoopControlVariable  "="  Expression  "To"  Expression  [  "Step"  Expression  ]  StatementTerminator    '''	      [ Block  ]    '''	   "Next" [  NextExpressionList  ]  StatementTerminator    ''' LoopControlVariable  ::=    '''	   Identifier  [  ArrayNameModifier  ] "As" TypeName  |    '''	   Expression    ''' NextExpressionList  ::=    '''	   Expression  |    '''	   NextExpressionList "," Expression    ''' </summary>    ''' <remarks></remarks>    Private Function ParseForStatement(ByVal Parent As ParsedObject, ByVal IsOneLiner As Boolean) As ForStatement        Dim result As New ForStatement(Parent)        Dim m_LoopControlVariable As LoopControlVariable        Dim m_LoopStartExpression As Expression        Dim m_LoopEndExpression As Expression        Dim m_LoopStepExpression As Expression        Dim m_NextExpressionList As ExpressionList        Dim m_Code As CodeBlock        tm.AcceptIfNotInternalError(KS.For)        m_LoopControlVariable = ParseLoopControlVariable(result)        If m_LoopControlVariable Is Nothing Then Helper.ErrorRecoveryNotImplemented()        If tm.AcceptIfNotError(KS.Equals) = False Then Helper.ErrorRecoveryNotImplemented()        m_LoopStartExpression = ParseExpression(result)        If m_LoopStartExpression Is Nothing Then Helper.ErrorRecoveryNotImplemented()        If tm.AcceptIfNotError(KS.To) = False Then Helper.ErrorRecoveryNotImplemented()        m_LoopEndExpression = ParseExpression(result)        If m_LoopEndExpression Is Nothing Then Helper.ErrorRecoveryNotImplemented()        If tm.Accept(KS.Step) Then            m_LoopStepExpression = ParseExpression(result)            If m_LoopStepExpression Is Nothing Then Helper.ErrorRecoveryNotImplemented()        Else            m_LoopStepExpression = Nothing        End If        If tm.AcceptEndOfStatement(, True) = False Then Helper.ErrorRecoveryNotImplemented()        m_Code = ParseCodeBlock(result, IsOneLiner)        If m_Code Is Nothing Then Helper.ErrorRecoveryNotImplemented()        If tm.AcceptIfNotError(KS.Next) = False Then Helper.ErrorRecoveryNotImplemented()        If tm.CurrentToken.IsEndOfStatement = False Then            m_NextExpressionList = New ExpressionList(result)            If ParseList(Of Expression)(m_NextExpressionList, New ParseDelegate_Parent(Of Expression)(AddressOf ParseExpression), result) = False Then                Helper.ErrorRecoveryNotImplemented()            End If        Else            m_NextExpressionList = Nothing        End If        result.Init(m_LoopControlVariable, m_LoopStartExpression, m_LoopEndExpression, m_LoopStepExpression, m_NextExpressionList, m_Code)        Return result    End Function    Private Function ParseCaseClause(ByVal Parent As ParsedObject) As CaseClause        Dim result As New CaseClause(Parent)        Dim m_Expression1 As Expression        Dim m_Expression2 As Expression = Nothing        Dim m_Comparison As KS        If tm.Accept(KS.Is) Then            If tm.CurrentToken.Equals(CaseClause.RelationalOperators) = False Then                Compiler.Report.ShowMessage(Messages.VBNC30239)                m_Comparison = KS.Equals            Else                m_Comparison = tm.CurrentToken.Symbol                tm.NextToken()            End If            m_Expression1 = ParseExpression(result)            If m_Expression1 Is Nothing Then Helper.ErrorRecoveryNotImplemented()        ElseIf tm.CurrentToken.Equals(CaseClause.RelationalOperators) Then            m_Comparison = tm.CurrentToken.Symbol            tm.NextToken()            m_Expression1 = ParseExpression(result)            If m_Expression1 Is Nothing Then Helper.ErrorRecoveryNotImplemented()        Else            m_Expression1 = ParseExpression(result)            If m_Expression1 Is Nothing Then Helper.ErrorRecoveryNotImplemented()            If tm.Accept(KS.To) Then                m_Expression2 = ParseExpression(result)                If m_Expression2 Is Nothing Then Helper.ErrorRecoveryNotImplemented()            End If        End If        result.Init(m_Expression1, m_Expression2, m_Comparison)        Return result    End Function    ''' <summary>    ''' AddHandlerStatement  ::= "AddHandler" Expression  ,  Expression  StatementTerminator    ''' RemoveHandlerStatement  ::= "RemoveHandler" Expression "," Expression  StatementTerminator    ''' </summary>    ''' <remarks></remarks>    Private Function ParseAddOrRemoveHandlerStatement(ByVal Parent As ParsedObject) As AddOrRemoveHandlerStatement        Dim result As New AddOrRemoveHandlerStatement(Parent)        Dim m_Event As Expression        Dim m_EventHandler As Expression        Dim m_IsAddHandler As Boolean        If tm.Accept(KS.AddHandler) Then            m_IsAddHandler = True        ElseIf tm.Accept(KS.RemoveHandler) Then            m_IsAddHandler = False        Else            Throw New InternalException(result)        End If        m_Event = ParseExpression(result)        If m_Event Is Nothing Then Helper.ErrorRecoveryNotImplemented()        If tm.Accept(KS.Comma) = False Then Helper.ErrorRecoveryNotImplemented()        m_EventHandler = ParseExpression(result)        If m_EventHandler Is Nothing Then Helper.ErrorRecoveryNotImplemented()        result.Init(m_Event, m_EventHandler, m_IsAddHandler)        Return result    End Function    Private Function ParseImportsStatements(ByVal Parent As ParsedObject) As Generic.List(Of ImportsStatement)        Dim result As New Generic.List(Of ImportsStatement)        While ImportsStatement.IsMe(tm)            Dim newI As ImportsStatement            newI = ParseImportsStatement(Parent)            result.Add(newI)        End While        Return result    End Function    ''' <summary>    ''' ImportsStatement  ::=  "Imports" ImportsClauses  StatementTerminator    ''' </summary>    ''' <remarks></remarks>    Private Function ParseImportsStatement(ByVal Parent As ParsedObject) As ImportsStatement        Dim result As New ImportsStatement(Parent)        Dim m_Clauses As ImportsClauses        tm.AcceptIfNotInternalError(KS.Imports)        m_Clauses = ParseImportsClauses(result)        If m_Clauses Is Nothing Then Helper.ErrorRecoveryNotImplemented()        If tm.AcceptEndOfStatement(, True) = False Then Helper.ErrorRecoveryNotImplemented()        result.Init(m_Clauses)        Return result    End Function    ''' <summary>    ''' Parses a imports statement as specified on the commandline.    ''' </summary>    ''' <param name="str"></param>    ''' <returns></returns>    ''' <remarks></remarks>    Public Shared Function ParseImportsStatement(ByVal Parent As ImportsStatement, ByVal str As String) As Boolean        Dim result As Boolean = True        Helper.Assert(Parent IsNot Nothing)        Helper.Assert(Parent.Clauses IsNot Nothing)        result = ParseImportsClauses(Parent.Clauses, str) AndAlso result        Return result    End FunctionEnd Class

⌨️ 快捷键说明

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