東方算程譚

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

記事カテゴリ

書庫

日記カテゴリ

電卓作成ちう(おまけ)

電卓作成ちうのつづき...

逆ポーランド電卓は実装簡単だけどいかんせん馴染みが薄いので
フツーの数式を解釈して計算する電卓をおまけにこしらえてます。
# ぶっちゃけ尺余り対策ですなwww

(1+2)*(3+4) なんてー数式の解釈(構文解析)にはパーサを使うわけですが、
手書きすんのもかったるい。なので パーサ・ジェネレータ を探してました。

Visual Studio 2008 SDK には C#版 yacc/lex である GPPG,GPLEX が同梱
されてんだけども、こいつらマニュアルぺらぺらのロクでもない代物
ってわけで、オーストラリア クイーンズランド工科大の
オリジナルな GPPG,GPLEX を見つけてきたですよ。

今回はパーサだけでいい(レキサはテケトー)から GPPG1.3.5 を試運転。

gppg Calc.y > Calc.cs
csc /r:QUT.ShiftReduceParser.dll Calc.cs

# QUT.ShiftReduceParser.dll は gppg.exe と同じディレクトリ: binaries にある。
# 上の Calc.y は testfiles にあったもの。
# ちなみに RealCalc.y には些細なバグをふたつ見つけた。
# ↑PLAS-projectに報告済

...おー、動く動く♪
よーしパパ電卓作っちゃうぞー、とか言ってるの。もう見てらんない。

チャーハンじゃないってヴぁ...

投稿日時 : 2009年3月21日 10:56

コメントを追加

# re: 電卓作成ちう(おまけ) 2009/03/21 14:57 インドリ

これすばらしい研究材料ですね♪
早速ダウンロードしました。
後でソースコード読みます♪

# re: 電卓作成ちう(おまけ) 2009/03/21 21:52 επιστημη

んじゃ宿題。

RealCalc.y から yylex() もぎとって
RealCalc.lex を起こし、GPPG と GPLEX とで RealCalc
を作んなさい。

gppg /gplex RealCalc.y > RealCalc.cs
gplex /out:Lexer.cs RealCalc.lex
csc /r:QUT.ShiftReduceParser.dll RealCalc.cs Lexer.cs

で実行モジュールが作れるはず。
# RealCalc.y のバグはわからんかったら教えちゃる。

# re: 電卓作成ちう(おまけ) 2009/03/22 11:42 インドリ

Real.yのエラーをひとまず三つ発見しました♪


1.コンストラクタが足りない
Parser() : base(null) { }をmainの前に追加。

2.イージータイプミス
こんなプロパティはない
parser.scanner = new Lexer(reader);
正解:
parser.Scanner = new Lexer(reader);

3.クラスの指定が間違っている
scanner.yyerror
this.Scanner.yyerror


このサンプル結構間違いありますねw

# re: 電卓作成ちう(おまけ) 2009/03/22 11:49 インドリ

はーい一つ質問があります♪

GPPG1.3.5なのですが付属しているソースコードのGplexBuffers.csファイルが不足してコンパイルできません。
バイナリはあるので実行可能ですがどうしても気になります。
GplexBuffers.csファイルはどこにあるのでしょうか?
教えて頂ければ幸いです。

# re: 電卓作成ちう(おまけ) 2009/03/22 12:15 επιστημη

> GplexBuffers.cs

GPLEXのproject/GPLEX に同名のファイルがあります。
コピってきたらさっくりbuildできました。

ただ、これでいいのかは確認せなあきませんな。

# re: 電卓作成ちう(おまけ) 2009/03/22 15:10 インドリ

επιστημηさん有難うございます。
これで、宿題後ソースコードの探索が出来ます。
うっピョッピョッピョッピョッピョッ

# re: 電卓作成ちう(おまけ) 2009/03/22 17:51 インドリ

この宿題案外難しいですね。
GPLEXはサンプルそのものでエラー出るし、クラスが足りないと言われるw
そういえば、Real.yにまだエラーがw

誤:%left UMINUS
正:%right UMINUS

Real.yは見本なのに間違い多すぎw

# re: 電卓作成ちう(おまけ) 2009/03/26 16:29 インドリ

先ほどは失礼しました。
GPLEXについてなんですが、ボクが試したところ添付のテストコードすら動きませんでした。
επιστημηさんの方はちゃんと動きましたか?

# re: 電卓作成ちう(おまけ) 2009/03/26 16:46 επιστημη

ぉぃぉぃぉぃ、初心者じゃないんだから「動きませんでした」はないんぢゃない?

- GPLEX がエラー吐く?
- GPLEX の吐いたコードがコンパイル・エラー?
- GPLEX の吐いたコードの実行時にエラー?

少なくとも wordcount.lex は恙無く
生成/コンパイル/実行できました。

# re: 電卓作成ちう(おまけ) 2009/03/26 17:49 インドリ

てへっ♪恥かしいですぅ。
動かないというのは、GPLEXがエラーを吐きます。
エラーは次の通りです。


GPLEX: input parsed, AST built without error. 171 msec
GPLEX: NFSA built without error. 15 msec
GPLEX: opened listing file <wordcount.lst>
GPLEX: DFSA built without error. 31 msec
GPLEX: DFSA minimized. 15 msec
GPLEX: using frame from embedded resource
GPLEX: opened output file <wordcount.cs>
GPLEX: Shortest strings found. 0 msec
GPLEX: C# file emitted. 31 msec
GPLEX <wordcount.lex> Completed successfully


何も弄っていないのですがエラーが出るので吃驚しました。

# re: 電卓作成ちう(おまけ) 2009/03/27 12:34 επιστημη

> GPLEX <wordcount.lex> Completed successfully

これがエラー? "成功裏に完了"てゆってるよ?

# re: 電卓作成ちう(おまけ) 2009/03/27 15:46 インドリ

しまった!!!英語弱いので気付きませんでした。

>GPLEX: NFSA built without error. 15 msec
>GPLEX: DFSA built without error. 31 msec

この部分で、「あれ?エラーが出ているぞ」
と思ってしまいました。

# re: 電卓作成ちう(おまけ) 2009/03/27 16:44 επιστημη

> GPLEX: NFSA がエラー無しに 15msec で生成された
> GPLEX: DFSA がエラー無しに 31msec で生成された

英語に弱いんじゃないね、"読もうとしない"だけだ (^^

# re: 電卓作成ちう(おまけ) 2009/03/27 16:53 インドリ

仰るとおりだと思います。
英語が怖くて拒否反応を起こしてしまうので、
英語で大量のメッセージが返されると、
激しく動揺して冷静に読めなくなってしまいます(笑)
それで初心者化してしまったのかもしれません。
いやぁ、物凄く恥かしいです。

タイトル
名前
URL
コメント