fc2ブログ

プログラミングをつつく3-ジャンプ、プログラムを翔る鳥。

前回から引き続きプログラミングについて囀るピヨ♪今回は、順番を破る動作について囀るピヨ♪

インドリ「ピエピエ、ドリィちゃん。昨日プログラムは順番に動くって聞いたけど、全てのプログラミングが順番どおりだったら不便じゃない?」
ドリィちゃん「なかなかいい所に気付いたわね。じゃあ、どういう風に不便だと思う?」
インドリ「色々な処理をボク考えてみたピヨ。すると、全てが一本調子だったら、同じプログラムを何回も書かなければならないし、実現できない事があると思ったピヨォ。」
ドリィちゃん「へぇ、いいセンスしているわね❤ところで、出来ない処理って?」
インドリ「あのね、ドリィちゃんがPCを使ってお手紙を書いているのを見て、これってどうやって順番にプログラムを書くのか不思議だったんだ。だって、よく考えてみればドリィちゃんは毎回違う順番でお手紙をかくからね♪」
ドリィちゃん「(見て気付くとはこの鳥只者じゃないわ)偉い!よくわかったわね。」
インドリ「うん。ドリィちゃんって、お手紙書くとき、いきなり電卓を使ったり、本を読んだり、怒ったり、色々するピヨね♪」
ドリィちゃん「・・・そこまで私の事観察しないで。それはそうと、常に順番どおりプログラムをかけないと言うのは本当よ。そこでプログラミングには究極の裏技ジャンプがあります。」
インドリ「ジャンプ?飛ぶの?ワクワクするピヨ♪」
ドリィちゃん「それはねぇ、ひとまず擬似プログラムを見ればわかるわ。」



開始地点:
ジャンプ 挨拶

挨拶:
画面出力(”Hello World!”)
ジャンプ 挨拶3

挨拶2:
画面出力(”終わりだよ”)
ジャンプ 終了

挨拶3:
画面出力(”こんにちわ。インドリ。”)
ジャンプ 挨拶2

終了:



ドリィちゃん「さあ、どうなるでしょう?」
インドリ「うーん、難しいピヨ・・・えっと、ジャンプって事はそこへ飛ぶんだよね?という事は・・・」


Hello World!
こんにちわ。インドリ。
終わりだよ


インドリ「って出力されるの?」
ドリィちゃん「正解よ!プログラムでは場所に名前をつけて、そこへジャンプする事が出来るわ:(コロン記号)がついているのが名前で、そこは実行されないわ。もちろんこれは擬似プログラミングでのお話しよ。普通のプログラム言語はまた違う風に表現するわ。」
インドリ「う~ん。でもこれって今一ありがたみが分からないピヨォ。」
ドリィちゃん「確かにそうね・・・このジャンプ凄さは他の要素があってのものだから、他の要素も覚えたら分かるわ。」
インドリ「うん♪分かったピヨ♪」


【今回のまとめ】
プログラムの基本的な動きは順番ですが、場所に名前をつけてそこへジャンプする事が出来ます。こうする事により色々な利点が生まれます。その利点は、他の要素も同時に使った時発揮されますので、ひとまずジャンプの概念があるとだけ覚えてください。


インドリ「今回はこれでお終いピヨ♪次回もお楽しみに♪」
スポンサーサイト



テーマ : プログラミング
ジャンル : コンピュータ

プログラミングをつつく2-全ては順番に。

前回に引き続きプログラミングを楽習するピヨ♪ ボクは引き続きドリィちゃんからプログラミングについて教えてもらっていたピヨ♪

インドリ「今日もプログラミングについて教えて欲しいピヨ♪」
ドリィちゃん「じゃあね・・・今回はプログラミングの一番基礎的な特徴を教えるわ。」
インドリ「わーい♪」
ドリィちゃん「昨日擬似的なプログラミングをして何か気付かなかった?」
インドリ「えっと・・・・意外と面倒だけど高速かつ正確に実行されるんだよね?」
ドリィちゃん「そうよ。それ以外にも何か気付かなかった?じゃあねぇ、もう一回前回のプログラムを見て。」


画面出力(”Hello World!”)
画面出力(”Hello World!”)
画面出力(”Hello World!”)


