0

我有以下(非常简单的)Ragel 文件scanner.rl

void lex(string data) {
    int cs, act, top;
    auto p = data.ptr;
    typeof(p)
        pe = &data[$ -1],
        eof = pe,
        ts,
        te;

    %%{
        machine scanner;

        identifier = alpha . alnum**;

        main := |*
            identifier => { ("Identifier: " + data[ts..te]).writeln; };
            space;
        *|;

        write data;
        write init;
        write exec;
    }%%
}

void main() {
    "this is a test".lex;
}

我转换scanner.rlscanner.d使用ragel -D scanner.rl. 当我尝试使用 编译生成的D文件时dmd scanner.d,我收到以下错误消息:

scanner.d(97):错误:无法将 const(byte)* 类型的表达式 (&_scanner_actions[cast(ulong)_scanner_from_state_actions[cast(ulong)cs]]) 隐式转换为 byte*scanner.d(110):错误:不能将 const(char)* 类型的表达式 (&_scanner_trans_keys[cast(ulong)_scanner_key_offsets[cast(ulong)cs]]) 隐式转换为 char*scanner.d(166):错误:无法隐式转换表达式 (&_scanner_actions[cast(ulong) const(byte)* 类型的 _scanner_trans_actions[cast(ulong)_trans]]) 到 byte*scanner.rl(22):错误:无法将 immutable(char)* 类型的表达式 (ts) 隐式转换为 ulongscanner.d(186 ): 错误:无法将 const(byte)* 类型的表达式 (&_scanner_actions[cast(ulong)_scanner_to_state_actions[cast(ulong)cs]]) 隐式转换为 byte*

也许我错过了一些重要的东西?

4

1 回答 1

2

您确定 ragel 正在生成 D2 代码吗?看起来它缺少 const.... 查看 ragel 的源代码,看起来像 ragel -D 生成 D1 和 ragel -E 生成 D2,尽管这在 --help 中没有记录!

于 2013-09-30T22:27:26.893 回答