前の月 / 次の月 / 最新

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[]))

に直すと正しく動く。

Referrer (Inside): [2008-06-23-2]

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

めためた [D言語]

C言語をコンパイル時にD言語に変換する。
すでに誰かが作っていそう。

hello.c

#include <stdio>

int main(void)
{
    printf("hello world\n");

    return 0;
}

hello.d

import cc;

mixin(compile!("hello.c"));

こんな感じでつかうのを作れそうだ。

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;

ここでエラーが出る。

Referrer (Inside): [2008-02-04-1]

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

Referrer (Inside): [2008-02-04-1] [2008-02-02-1]

過去ログ

2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12