インドリ「う~んなんだろう?わからないピヨォ。」
ドリィちゃん「上から下へ順番に実行されているわ。それと、左から右へと解釈しているのも特徴よ。」
インドリ「言われて見れば確かに左から右に読んで、上から下へ実行されているピヨ。でもこれが何を意味しているのかな?」
ドリィちゃん「これがプログラミングの基礎的動作よ。こういった基礎を改めて考える事も必要よ。」
インドリ「なるピヨ。・・・・あれ?これって色々不便じゃない?」
ドリィちゃん「そう、そこなのよ!この基本動作だけだと実務的なものは作れないから色々工夫する事になるわ。それがプログラミングの進化と発展と言ってもいいわ。」
インドリ「プログラミングって意外と単純なんだね。もっと魔法的なものだと思ったピヨ。」
ドリィちゃん「魔法って・・・でも素人は魔法感覚な人が確かに多いわね・・・プログラミングってファンタジックな技術じゃないわ。ちゃんとした理論があるものなのよ。」
インドリ「そうなんだ。ちょっとがっかりしたけど、理論的な技術ならば鳥でも修得できるね♪」
ドリィちゃん(普通の鳥は出来ないと思うけど・・・それに貴方の存在が一番ファンタジックな気が・・・)
インドリ「どうしたのドリィちゃん?」
ドリィちゃん「なんでもないわ。じゃあ今日はこれでお終い。私はデスマーチで疲れているのよぉ。」
インドリ「デスマーチって何?よく分からないけど、分かったピヨ。じゃあボクが纏めるピヨ♪」



【今回のまとめ】
プログラムは左から右へ読み、上から下へと順番に実行されるピヨ。


今回は短いけどお終い。また次回をお楽しみに♪

テーマ : プログラミング
ジャンル : コンピュータ

プログラミングをつつく1-プログラミングは命令の羅列なの?

前回から引き続きプログラミングそのものについて囀るピヨ♪
あの1日後・・・ボクは・・・

インドリ「ドリィちゃんお帰りピヨ♪プログラミング早く教えてピヨッ♪」
ドリィちゃん「(何だか可愛い❤)うん。じゃあ、早速昨日の続きを教えるわ。」
インドリ「ピョッピヨウピヨピヨソピチャ!」
ドリィちゃん「???(何言っているか分からないけど、兎に角喜んでいるようね)じゃあ最初は擬似的なプログラミング言語で説明するわ❤」
インドリ「擬似的なプログラミング言語って何?」
ドリィちゃん「最初から本物のプログラミング言語を使って説明すると難しいと思うの。だから、日本語でそれっぽい事を表現するわ。」
インドリ「なるピヨ。」
ドリィちゃん「じゃあ行くわよ。一番簡単なプログラミングは、Hello Worldと呼ばれているプログラムを書いてみましょう。」


画面出力(”Hello World!”)


インドリ「何だか味気ないピヨォ。でも一応紙に書いたピヨ。」
ドリィちゃん「残念だけど紙に書いても駄目よ。プログラミングでは基本的に、PC内のファイルへこんな感じのプログラムを書きます。」
インドリ「へぇー。えーと、キーボードを使って文字を書いて・・・あれ?昨日の画面が出ていない。どうしたらいいの?」
ドリィちゃん「えっとぉ、今回はWindowsのアクセサリであるメモ帳というソフトを使ってね。インドリ君はPC初めてだよね?じゃあ、先ずはキーボードで文字を書打つ練習を始めましょう❤」
インドリ「えぇープログラミング出来ないの・・・仕方ない、キーボードの練習するピヨ。」

1月後

インドリ「キーボードになれるまで結構時間がかかったピヨォ」
ドリィちゃん「それは仕方が無いわ。みんな初めは文字を入力する事から練習するわ。でもUNIXでEmacsの練習するよりましよ。あれすると小指が痛くなるのぉ・・・
おっほん。それはさておき、これで文字入力はOKだから話を前に進めるわ。」

インドリ「わーい。やっとプログラミングできるピヨッ♪」
ドリィちゃん「前に言ったプログラム一行をひとまず命令文といいます。プログラミングではこの命令文をひたすら羅列します。こんな感じで・・・」


画面出力(”Hello World!”)
画面出力(”Hello World!”)


