我有以下(非常简单的)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.rl
为scanner.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*
也许我错过了一些重要的东西?