無差別に技術をついばむ鳥

情報処理技術全般を気まぐれにつつくゆるいブログです

英語を啄ばむ2−英語をつついて分解する。

まずは、 英文法大全 を読んで最初の英文を探したピヨ。ピムプム。
Tokyo is the capital of Japan. 訳:東京は日本の首都である
ボクはひたすら観察した。その結果幾つかの事がわかったピヨ。それは次の特徴だよ。

  • 単語は空白で区切られている
  • 単語はアルファベットA〜Zの文字から成っている

当たり前の事のようだけどプログラミングをするにはこの観察が必要ピヨ。この事実に基づいて、ボクは、単語を意味する Token構造体と、英文から単語を抜き出す Lexerクラスを作ったピヨ。つまらないものですが見てね♪


※完成時の状態
Public Enum TokenCategory
    Text
    Number
    Symbol
    UnKnown
End Enum

Public Structure Token
    'トークンの種類
    Private m_category As TokenCategory
    Public Property Category() As TokenCategory
        Get
            Return Me.m_category
        End Get
        Set(ByVal value As TokenCategory)
            Me.m_category = value
        End Set
    End Property

    'トークンテキスト
    Private m_text As String
    Public ReadOnly Property Text() As String
        Get
            Return Me.m_text
        End Get
    End Property

    Public Sub New(ByVal value As String)
        Me.m_category = TokenCategory.UnKnown
        Me.m_text = value
    End Sub
End Structure

----------------------------------------------------------------------------
Imports System
Imports System.Text
Imports System.Collections.Generic

Public Class Lexer

    Public Function GetTokens(ByVal text As String) As Token()
        '文字列を単語に分ける
        Dim str As Char = text(0)
        Dim tmp As Queue(Of Token) = New Queue(Of Token)
        Dim word As StringBuilder = New StringBuilder(text.Length)
        Dim readIndex As Integer = 0
        For readIndex = 0 To text.Length
            str = text(readIndex)
            If str = " " Then
                If word.Length <> 0 Then
                    tmp.Enqueue(New Token(word.ToString()))
                    word = New StringBuilder(text.Length - readIndex)
                End If
                 '空白を無視する
                While str = " "
                    readIndex += 1
                    If readIndex = text.Length Then
                        Exit While
                    End If
                    str = text(readIndex)
                End While
            End If
            word.Append(str)
        Next

         '結果を返す
        Dim result As Token()
        Dim max As Integer = tmp.Count - 1
        ReDim result(max)
        For i As Integer = 0 To max
            result(i) = tmp.Dequeue()
        Next
        Return result
    End Function
End Class

ドリィちゃん「テスト♪」
わぁっ!!!吃驚したぁ。えぇ〜〜もしかしたらと思ったけど、いきなりテスト!
ドリィちゃん「テストファースト♪」
わかったよ。ドリィちゃんどんなテストを作ったんだい?
ドリィちゃん「これ♪」


Imports NUnit.Framework
Imports FoolishTranslator

 Public Class LexerTest
    'テスト対象の生成手段を一つにする
    Private Shared Function GenereteTestTarget() As Lexer
        Return New Lexer()
    End Function

    '簡単な英文を正しいトークンに分けられるかテスト
    < Test() > Public Sub SimpleGetTonkensTest()
        Dim target As Lexer = GenereteTestTarget()
        Dim data As String = "   Tokyo is the capital of Japan.   "
        Dim words As Token() = target.GetTokens(data)
        Assert.IsNotNull( _ 
            words, "何しているの!空じゃないのぉぉぉぉ by ドリィ")
        Assert.AreEqual( _ 
            "Tokyo", words(0).Text,  _ 
            "1つ目の単語が間違っているぅぅ by ドリィ")
        Assert.AreEqual( _ 
            "is", words(1).Text,  _ 
            "2つ目の単語が間違っているぅぅ by ドリィ")
        Assert.AreEqual( _ 
            "the", words(2).Text,  _ 
            "3つ目の単語が間違っているぅぅ by ドリィ")
        Assert.AreEqual( _ 
            "capital", words(3).Text,  _ 
            "4つ目の単語が間違っているぅぅ by ドリィ")
        Assert.AreEqual( _ 
            "of", words(4).Text,  _ 
            "5つ目の単語が間違っているぅぅ by ドリィ")
        Assert.AreEqual( _ 
            "Japan", words(5).Text, _ 
             "6つ目の単語が間違っているぅぅ。" &  _ 
            vbLf & "やはりドットを分割するの忘れたわね♪ by ドリィ")
    End Sub
End Class


ううーん。相変わらず嫌らしそうなテストだなぁ〜。おや、ドリィちゃんNUnit覚えたんだね。まあ仕方が無いからつきあってやるかぁ。おっと、早速エラーが出たよ。ドリィちゃんところでNUnitでどうやってデバッグするの?
ドリィちゃん「言われてみれば・・・そ、そ、そんなの自分でしなさい!NUnitはあくまでもテストツールなんだからねぇ!」
仕方が無いなぁ。コンソールプロジェクトにして、エラーチェックしてからテストに挑戦しよう。
(1時間ほど過ぎた)
ドリィちゃん「まだぁ、遅いわねぇぇ。lexerぐらいちゃっちゃと実装しなさいぃ。」
ちょっ。ちょっと待って。出来た!テストに挑戦するぞぉ。
ドリィちゃん(*´ー`*)
何だろうあの笑顔?とにかく実行だ。あれ?あれれれ?!!
6つ目の単語が間違っているぅぅ。 やはりドットを分割するの忘れたわね♪ by ドリィ
・・・・・これを予期して微笑んでいたのかぁ・・・確かにJapan. なんて単語無いよねぇ・・・
ドリィちゃん「予想通り♪」
くやピィー。悔しさを胸に次回へ続く。
別窓 | 英語翻訳 | コメント:0 | トラックバック:0 | ∧top | under∨
<<中の人の徒然草44 | 無差別に技術をついばむ鳥 | 中の人の徒然草43>>

この記事のコメント

∧top | under∨

コメントの投稿

 

管理者だけに閲覧
 

この記事のトラックバック

∧top | under∨
| 無差別に技術をついばむ鳥 |