インドリ「二回Hello World!って画面に出すの?」
ドリィちゃん「ええ、そうよ。こんな風にプログラミング言語が備えている命令を羅列するのがプログラミングの基礎よ。」
インドリ「やっぱりプログラミングって面倒じゃない?これをするとどんな利点があるのかな?」
ドリィちゃん「それはねぇ、譬え何百万行でも一度プログラミングすると同じ事が高速かつ正確にPCが実行してくれるという点よ。」
インドリ「それは凄いピヨ♪Hello Worldって何百万回も正確かつ高速に言えないピヨ♪」
ドリィちゃん「流石に何百万行もHello Worldのプログラム書く人居ないわ。それにもっと複雑な事出来るわよ。」
インドリ「それは凄いピョ。何となくプログラミングの利点が分かってきたような気がするピヨ。」
ドリィちゃん「それはよかったわ♪じゃあ、次は・・・おっと、もうこんな時間だし、今日はここまで。夜ふかしは美容の敵よ。」
インドリ「えぇー」


【今回のまとめ】
プログラミングではプログラムの命令を羅列し、それをファイルへ保存しておきます。 初めは面倒だと思うでしょうが、一度プログラミングしておけば、PCが 何度でも高速かつ正確に処理 しますので便利です。


これはまだ、プログラミングについての一部だけど、その便利さが少しでも伝われば幸いピヨ。これからもプログラミングについて囀っていくからお楽しみに♪

テーマ : プログラミング
ジャンル : コンピュータ

プログラミングをつつく0-プログラミングって何?

インドリは思い出に浸っていた。人間の年数に換算すると約10年前、彼は初めてプログラミングを知った。
ドリィちゃん「またデスマーチだわ・・・仕方ない!家でも仕事するか。」
インドリ「ねぇ、何しているの?」
ドリィちゃん「誰?」キョロキョロ
インドリ「ボクだよ。ボク。前に居てる鳥のインドリだよ。」
ドリィちゃん「うわっ!!!鳥が喋ったぁー。」
インドリ「驚かしてごめん。何か面白そうな事しているなって思ったんだ。」
ドリィちゃん(鳥が喋るなんて・・・鸚鵡の一種?一体何なのかしらこの鳥は・・・そうだ!この鳥にプログラミング教えたら手伝ってくれるかも)
「これはプログラミングよ❤」

インドリ「プログラミング?」
ドリィちゃん「そうよ。こうやって呪文の様なものを書いて、それでPCに命令を与えて、人間が求めている結果を出すのよ。」
インドリ「何だか難しいピヨ。」
ドリィちゃん「大丈夫よ❤サルでも出来るっていうぐらいだから鳥でも出来るわよ❤面白いわよぉ~。」
インドリ「じゃあ、やってみようかな?」
ドリィちゃん「じゃあ、キーボードの前に来て。しまった!鳥には指が無いからキーボード叩けないぃぃ。」
インドリ「?大丈夫だよ。ボク指あるもの。ほら」
ドリィちゃん(うわぁー本当にあるわ。もしかして始祖鳥の一種?何だろうこの鳥の種類は・・・・・・まぁいいか。) 「そう。それは幸いね。じゃあ、何言語したい?」
インドリ「言語?ボク、日本語ならば読み書きできるよ。」
ドリィちゃん(鳥なのに読み書きまで出来るとは・・・) 「あのね。パソコンはそんな難しい言葉理解できないのよ。理解できるのは0か1だけよ。」
インドリ「0か1?でも今画面見たら、文字が沢山並んでいるよ?」
ドリィちゃん「それはね。予めそうなるようにプログラミングされているからなのよ。でも、これについては難しいから今は気にしないで。」
インドリ「分かったピヨ♪ボク一度に三つ以上覚えられないから丁度良いや♪」
ドリィちゃん(やっぱ鳥頭なんだ・・・)「人間だって一度に沢山のことは覚えられないわ。そうねぇ・・・プログラミングは何って所から始めるわ。」
インドリ「わーい♪ピヨピヨピヨ♪」
ドリィちゃん「其の一。パソコンは馬鹿だから専用の言葉を使う。これをプログラミング言語といいます。」
インドリ「プログラミングは、専用の言語を使ってするんだね♪」
ドリィちゃん「そうよ。プログラミング言語自体の説明は後回しにするわ。其の二、プログラミング言語の命令を組み合して、パソコンに人間が求める事を実行させます。」
インドリ「イメージが湧かないピヨ。例えばどんなの?」
ドリィちゃん「イメージ的には・・・1+1を計算しろ。その結果を画面に出力しろ。てな感じよ。」
インドリ「結構面倒そうだね。」
ドリィちゃん「そうよ。でも・・・ここで其の三、面倒だけども一度プログラミングした事は、何度でも高速かつ正確に処理されるわ。」
インドリ「一度1+1のプログラミングをしておけば、何度でも2って表示されるって事?でも、そんな事ボクでも分かるピヨ。」
ドリィちゃん「それがねぇ、不思議な事にかなり複雑な事でも実力さえあれば出来るのよ。複雑な事でもパソコンは、高速かつ正確に何度でも同じことをやってくれるから便利なのよ❤」
インドリ「まだよく分からないけど、便利なんだね♪」
ドリィちゃん「そうそう。初めはそんな認識でいいわ。じゃあ明日から少しずつ説明していくわ。」
インドリ「わーい♪」


