scanner.vb

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

VB
1,307
字号
                                Case BuiltInDataTypes.UShort                                    If IntegerValue > UShort.MaxValue Then bOutOfRange = True                                Case Else                                    Throw New InternalException("")                            End Select                            If bOutOfRange AndAlso typeCharacter <> LiteralTypeCharacters_Characters.None Then                                Compiler.Report.ShowMessage(Messages.VBNC30439, typeCharacter.ToString)                            End If                            GetNumber = GetIntegralToken(ULong.Parse(strResult, Helper.USCulture), Base, typeCharacter)                        Case Else                            Compiler.Report.ShowMessage(Messages.VBNC90002, typeCharacter.ToString)                            GetNumber = Token.CreateDoubleToken(GetCurrentLocation, 0, LiteralTypeCharacters_Characters.None)                    End Select                Catch ex As System.OverflowException                    Compiler.Report.ShowMessage(Messages.VBNC30036)                    GetNumber = Token.CreateDoubleToken(GetCurrentLocation, 0, LiteralTypeCharacters_Characters.None)                Catch ex As Exception                    Compiler.Report.ShowMessage(Messages.VBNC90005)                    GetNumber = Token.CreateDoubleToken(GetCurrentLocation, 0, LiteralTypeCharacters_Characters.None)                End Try#If EXTENDED Then            Case IntegerBase.Binary                Try                    IntegerValue = Helper.BinToInt(strResult)                    IntegerValue = ConvertNonDecimalBits(IntegerValue, typeCharacter)                Catch ex As Exception                    Compiler.Report.ShowMessage(Messages.VBNC90006, "binary")                End Try                GetNumber = GetIntegralToken(IntegerValue, Base, typeCharacter)#End If            Case IntegerBase.Hex                Try                    'Console.WriteLine("Hex: " & strResult)                    IntegerValue = Helper.HexToInt(strResult)                Catch ex As Exception                    Compiler.Report.ShowMessage(Messages.VBNC90006, Me.GetCurrentLocation, "hexadecimal")                End Try                GetNumber = GetIntegralToken(IntegerValue, Base, typeCharacter)            Case IntegerBase.Octal                Try                    IntegerValue = Helper.OctToInt(strResult)                Catch ex As Exception                    Compiler.Report.ShowMessage(Messages.VBNC90006, "octal")                End Try                GetNumber = GetIntegralToken(IntegerValue, Base, typeCharacter)            Case Else                Throw New InternalException(GetCurrentLocation.ToString(Compiler))        End Select    End Function    Private Function GetIntegralToken(ByVal Value As ULong, ByVal Base As IntegerBase, ByVal TypeCharacter As LiteralTypeCharacters_Characters) As Token        Dim case_type As BuiltInDataTypes        'TODO: Check bounds of value         If TypeCharacter = LiteralTypeCharacters_Characters.None Then            If Value > Integer.MaxValue Then                case_type = BuiltInDataTypes.Long            Else                case_type = BuiltInDataTypes.Integer            End If        Else            case_type = LiteralTypeCharacters.GetBuiltInType(TypeCharacter)        End If        Select Case case_type            Case BuiltInDataTypes.Integer                Return Token.CreateInt32Token(GetCurrentLocation, ExtractInt(Value, Base), Base, TypeCharacter)            Case BuiltInDataTypes.UInteger                Return Token.CreateUInt32Token(GetCurrentLocation, ExtractUInt(Value, Base), Base, TypeCharacter)            Case BuiltInDataTypes.Long                Return Token.CreateInt64Token(GetCurrentLocation, ExtractLong(Value, Base), Base, TypeCharacter)            Case BuiltInDataTypes.ULong                Return Token.CreateUInt64Token(GetCurrentLocation, ExtractULong(Value, Base), Base, TypeCharacter)            Case BuiltInDataTypes.Short                Return Token.CreateInt16Token(GetCurrentLocation, ExtractShort(Value, Base), Base, TypeCharacter)            Case BuiltInDataTypes.UShort                Return Token.CreateUInt16Token(GetCurrentLocation, ExtractUShort(Value, Base), Base, TypeCharacter)            Case Else                Throw New InternalException("")        End Select    End Function    Private Function ExtractInt(ByVal Value As ULong, ByVal Base As IntegerBase) As Integer        Select Case Base            Case IntegerBase.Decimal                Return CInt(Value)            Case IntegerBase.Hex, IntegerBase.Octal                If Value > Integer.MaxValue Then                    Return CInt(Integer.MinValue + (CUInt(Value) - Integer.MaxValue - 1))                Else                    Return CInt(Value)                End If            Case Else                Throw New InternalException("Unknown base: " & Base.ToString())        End Select    End Function    Private Function ExtractUInt(ByVal Value As ULong, ByVal Base As IntegerBase) As UInteger        Select Case Base            Case IntegerBase.Decimal                Return CUInt(Value)            Case IntegerBase.Hex, IntegerBase.Octal                Return CUInt(Value)            Case Else                Throw New InternalException("Unknown base: " & Base.ToString())        End Select    End Function    Private Function ExtractShort(ByVal Value As ULong, ByVal Base As IntegerBase) As Short        Select Case Base            Case IntegerBase.Decimal                Return CShort(Value)            Case IntegerBase.Hex, IntegerBase.Octal                If Value > Short.MaxValue Then                    Return CShort(Short.MinValue + (CUShort(Value) - Short.MaxValue - 1))                Else                    Return CShort(Value)                End If            Case Else                Throw New InternalException("Unknown base: " & Base.ToString())        End Select    End Function    Private Function ExtractUShort(ByVal Value As ULong, ByVal Base As IntegerBase) As UShort        Select Case Base            Case IntegerBase.Decimal                Return CUShort(Value)            Case IntegerBase.Hex, IntegerBase.Octal                Return CUShort(Value)            Case Else                Throw New InternalException("Unknown base: " & Base.ToString())        End Select    End Function    Private Function ExtractLong(ByVal Value As ULong, ByVal Base As IntegerBase) As Long        Select Case Base            Case IntegerBase.Decimal                Return CLng(Value)            Case IntegerBase.Hex, IntegerBase.Octal                If Value > Long.MaxValue Then                    Return CLng(Long.MinValue + (Value - Long.MaxValue - 1))                Else                    Return CLng(Value)                End If            Case Else                Throw New InternalException("Unknown base: " & Base.ToString())        End Select    End Function    Private Function ExtractULong(ByVal Value As ULong, ByVal Base As IntegerBase) As ULong        Select Case Base            Case IntegerBase.Decimal                Return CULng(Value)            Case IntegerBase.Hex, IntegerBase.Octal                Return CULng(Value)            Case Else                Throw New InternalException("Unknown base: " & Base.ToString())        End Select    End Function    Function GetCurrentLocation() As Span        Return New Span(m_CodeFileIndex, m_CurrentLine, m_CurrentColumn)    End Function    Private ReadOnly Property CurrentChar() As Char        Get            Return m_CurrentChar        End Get    End Property    Private Function NextChar() As Char        If m_CurrentColumn < 255 Then m_CurrentColumn += CByte(1)        m_TotalCharCount += 1        m_PreviousChar = m_CurrentChar        If m_PeekedChars.Count > 0 Then            m_CurrentChar = m_PeekedChars.Dequeue        Else            If m_Reader.EndOfStream Then                m_CurrentChar = nl0            Else                m_CurrentChar = Convert.ToChar(m_Reader.Read())            End If        End If        Return m_CurrentChar    End Function    Private ReadOnly Property PreviousChar() As Char        Get            Return m_PreviousChar        End Get    End Property    Private Function PeekChar() As Char        If m_PeekedChars.Count = 0 Then            If m_Reader.EndOfStream Then Return nl0            m_PeekedChars.Enqueue(Convert.ToChar(m_Reader.Read))        End If        Return m_PeekedChars.Peek()    End Function    Private Function PeekChars(ByVal Chars As Integer) As Char        Do Until m_PeekedChars.Count >= Chars            If m_Reader.EndOfStream Then Return nlA            m_PeekedChars.Enqueue(Convert.ToChar(m_Reader.Read))        Loop        Return m_PeekedChars.ToArray()(Chars - 1)    End Function    ''' <summary>    ''' Returns true if the current character is the last character in the scanner.    ''' </summary>    ''' <returns></returns>    ''' <remarks></remarks>    Public Function IsLastChar() As Boolean        Return m_Reader.EndOfStream    End Function    ''' <summary>    ''' Next line!    ''' </summary>    ''' <remarks></remarks>    Private Sub IncLine()        m_CurrentLine += 1UI        m_CurrentColumn = 1        m_TokensSeenOnLine = 0    End Sub    ''' <summary>    ''' Creates a new symbol token of the specified symbol.    ''' </summary>    ''' <param name="Symbol"></param>    ''' <returns></returns>    ''' <remarks></remarks>    Private Function NewToken(ByVal Symbol As KS) As Token        Return Token.CreateSymbolToken(GetCurrentLocation, Symbol)    End Function    Private Function GetNextToken() As Token        Dim Result As Token = Nothing        Do            Select Case CurrentChar()                Case """"c 'String Literal                    Result = GetString()                Case COMMENTCHAR1, COMMENTCHAR2, COMMENTCHAR3 'VB Comment                    EatComment()                Case nlD, nlA, nl2028, nl2029 'New line                    EatNewLine()                    Result = Token.CreateEndOfLineToken(GetCurrentLocation)                Case nl0 'End of file                    Result = Token.CreateEndOfFileToken(GetCurrentLocation)                Case ":"c ':                    NextChar()                    Result = NewToken(KS.Colon)                Case ","c ',                    NextChar()                    Result = NewToken(KS.Comma)                Case "."c                    If PeekChar() >= "0"c AndAlso PeekChar() <= "9"c Then                        Result = GetNumber()                    Else                        NextChar()                        Result = NewToken(KS.Dot)                    End If                Case "0"c To "9"c                    Result = GetNumber()                Case "("c                    NextChar()                    Result = NewToken(KS.LParenthesis)                Case ")"c                    NextChar()                    Result = NewToken(KS.RParenthesis)                Case "["c                    Result = GetEscapedIdentifier()                Case "{"c                    NextChar()                    Result = NewToken(KS.LBrace)                Case "}"c                    NextChar()                    Result = NewToken(KS.RBrace)                Case ">"c                    NextChar()                    EatWhiteSpace()                    'If CurrentChar() = "<"c Then                    '    NextChar()                    '    Result = NewToken(KS.NotEqual)                    'Else                    If CurrentChar() = "="c Then                        NextChar()                        Result = NewToken(KS.GE)                    ElseIf CurrentChar() = ">"c Then                        NextChar()                        EatWhiteSpace()                        If CurrentChar() = "="c Then                            NextChar()                            Result = NewToken(KS.ShiftRightAssign)                        Else                            Result = NewToken(KS.ShiftRight)                        End If                    Else                        Result = NewToken(KS.GT)                    End If                Case "<"c                    NextChar()                    EatWhiteSpace()                    If (CurrentChar() = ">"c) Then                        NextChar()                        Result = NewToken(KS.NotEqual)                    ElseIf CurrentChar() = "="c Then                        NextChar()                        Result = NewToken(KS.LE)                    ElseIf CurrentChar() = "<"c Then                        NextChar()                        EatWhiteSpace()                        If CurrentChar() = "="c Then                            NextChar()                            Result = NewToken(KS.ShiftLeftAssign)                        Else                            Result = NewToken(KS.ShiftLeft)                        End If                    Else                        Result = NewToken(KS.LT)                    End If                Case "="c                    NextChar()                    Result = NewToken(KS.Equals)                Case "!"c

⌨️ 快捷键说明

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