Option Explicit On
Imports System.Text
Public Class Form1
Private Tokens As List(Of Token)
Private idx As Integer = 0
Private Enum TokenTypes
StrText = 0
Symbols = 1
Digits = 2
EOC = 3
End Enum
Private Structure Token
Dim Token As String
Dim Type As TokenTypes
End Structure
Private Sub AddToken(ByVal Data As String, ByVal Type As TokenTypes)
Dim tok As Token
'Add token and type.
tok.Type = Type
tok.Token = Data
Tokens.Add(tok)
End Sub
Private Sub InitScanner()
'Init defaults.
idx = 0
Tokens = New List(Of Token)
End Sub
Private Sub Scan(ByVal Source As String)
'While less than length loop.
While idx <= (Source.Length - 1)
Dim ch As Char = Source(idx)
'Check for end of code.
If (idx >= Source.Length - 1) Then
AddToken("EOC", TokenTypes.EOC)
End If
'Skip white space
If Char.IsWhiteSpace(ch) Then
idx += 1
ch = ""
ElseIf Char.IsLetter(ch) Then
Dim sb As New StringBuilder()
'Get letters
While Char.IsLetter(ch)
ch = Source(idx)
If Char.IsLetter(ch) Then
sb.Append(ch)
End If
'Inc counter
idx += 1
End While
'Add token and type
AddToken(sb.ToString(), TokenTypes.StrText)
ElseIf Char.IsSymbol(ch) Then
Dim sb As New StringBuilder()
'Get symbols
While Char.IsSymbol(ch)
ch = Source(idx)
If Char.IsSymbol(ch) Then
sb.Append(ch)
End If
'INC counter
idx += 1
End While
'Add token and type
AddToken(sb.ToString(), TokenTypes.Symbols)
ElseIf Char.IsNumber(ch) Then
Dim sb As New StringBuilder()
'get digits
While Char.IsNumber(ch)
ch = Source(idx)
If Char.IsNumber(ch) Then
sb.Append(ch)
End If
'INC counter
idx += 1
End While
'Add token and type
AddToken(sb.ToString(), TokenTypes.Digits)
Else
Throw New ArgumentException("Bad Token Found.")
End If
'idx += 1
End While
End Sub
Private Sub cmdShow_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdShow.Click
Dim tok As New Token
Dim s As String
'Example code to scan
s = "Var X" & vbCrLf
s = s & "X = Hello World" & vbCrLf
s = s & "B = 123" & vbCrLf
s = s & "Print B" & vbCrLf
'Init scanner defaults
InitScanner()
'Add source
Scan(s)
For Each tok In Tokens
'Show token and type
MessageBox.Show("Token = " & tok.Token & " Type = " & tok.Type.ToString(),
"Scanner Demo", MessageBoxButtons.OK, MessageBoxIcon.Information)
Next tok
End Sub
End Class