【まとめ】プログラミングとは、専用の言語を使ってパソコンに何かをさせる行為である。パソコンは複雑な事を理解できないので、細かい単位で命令をしなければならず面倒だが、一度プログラミングしておくと非常に高速かつ正確に処理をするので便利である。


良い思い出ピヨ♪この時はまだ、プログラミングって何んだかよく分からなかったけど、この日以降プログラミングを習っているうちに自然と分かるようになったピヨ♪案ずるより産むが易しだから気楽に始めよう♪今後も初心者用に、プログラミングについて囀っていくから楽しみにしてね♪

テーマ : プログラミング
ジャンル : コンピュータ

英語を啄ばむ6-細かくつついて情報を出す。

今回は文を細かくつついていくピヨ♪今までは漫然とTokenが連なったものとして扱っていたけど、それじゃあ翻訳は出来ないピヨ。だから文を構成する要素を調べたピヨ。
そもそも文とは何かというと、幾つかの語が一定の順序で並んで一定の意味を表すものピヨ。という事は一番細かい要素は語ピヨ。だから手始めに語を調べてみることにした。


バサバサバサバサバサバサバサバサバサバサバサバサバサバサバサバサバサバサバサバサバサバサ


さっそく、語を調べると語は10種類の品詞に分類できる事が分かったピヨ♪これ重要な情報だと思うから書き留めておくピヨ♪


【品詞の種類】
  • 名詞・・・人や物事を表す語。
  • 代名詞・・・名詞の代わりをする語。
  • 形容詞・・・人や物事などの性質・状態・数量などを表す語。
  • 冠詞・・・名詞の前に置き、その名詞が不特定のものか特定のものなのかを表す語。
  • 福祉・・・動詞や形容詞などを修飾し、場所、時、程度、頻度などを表す語。
  • 動詞・・・人や物事の状態や動作を表す語。
  • 助動詞・・・動詞の原型とともに使用し、話し手の判断などを示す語。
  • 前置詞・・・名詞や題名の前に置かれる語。at、by、forなどが前置詞ピヨ♪
  • 接続詞・・・語と語、句と句、節と節などをつなぐ語。
  • 間投詞・・・話し手の感情を表す語で、感嘆符がつく場合があるピヨ♪


10個って半端な数だよねどうせなら8個なら丁度4ビットだったのにぃ。それはさて置き、品詞には注意するべき点があるピヨ。それは・・・1つの単語を2つ以上の品詞として扱うこともがある点ピヨ。うーん。メンドイなー。まだ、仕様が定まっていないからもう少しつついていくピヨ♪でも疲れたから今回の記事はおしまい。

テーマ : プログラミング
ジャンル : コンピュータ

英語を啄ばむ5-基礎からつつく♪

