01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
2008-02-26 Tue
■ std.metastrings の Format [D言語]
dmd 2.011 現在、壊れている?
std.metastrings 47行目
else static if (is(typeof(A[0]) : char[]))
こんなかんじ
else static if (is(typeof(A[0]) : const char[]))
に直すと正しく動く。
■ CTFE版を作った [D言語]
http://mikanya.dip.jp/repos/junk/meta/lexer_ctfe.d
ソースファイルのサイズ制限が無い。
トークンを改行区切りの文字列に出力、
mixin 文にかけるとコンパイルできる。
次は構文木を作ってみよう。
■ 識別子を認識するようになった。 [D言語]
compile time D lexer
http://mikanya.dip.jp/repos/junk/meta/lexer.d
文字列と数字のリテラルも
少しだけ認識する。
ソースファイルが 1024 バイトを超えると、
コンパイラが文句を言う。
2008-02-25 Mon
■ トークンを少しだけ認識するようになった。 [D言語]
compile time D lexer
http://mikanya.dip.jp/repos/junk/meta/lexer.d
hello.d
module hello; import std.stdio; void say() { writefln("hello world!!"); } void main() { say(); }
lexer_test.d
import meta.lexer; pragma(msg,lexer!(import("hello.d"));
実行結果
<token module > <token hello; > <token import > <token std. > <token stdio; > <token void > <token say( > <token ) > <token { > <token writefln( > <token "hello > <token world! > <token ! > <token ") > <token ; > <token } > <token void > <token main > <token ( > <token ) > <token { > <token say( > <token ) > <token ; > <token } >
2008-02-23 Sat
■ compile time D lexer [D言語]
コンパイル時に動作する字句解析器
http://mikanya.dip.jp/repos/junk/meta/lexer.d
ライセンス
NYSL Version 0.9982 に従います。
まだ作りかけ。
スペースとコメントと改行を認識する。
2008-02-22 Fri
■ D言語用の senne に log API を追加した。 [D言語][Senna]
http://mikanya.dip.jp/repos/senna/
前回からの変更点
- log API を呼べるようにした。
呼べるようにしただけで動かない。
SEN_LOG マクロをどうやって実装しようか?
mixin(SEN_LOG!(...));
mixin(sen_log!(...));
この形で使えるようにしてみた。
うまく動かない。
2008-02-16 Sat
■ tokenizer [D言語]
コンパイル時に動作する tokenizer を作ってみた。
スペース区切りの文字列でしか動作しない。
ライセンス
NYSL Version 0.9982 に従います。
http://mikanya.dip.jp/repos/junk/meta/tokenizer.d
/++ + compile time tokenizer + + スペースで区切られた文字列を分割し、 + 結果をタプルで返す + + Authors: mikanya + Copyright: mikanya + License: NYSL Version 0.9982 + + Example: + ------------------------------------- + import std.stdio; + import meta.tokenizer; + + void main() + { + const char[] s = "this is a pen"; + alias Tokenizer!(s).tokens list; + + foreach(i;list) writefln(i); + + } + ------------------------------------- +/ module meta.tokenizer; template Tuple(E...) { alias E Tuple; } template Parse(const char[] src) { static if (src.length == 0) { const Parse = ""; } else static if (src[0] != ' ') { const Parse = src[0] ~ Parse!(src[1..$]); } else { const Parse = ""; } } template Tokenizer(const char[] src) { static if (src.length == 0) { alias Tuple!("") tokens; } else { const token = Parse!(src); static if(token.length == src.length) { const next = src[token.length .. $]; } else { const next = src[token.length + 1 .. $]; } alias Tuple!(TokenizerRecurse!(token,next).tokens) tokens; } } template TokenizerRecurse(const char[] tkn,const char[] src) { static if (src.length > 0) { alias Tokenizer!(src) next; alias Tuple!(tkn, next.tokens) tokens; } else { alias Tuple!(tkn) tokens; } }
こんな風に使う
import std.stdio; import meta.tokenizer; void main() { const char[] s = "this is a pen"; //foreach(i:Tokenizer!(s).tokens) writefln こう書くと、 //Assertion failure: '0' on line 4917 in file 'expression.c' //と出てコンパイルが通らない。 dmd2.010 alias Tokenizer!(s).tokens list; foreach(i;list) writefln(i); }
結果
this is a pen
次は、字句解析器を書いてみようか
参考
テンプレート再訪
2008-02-15 Fri
2008-02-06 Wed
■ D言語用に senne.h を変換した。 [D言語][Senna]
http://mikanya.dip.jp/repos/senna/
ロギング用のマクロ以外は使えるはず。
使い方
DMD 用のインポートライブラリを用意して、
senna.d をインポートして、
コンパイル。
ところで、
LGPL のヘッダを D言語用に変換して公開するにどうするといいんだろ?
とりあえず
元々のコピーライトを残して、
COPYING ファイルをつけた。
はこれでいいのかな?
2008-02-04 Mon
■ できた? [D言語][Senna]
[2008-02-01-1]
とりあえず senna.h で未定義の構造体を void にした。
sen_create_index は動いた。
[2008-02-02-1]
前方宣言が原因か。
D言語にどうあわせる?
これを
typedef struct _sen_db sendb;
こうか?
struct _sen_db; alias _sen_db sen_db;
2008-02-02 Sat
■ だめだた [D言語][Senna]
[2008-02-01-1]
senna.h の関数に構造体のポインタを渡すものがある。
渡す構造体が senna.h に定義されていない。
htod で変換しただけでは動かない。
typedef struct _sen_db sen_db;
ここでエラーが出る。
2008-02-01 Fri
■ D言語での Senna は [D言語][Senna]
D言語っぽい使い方だとどんな感じろう。
D スタイルにする。
sen_records 型は foreach 文が使えるとよさそう。
import std.stdio; import senna; int main() { sen_init(); //辞書作成 Index index = new Index(...); index.upd(...); //検索 Records records = new Records(...); index.select(...); //結果表示 records.sort(...); foreach(...) { writefln(...); } sen_fin(); readln(); return 0; }
こんな感じで使えるようにしてみよう。
■ D言語で Sennaを使う方法 [D言語][Senna]
ヘッダファイルの変換
C の .h から D のモジュールへの変換
C言語ヘッダ変換
インポートライブラリの作成
IMPLIB
implib/system libsenna.lib libsenna.dll