リスト文字列を1文字ずつパース VB編

Ruby で書いた「リスト文字列を1文字ずつパース」をVBで書きました。
これは実際に仕事に使おうと思うのだけれども、本物のリストでやった方がこの先面白そうです。

Imports System
Imports System.Collections.Generic

Public Class ListString
    Private str As String = ""

    Sub New(ByVal Name As String)
        Me.str = Name
    End Sub

    Public Property Name() As String
        Get
            Return str
        End Get
        Set(ByVal value As String)
            str = value
        End Set
    End Property

    Public Function Head()
        Return str.Substring(0, 1)
    End Function

    Public Function Tail()
        Return str.Substring(1)
    End Function

    Public Function Length()
        Return str.Length
    End Function

End Class


Public Class ListObject
    Private Lstr As New List(Of Object)

    Sub New()
        Me.Lstr = New List(Of Object)
        Lstr.Add(Nothing)
    End Sub

    Public Function Head()
        Return Lstr(0)
    End Function

    Public Function Last()
        Return Lstr(Lstr.Count - 2)
    End Function

    Public Function Last2()
        Return Lstr(Lstr.Count)
    End Function


    Public Sub Clear()
        Lstr.Clear()
        Lstr.Add(Nothing)
    End Sub

    Public Function Tail()
        Dim Tarray() As Object = New Object(Lstr.Count) {}
        Dim i As Object
        Dim TailList As New ListObject

        Lstr.CopyTo(1, Tarray, 0, Lstr.Count - 1)
        TailList.Clear()
        For Each i In Tarray
            TailList.Push(i)
        Next i

        Return TailList
    End Function


    Public Sub Push(ByRef value As Object)
        Lstr(Lstr.Count - 1) = value
        Lstr.Add(Nothing)
    End Sub

    Public Sub Pop()
        If Lstr.Count > 1 Then
            Lstr.Remove(Nothing)
            Lstr(Lstr.Count - 1) = Nothing
        End If
    End Sub

    Public Function Show()
        Return "{" + AllList(Me) + "}"
    End Function

    Private Function AllList(ByRef list As ListObject)
        If IsNothing(list.Head) Then
            Return ""
        Else
            Return Tostr(list.Head()) + sPace(list.Tail) + AllList(list.Tail)
        End If
    End Function

    Private Function IsNothing(ByRef cell As Object)
        If TypeOf cell Is ListObject Then
            Return False
        Else
            If cell = Nothing Then
                Return True
            Else
                Return False
            End If
        End If
    End Function

    Private Function Tostr(ByRef cell As Object)
        If TypeOf cell Is ListObject Then
            Return cell.Show
        Else
            If TypeOf cell Is String Then
                Return """" + cell + """"
            Else
                Return cell.ToString
            End If
        End If
    End Function

    Private Function sPace(ByRef list As ListObject)
        If IsNothing(list.Head) Then
            Return ""
        Else
            Return ","
        End If
    End Function
End Class


Module Module1

    Function StringToList(ByVal inString As ListString, ByRef out As ListObject, _
                                          ByVal Str As String, ByVal flag As Boolean)
        If inString.Length = 1 Then
            Return out.Head
        Else
            Dim head As String = inString.Head
            Dim tail As ListString = New ListString(inString.Tail)

            If head = "[" Then
                Dim ls As New ListObject
                out.Push(ls)
                Return StringToList(tail, out, Str, flag)
            ElseIf head = "]" Then
                Dim last As ListObject = out.Last
                out.Pop()
                Dim last2 As ListObject = out.Last
                out.Pop()
                last2.Push(last)
                out.Push(last2)
                Return StringToList(tail, out, Str, flag)
            ElseIf head = "," Then
                Return StringToList(tail, out, Str, flag)
            ElseIf head = """" Then
                If flag Then
                    Dim ls As New ListObject
                    ls = out.Last
                    ls.Push(Str)
                    out.Pop()
                    out.Push(ls)
                    Return StringToList(tail, out, "", False)
                Else
                    Return StringToList(tail, out, Str, True)
                End If
            Else
                Return StringToList(tail, out, (Str + head), True)
            End If
        End If
    End Function

    Function StrToList(ByVal inString As ListString)
        Dim EmptyList As New ListObject
        Return StringToList(inString, EmptyList, "", False)
    End Function

    Sub Main()
        Dim r As New ListObject
        Dim Lstr As ListString = New ListString("[[""A"",[""B""]],[[[""C""],""D""],""1""]]")
        r = StrToList(Lstr)
        System.Console.WriteLine(r.Show)        '=> {{"A",{"B"}},{{{"C"},"D"},"1"}}
        System.Console.WriteLine(r.Head.Show)   '=> {"A",{"B"}}
        System.Console.WriteLine(r.Tail.Show)   '=> {{{{"C"},"D"},"1"}}
    End Sub
End Module