今回も英文法大全を見てつつく場所を決めるピヨッ♪・・・あれ?接続できないぞ!便利なサイトだったのに・・・仕方が無いから、英文法を随時調べつつ話しを進めるピヨォ。
英語翻訳ソフトに限らずソフトを作る場合先ずするべき事は、対象となる要素を細かくつついて仕様を決定する事ピヨ♪だから、今回は英語の基礎からつついていくピヨ♪とっても基礎からつついていくけど、必要な事だから野暮なツッコミはしないでね。
英語の特徴は語順で意味を成す事ピヨ。日本語は語順なんて気にしないでも通じるけど、英語は語順が厳密に定められているんだ。この法則はほぼ絶対で、聞きたいことがあった場合や、感心した時なども語順で表すピヨ。日本人のボクには面倒だと思うけど、プログラムと相性がいいかもね♪
英語の基礎的な文は、単に情報を伝える文である平叙文、答えがYes/Noで答えられる質問を表す疑問文、命令や依頼を表す命令文、何かに感動したことを表す感嘆文等があるピヨ♪
基礎的な事も分かったことだし、翻訳ソフトの実装を進めるピヨ♪・・・あれ?出来ないや。
ドリィちゃん「当然よ。コンパイラはもっと細かい情報がないと作れないわよ。」
はっそうなのか!じゃあ、仕方が無いから次回からはもっと細かい部分をつつくピヨ♪
今回は短いけどおしまい。

テーマ : プログラミング
ジャンル : コンピュータ

英語を啄ばむ4-記号は特別。

前回は悔しかったな。でも、ちゃんと複数の記号に対応したピヨ。複数の記号に対応するにはまず、記号を配列に保持したピヨ。


