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属性,这将非常有利.

它还可用于帮助函数仅头类型的库(例如绑定),否则非常烦人的需要在原始库之外链接该库.

posted @   zjh6  阅读(28)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示