東方算程譚

Oriental Code Talk ── επιστημηが与太をこく、弾幕とは無縁のシロモノ。

目次

Blog 利用状況

ニュース

著作とお薦めの品々は

著作とお薦めの品々は
東方熱帯林へ。

あわせて読みたい

わんくま

  1. 東京勉強会#2
    C++/CLI カクテル・レシピ
  2. 東京勉強会#3
    template vs. generics
  3. 大阪勉強会#6
    C++むかしばなし
  4. 東京勉強会#7
    C++むかしばなし
  5. 東京勉強会#8
    STL/CLRによるGeneric Programming
  6. TechEd 2007 @YOKOHAMA
    C++・C++/CLI・C# 適材適所
  7. 東京勉強会#14
    Making of BOF
  8. 東京勉強会#15
    状態遷移
  9. 名古屋勉強会#2
    WinUnit - お気楽お手軽UnitTest

CodeZine

  1. Cで実現する「ぷちオブジェクト指向」
  2. CUnitによるテスト駆動開発
  3. SQLiteで組み込みDB体験(2007年版)
  4. C++/CLIによるCライブラリの.NET化
  5. C# 1.1からC# 3.0まで~言語仕様の進化
  6. BoostでC++0xのライブラリ「TR1」を先取りしよう (1)
  7. BoostでC++0xのライブラリ「TR1」を先取りしよう (2)
  8. BoostでC++0xのライブラリ「TR1」を先取りしよう (3)
  9. BoostでC++0xのライブラリ「TR1」を先取りしよう (4)
  10. BoostでC++0xのライブラリ「TR1」を先取りしよう (5)
  11. C/C++に対応した、もうひとつのUnitTestFramework ─ WinUnit
  12. SQLiteで"おこづかいちょう"
  13. STL/CLRツアーガイド
  14. マージ・ソート : 巨大データのソート法
  15. ヒープソートのアルゴリズム
  16. C++0xの新機能「ラムダ式」を次期Visual Studioでいち早く試す
  17. .NETでマンデルブロ集合を描く
  18. .NETでマンデルブロ集合を描く(後日談)
  19. C++/CLI : とある文字列の相互変換(コンバージョン)
  20. インテルTBBによる選択ソートの高速化
  21. インテルTBB3.0 によるパイプライン処理
  22. Visual C++ 2010に追加されたSTLアルゴリズム
  23. Visual C++ 2010に追加されたSTLコンテナ「forward_list」
  24. shared_ptrによるObserverパターンの実装
  25. .NETでマンデルブロ集合を描く(番外編) ── OpenCLで超並列コンピューティング
  26. StateパターンでCSVを読む
  27. 状態遷移表からStateパターンを自動生成する
  28. 「ソートも、サーチも、あるんだよ」~標準C++ライブラリにみるアルゴリズムの面白さ
  29. インテルTBBの同期メカニズム
  30. なぜsetを使っちゃいけないの?
  31. WPFアプリケーションで腕試し ~C++でもWPFアプリを
  32. C++11 : スレッド・ライブラリひとめぐり
  33. Google製のC++ Unit Test Framework「Google Test」を使ってみる
  34. メールでデータベースを更新するココロミ
  35. Visitorパターンで遊んでみたよ
  36. Collection 2題:「WPFにバインドできる辞書」と「重複を許す検索set」
  37. Visual C++ 2012:stateless-lambdaとSQLiteのぷち拡張
  38. 「Visual C++ Compiler November 2012 CTP」で追加された6つの新機能

@IT

  1. Vista時代のVisual C++の流儀(前編)Vista到来。既存C/C++資産の.NET化を始めよう!
  2. Vista時代のVisual C++の流儀(中編)MFCから.NETへの実践的移行計画
  3. Vista時代のVisual C++の流儀(後編) STL/CLRによるDocument/Viewアーキテクチャ
  4. C++開発者のための単体テスト入門 第1回 C++開発者の皆さん。テスト、ちゃんとしていますか?
  5. C++開発者のための単体テスト入門 第2回 C++アプリケーションの効率的なテスト手法(CppUnit編)
  6. C++開発者のための単体テスト入門 第3回 C++アプリケーションの効率的なテスト手法(NUnit編)

AWARDS


Microsoft MVP
for Visual Developer - Visual C++


Wankuma MVP
for いぢわる C++


Nyantora MVP
for こくまろ中国茶

Xbox

Links

記事カテゴリ

書庫

日記カテゴリ

丸裸にされますた

ネタ元 → 再帰下降構文解析

そのまんま勉強会ネタになりそうなぱわぽをこさえていただきました。
ありがとうござりまするぅ。

で、お礼かたがた「日本語コードならもちっとわかりやすくなんのか」をテスト。

