東方算程譚

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

記事カテゴリ

書庫

日記カテゴリ

とんとごぶさたパーサとレクサ

で、ほーんとひっさしぶりに yacc と lex を使ってみるなり。

1. GnuWin32 から bison(GNU版yacc) と flex(GNU版lex) を拾ってくる。

2. 字句定義 calc.l を書く。
%{
#include "y.tab.h"
int yywrap() { return 1; }
%}

%%

[0-9]+     { yylval.val = atof(yytext);
             return(NUMBER);
           }
[0-9]+\.[0-9]+ {
             sscanf(yytext,"%f",&yylval.val);
             return(NUMBER);
           }
"+"        return(PLUS);
"-"        return(MINUS);
"*"        return(MULT);
"/"        return(DIV);
"^"        return(EXPON);
"("        return(LB);
")"        return(RB);
\n         return(EOL);
.          { yyerror("Illegal character");
             return(EOL);
           }
%%

3. 構文定義 calc.y を書く。
%{
#include <stdio.h>
#include <math.h>
void yyerror(char *s) {
  printf("%s\n",s);
}

%}

%union {
   float val;
}

%token NUMBER
%token PLUS MINUS MULT DIV EXPON
%token EOL
%token LB RB

%left  MINUS PLUS
%left  MULT DIV
%right EXPON

%type  <val> exp NUMBER

%%
input   :
        | input line
        ;

line    : EOL
        | exp EOL { printf("%g\n",$1);}

exp     : NUMBER                 { $$ = $1;        }
        | exp PLUS  exp          { $$ = $1 + $3;   }
        | exp MINUS exp          { $$ = $1 - $3;   }
        | exp MULT  exp          { $$ = $1 * $3;   }
        | exp DIV   exp          { $$ = $1 / $3;   }
        | MINUS  exp %prec MINUS { $$ = -$2;       }
        | exp EXPON exp          { $$ = pow($1,$3);}
        | LB exp RB              { $$ = $2;        }
        ;

%%

int main() {
  yyparse();
}

4. bison / flex でコードを吐かせてコンパイル
bison -d -y calc.y
flex -I calc.l
cl -D__STDC__ -Fecalc.exe lex.yy.c y.tab.c

5. calc.exe を実行!
>calc
(1+2)*(3+4)
21 ← キターーーー!!

た、たのすい...

投稿日時 : 2009年2月17日 10:08

コメントを追加

# re: とんとごぶさたパーサとレクサ 2009/02/17 11:26 インドリ

ボクも最近していないので、この記事を見て触りたくなってきました♪

# re: とんとごぶさたパーサとレクサ 2009/02/17 11:35 インドリ

連続投稿になって済みません。
私はyacc/lexプログラムジェネレータonUNIXという本を参考にしていますが、yacc/lexのお勧め資料はこの他にありますでしょうか?
教えて頂ければ幸いです。

# re: とんとごぶさたパーサとレクサ 2009/02/17 11:40 επιστημη

添付まにゅある > お勧め資料

# re: とんとごぶさたパーサとレクサ 2009/02/17 12:36 やじゅ

yacc と lex って久しぶりにみたな。ちと検索した
http://kmaebashi.com/programmer/devlang/yacclex.html

# re: とんとごぶさたパーサとレクサ 2009/02/17 12:44 インドリ

επιστημη返信有難うございます♪
添付マニュアル・・・英語ですよねorz
やっぱり英語勉強しなきゃと思いました。

やじゅさん有難う。
このサイト勉強になります♪

# re: とんとごぶさたパーサとレクサ 2009/02/17 12:44 インドリ

あれ?済みません「さん」が抜けていました。

# re: とんとごぶさたパーサとレクサ 2009/02/17 12:49 aetos

おらいりーの
http://www.amazon.co.jp/dp/4756102972
が、某古本屋に入荷するとすぐに売れちゃう人気商品だったので、気になって入手してみたけど、まだ1ページも読んでないw

某古本屋
http://www.bookcyber.net/

# re: とんとごぶさたパーサとレクサ 2009/02/17 14:06 επιστημη

> やっぱり英語勉強しなきゃと思いました。

勉強なんかしちゃダメよw
インドリのポリシーに反するべ?

# re: とんとごぶさたパーサとレクサ 2009/02/17 14:34 インドリ

>インドリのポリシーに反するべ?

しまったw
確かにポリシーに反します。
英語を何とか好きにならなくちゃ!

# re: とんとごぶさたパーサとレクサ 2009/02/17 16:52 επιστημη

で、こいつのアクション部をひとひねりすれば抽象構文木が
生成できて、さらにはちょいとした"電卓言語"になるわけよねー♪

なんてーコトを十数年前にやってたです。

# re: とんとごぶさたパーサとレクサ 2009/02/22 7:20 Jitta

十数年前に、プリコンパイラを作ろうとして、挫折したですよ。。。

# re: とんとごぶさたパーサとレクサ 2009/02/23 17:43 επιστημη

うんうんう。
yacc/lexがやってくれるのってコンパイラのごく一部分でしかないのよね。
抽象構文木こさえてコード生成部組んでどーのこーのがどえりゃー面倒。
パーサのバグ抜きがこれまた面倒。
yaccインタプリタとかVisual yaccとかあればいいノニ。

# rcGCYoloOTlQaejqmRC 2014/07/18 23:32 http://crorkz.com/

rOTEvA wow, awesome article. Fantastic.

タイトル
名前
URL
コメント