Private symbols As Char() = New Char() _ 
    {","c, "."c, "?"c, "'"c, "@"c, ":"c, ";"c, "\"c}


次にコンストラクタを作ってソートをしたんだ。何故ソートしたのかはすぐに分かるよ。


Public Sub New()
    Array.Sort(Me.symbols)
End Sub


最後は記号判定用メソッドを改良するだけだぁ。


Private Function IsSymbol(ByVal str As Char) As Boolean
    'サーチしてあったら記号だよね♪
    If Array.BinarySearch(Of Char)(Me.symbols, str) >= 0 Then
        Return True
    End If
    Return False
End Function


これで嫌らしいドリィちゃんのテストはパスするはずだ・・・
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ ピよし!成功ぅー♪
次はJapan.を何とかしないとね。それはGetTokensメソッドを改良すればいいはずさ。


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 = " " OrElse Me.IsSymbol(str) Then
            If word.Length <> 0 Then
                tmp.Enqueue(New Token(word.ToString()))
                word = New StringBuilder(text.Length - readIndex)
            End If
            'シンボルは単体
            If Me.IsSymbol(str) Then
                tmp.Enqueue(New Token(str.ToString(), TokenCategory.Symbol))
            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


これでどうだぁー。ピョッシ成功♪これで次に移れるぞ気分爽快ー♪
ドリィちゃん「ふふ、それが快感になるわぁ。」
ゾゾォツ!鳥肌が立ったよ。あれ?ボクは鳥だから元からだね。
なんだか危ないけど今回はおしまい。

テーマ : プログラミング
ジャンル : コンピュータ

英語を啄ばむ3-文字を見極める目が大事。

くそぉー。前回はLexerに文字種判定機能をつけていなかったのが間違いピヨ。 コンパイラにとって文字の種別を判定することは大事ピヨ。 あれぇ?ボク、コンパイラ作っていたのかな?まぁそんなことはいいから実装しよう。
ドリィちゃん「この鳥頭!作っているのは簡易翻訳ソフトでしょ。もぅ。3歩で物事を忘れんだからぁ。」
うん?今日は登場が早いね・・・・・・もしかして、その手に持っているのは・・・
ドリィちゃん「テストよ♪」。
・・・・・・・・・まぁ、何を言っても仕方が無いから見せて。どれどれ。

< Test() > Public Sub IsAlphabetTest()
    'テストの準備
    Dim target As Lexer = GenereteTestTarget()
    Dim datas As Char() = New Char() {"a"c, "b"c, "c"c, "d"c, "e"c, _
        "f"c, "g"c, "h"c, "i"c, "j"c, "k"c, "l"c, "m"c, "n"c, "o"c, "p"c, _
        "q"c, "r"c, "s"c, "t"c, "u"c, "v"c, "w"c, "x"c, "y"c, "z"c, _
        "A"c, "B"c, "C"c, "D"c, "E"c, _
        "F"c, "G"c, "H"c, "I"c, "J"c, "K"c, "L"c, "M"c, "N"c, "O"c, "P"c, _
        "Q"c, "R"c, "S"c, "T"c, "U"c, "V"c, "W"c, "X"c, "Y"c, "Z"c}
    Dim method As MethodInfo = target.GetType().GetMethod("IsAlphabet", _
        BindingFlags.Instance Or BindingFlags.InvokeMethod Or _
        BindingFlags.Public Or BindingFlags.NonPublic)
    Assert.IsNotNull(method, _ 
        "IsAlphabetメソッドが無いけど、それどういうことぉぉ by ドリィ")

    'テスト実行
    Dim val(0) As Object
    For i As Integer = 0 To datas.Length - 1
        val(0) = datas(i)
        Assert.IsTrue(CBool(method.Invoke(target, val)), _
            "あらあら" & val(0).ToString() & _ 
            "はアルファベットじゃないのかなぁ by ドリィ")
    Next

    'エラーチェック
    val(0) = ","c
    Assert.IsFalse(CBool(method.Invoke(target, val)), _
            "あらあら" & val(0).ToString() & "を通していいのかな by ドリィ")
End Sub

< Test() > Public Sub IsSymbolTest()
    'テストの準備
    Dim target As Lexer = GenereteTestTarget()
    Dim datas As Char() = New Char() { _ 
        ","c, "."c, "?"c, "'"c, "@"c, ":"c, ";"c, "\"c}
    Dim method As MethodInfo = target.GetType().GetMethod("IsSymbol", _
        BindingFlags.Instance Or BindingFlags.InvokeMethod Or _
        BindingFlags.Public Or BindingFlags.NonPublic)
    Assert.IsNotNull(method, _ 
        "IsSymbolメソッドが無いけど、それどういうことぉぉ by ドリィ")

    'テスト実行
    Dim val(0) As Object
    For i As Integer = 0 To datas.Length - 1
        val(0) = datas(i)
        Assert.IsTrue(CBool(method.Invoke(target, val)), _
            "あらあら" & val(0).ToString() & "はお忘れ? by ドリィ")
    Next

    'エラーチェック
    val(0) = "8"c
    Assert.IsFalse(CBool(method.Invoke(target, val)), _
            "あらあら" & val(0).ToString() & "を通していいのかな by ドリィ")
End Sub


また嫌らしそうなのをいっぱい打ってるね。えーとどれどれ・・・
ドリィちゃん「カンニング禁止ぃ!」。
うっっっ!仕方が無い一丁やったるかぁ!


'指定した文字がアルファベットか否かチェック
Private Function IsAlphabet(ByVal str As Char) As Boolean
    Dim tmp As Char = Char.ToLower(str)
    If tmp >= "a"c And tmp <= "z"c Then
        Return True
    End If
    Return False
End Function

'指定した文字がシンボルか否かチェック
Private Function IsSymbol(ByVal str As Char) As Boolean
    If str = "."c Then
        Return True
    End If
    Return False
End Function


ドリィちゃん(*´ー`*)
ドリィちゃんが微笑むと何かいやな予感がするぞ。うわぁーまたエラーだぁー。 えっ!ちょっ!でもドリィちゃんずるいよ!ドット以外も入れているじゃないか!
ドリィちゃん「あらあら。英語の記号はドットだけじゃないのよぉ。テストし甲斐があるわぁ。」
またやられたピヨ。
お後がよろしいようなので今回はおしまい。

テーマ : プログラミング
ジャンル : コンピュータ

英語を啄ばむ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. なんて単語無いよねぇ・・・
ドリィちゃん「予想通り♪」
くやピィー。悔しさを胸に次回へ続く。

テーマ : プログラミング
ジャンル : コンピュータ

英語を啄ばむ1-泊まり木を探す鳥。

やることが決まったらもう迷う必要は無いピヨッ!学習環境づくりだぁ。まずは文法が詳しく書いてあるところを探しに出かけるぞー。とりゃー。

バサバサバサパーサバサバサバサバサバサパーサバサバサバサバサバサバサバサバサバサレクサバサバサ

うん。簡単に見つかったピヨ。ここがいいよね。

英文法大全

凄く詳しそうだ。ここをマスターすれば多くの洋書が読めそうだね♪ここのサイトの管理者に感謝する。多くの資料をさばく自信が無いからまずはここのサイトだけを参考にして簡易翻訳ソフトを作っていくことにするよ。次にすることはやっぱりソフトの命名だよね。プロジェクトの成功如何は名前によって決まるとさえ言われているんだ。ピームゥ・・・・・・・・・・・・・・・・・・・・・・・・・・・
そうだ!翻訳する人だからTranslator。でも本格的なものじゃないからfoolish translator(愚かな翻訳者)にしよう。 こうしておけば、いい加減な翻訳ソフトを作ってもクレームがこないだろう。

英語に弱いボクが作るソフトだから大目に見てね。

度入部分はこれで終わり。次回からは英文法を解析していくピヨ。適度にお楽しみに♪

テーマ : プログラミング
ジャンル : コンピュータ

プロフィール

インドリ

Author:インドリ
みなさん、はじめまして、
コンニチハ。

ボクは、無限の夢(infinity dream)を持つネタ好きな虹色の鳥インドリ(in dre)です。
色々な情報処理技術を啄ばむから楽しみにしてね。

http://twitter.com/indori
は別人による嫌がらせ行為です。
私とは関係ないので注意して下さい。
次はなりすましブログなどをするかもしれませんが、ここ以外でブログをするつもりがないので、ここ以外にインドリのブログがあったとしても無視してください。


何度言っても分からない人がいるので、ここにコメント欄へ書き込むときの注意事項を書きます。


一、社会人としてのマナーをわきまえましょう。
一、妄想に基づく書き込みを止めてください。
一、暴言の類は書かないで下さい。
一、某誹謗中傷サイトの書き込みは彼らの妄想に基づく書き込みですから無視して、ここへ書き込まないで下さい。
一、コメント書く前に他のコメントよく読んでから行って下さい。
一、言いがかかり等の行為を禁止します。
一、その他常識的に考えて迷惑なコメントはしないで下さい。


以上のルールを守れない人のコメントは削除します。



利用上の注意
ここに紹介してある文章およびプログラムコードは正確であるように心がけておりますが、内容を保証するものではありません。当サイトの内容によって生じた損害については、一切の責任を負いませんので御了承ください。


執筆したCodeZineの記事


【VB.NETで仮想CPUを作ろう】

  1. VB.NETで仮想CPUを作ろう
  2. レジスタの実装
  3. 仮想CPUのGUI化
  4. テストドライバの改良
  5. CPUの基礎動作の実装
  6. MOV命令の実装
  7. ADD命令実装
  8. SUB命令実装
  9. INC命令&DEC命令の実装と命令長
  10. MLU命令の実装とModR/Mについて
  11. DIV命令の実装とイベント設計について
  12. 機械語駆動式 関数電卓を作ろう!
  13. 機械語駆動式 関数電卓を作ろう! 解答編(前半)
  14. 機械語駆動式 関数電卓を作ろう! 解答編(後半)


【仮想ネットワーク実装でTCP/IPを学ぼう】
  1. TCP/IPの基礎と勘所
  2. ネットワークアクセス層の勘所
  3. インターネット層の勘所
  4. トランスポート層の勘所
  5. アプリケーション層の勘所
  6. セキュリティの基礎と仮想ネットワークの仕様
  7. GDI+と独自プロトコルの定義



【並列化】
インテル Parallel Studioを使って並列化プログラミングを試してみた
並列プログラミングの効率的なデバッグを実現する「Parallel Inspector」


【TBBシリーズ】
  1. インテル スレッディング・ビルディング・ブロックの概要
  2. インテルTBBから学ぶループの並列化
  3. スレッドセーフとインテルTBBのコンテナ
  4. インテルTBBのスレッドクラス


【OpenMPシリーズ】
  1. OpenMPの基礎構文
  2. OpenMPの実行時ライブラリと並列ループ
  3. OpenMPのメモリモデルとfork- joinモデル

最近の記事
最近のコメント
月別アーカイブ
カテゴリ
Ada (9)
COBOL (5)
C (9)
C++ (11)
C# (370)
D (25)
Java (8)
Perl (1)
Ruby (14)
PHP (2)
Boo (2)
Cobra (2)
LISP (6)
F# (33)
HTML (0)
XHTML (0)
CSS (0)
XML (0)
XSLT (0)
Scala (4)
WPF (0)
WF (2)
WCF (0)
LINQ (4)
MONO (5)
Linux (0)
MySQL (0)
ブログ内検索
リンク
最近のトラックバック
RSSフィード
ブロとも申請フォーム

この人とブロともになる

QRコード
FC2カウンター