Module 数式の構文解析と評価

    Dim 入力文字 As Char
    Dim スタック As New System.Collections.Generic.Stack(Of Double)
    Dim 変数値 As New System.Collections.Generic.Dictionary(Of Char, Double)
    Dim 入力文字列 As String

    Sub スタック表示()
        For Each value As Double In スタック
            Console.Write(" {0}", value)
        Next
        Console.WriteLine()
    End Sub

    Sub 一文字読む()
        Do
            If 入力文字列.Length = 0 Then Return
            入力文字 = 入力文字列(0)
            入力文字列 = 入力文字列.Remove(0, 1)
        Loop While 入力文字 = " "c
    End Sub

    ' 因子(factor) とは ( 式 )
    '             もしくは 変数
    Sub 因子()
        If 入力文字 = "("c Then
            一文字読む()
            式()
            If 入力文字 = ")"c Then
                一文字読む()
            Else
                Console.WriteLine("?")
            End If
        ElseIf 入力文字 >= "a"c AndAlso 入力文字 <= "z"c Then
            スタック.Push(変数値(入力文字))
            スタック表示()
            一文字読む()
        Else
            Console.WriteLine("?")
        End If
    End Sub

    ' 項(term) とは 因子
    '          もしくは 因子 * 因子
    '          もしくは 因子 / 因子
    Sub 項()
        因子()
        Do
            If 入力文字 = "*"c Then
                Console.Write(入力文字)
                一文字読む()
                因子()
                Dim x As Double = スタック.Pop()
                Dim y As Double = スタック.Pop()
                スタック.Push(x * y)
                スタック表示()
            ElseIf 入力文字 = "/"c Then
                Console.Write(入力文字)
                一文字読む()
                因子()
                Dim x As Double = スタック.Pop()
                Dim y As Double = スタック.Pop()
                スタック.Push(y / x)
                スタック表示()
            Else
                Exit Do
            End If
        Loop
    End Sub

    ' 式(expression) とは 項
    '                もしくは 項 + 項
    '                もしくは 項 - 項
    Sub 式()
        項()
        Do
            If 入力文字 = "+"c Then
                Console.Write(入力文字)
                一文字読む()
                項()
                Dim x As Double = スタック.Pop()
                Dim y As Double = スタック.Pop()
                スタック.Push(x + y)
                スタック表示()
            ElseIf 入力文字 = "-"c Then
                Console.Write(入力文字)
                一文字読む()
                項()
                Dim x As Double = スタック.Pop()
                Dim y As Double = スタック.Pop()
                スタック.Push(y - x)
                スタック表示()
            Else
                Exit Do
            End If
        Loop
    End Sub

    Sub Main()
        変数値.Add("a"c, 1)
        変数値.Add("b"c, 2)
        変数値.Add("c"c, 3)
        変数値.Add("d"c, 4)
        ' 数値を直接入れるのは字句解析がめんどっちーのでパス
        入力文字列 = "(a+b)*(c+d)" 
        一文字読む()
        式()
        Console.WriteLine("result = {0}", スタック.Pop())
    End Sub

End Module

ふ、ふつくしい...

投稿日時 : 2009年2月9日 8:58

コメントを追加

# re: 丸裸にされますた 2009/02/09 9:42 インドリ

επιστημηさんがVB.NETで書いている点に吃驚しました!
何時の間にかεπιστημηさんVB.NET好きになったんですね。

# re: 丸裸にされますた 2009/02/09 9:56 επιστημη

好きなわけじゃねぇです。
タダのportにどんだけてこずったやら。
これがC#なら"ちゃっちゃかちゃー"ですよ。

# re: 丸裸にされますた 2009/02/09 14:26 アクア

素っ裸にした犯人が通り過ぎようとしています。


取り上げて下さり、ありがとうございます。<(_ _)>

# re: 丸裸にされますた 2009/02/09 16:16 επιστημη

ひん剥かれた被害者がたたずんでいます。しくしく...

ぃぇぃぇ、お粗末様にございます。
C#コードを吐くyacc/lexがあるみたいなので、
いつの日にかちゃんとした(?)数式電卓を。

# re: 丸裸にされますた 2009/02/09 21:22 裏口

大昔にこういうコード(ってかソースプログラム)書いてた親父が通ります。

# 言語はCOBOL/S。懐かしいw
# 後付けのプログラム仕様書を書くのめんどかっただけ。

# re: 丸裸にされますた 2009/02/10 10:10 επιστημη

COBOLで? ユーザに数式を入力してもらって、なんてなシチュエーションでしょかしら。

簡単なもんでいいからパーサを書けるとなにかと役に立ちますな。
芸の肥やしになりまする。

# re: 丸裸にされますた 2009/02/15 12:49 インドリ

昨日教えて頂いたMPPG/MPLEXについて調べました。

http://indori.blog32.fc2.com/blog-entry-666.html

一応Babelの場所が分かったら動きそうな所まで調査しました。
参考になったら幸いです。

# re: 丸裸にされますた 2009/02/16 8:51 επιστημη

↑お疲れっしたーwww

もうね、ここまで苦労して使わずとも、
ふつーにyacc/lexで吐いてC++/CLI通せばいんぢゃね?
ておもうですよー

# re: 丸裸にされますた 2009/02/16 9:37 インドリ

ボクもそう思いますwww

タイトル
名前
URL
コメント