d位置错误信息
module lexer;
import std.stdio;
import token;
class Lexer() {
string sourceText;
char currentChar;
int charIndex;
int line;
int column;
this(string sourceText) {
this.sourceText = sourceText;
this.currentChar = '';
this.charIndex = 0;
this.line = 1;
this.column = 1;
}
}
在此遇见问题:
module dpl0c;
import std.stdio;
import lexer;
enum VERSION = "0.0.1";
void main(string[] args) {
writefln("\nThe D PL0 Compiler %s", VERSION);
string sourceText = "Hello, World!";
Lexer lex = new Lexer(sourceText);
lex.sayHello();
}
//dmd dpl0c.d lexer.d token.d
//错误:按`未实例化`的类型用`"lexer.lexer()"`模板类;要实例化它,请用`'Lexer!(arguments)'`
这里:
class Lexer() {
通过加圆括号,使Lexer接受编译时参数,而这里无参,因此用途相当狭窄.
Lexer是模板,必须用适当参数实例化它.只能Lexer!().
因此,有两个选择,用Lexer!()代替Lexer,或删除括号.
用无参会受到限制,它主要是为了允许成为插件模板,或除非使用它,在二进制文件中不包含它.
感谢显示模块上的奇怪错误.
原因是:libdparse(code-d/serve-d及其他底层工具用的D解析器)解析代码,而'',根据D语法是无效的,因为在'x'中,总是需要有一个符,在词法分析阶段直接按无效令牌发出,解析器不知道情况.
但是,此错误令牌不包括位置信息,因此默认为0位置.
现在解析器在错误令牌的令牌位置发出一个错误,因为它需要一个主式,但是没有得到有效的令牌.
现在在code-d中处理发出的错误,它认为字节偏移是0(是有效偏移),不知道长度,所以它选择0位置的关键字来猜测.
已修复,libdparse版本,这里
现在有x = '';语法不完整时,模块不再是红色下划线了.
给函数加()会使它们变成模板,如果希望编译器自动推导return/scope属性,这将非常有利.
它还可用于帮助函数的仅头类型的库(例如绑定),否则非常烦人的需要在原始库之外链接该库.
浙公网安备 33010602011771号