d如何使用lexer

原文

我正在试写脚本来解析c头文件,然后输出多语言的基本绑定.
前段时间在论坛上看到D编译器可作为使用,并发现lexer页
但:

import dmd.lexer: Lexer

失败.
要如何才能调用lexer(或解析器)?

dmd是个单独的代码基,在普通D构建中不可用.
必须提供它,然后链接进它.
最简单方法是通过dub使用dmd-fe.示例

{
    "name": "lexer_test",
    "dependencies": {
        "dmd:frontend": "~>2.101.0"
    }
}

测试:

//source/lexer_test.d:
module lexer_test.d;

void main()
{
    import dmd.globals;
    import dmd.lexer;
    import dmd.tokens;

    immutable expected = [
        TOK.void_,
        TOK.identifier,
        TOK.leftParenthesis,
        TOK.rightParenthesis,
        TOK.leftCurly,
        TOK.rightCurly
    ];

    immutable sourceCode = "void test() {} // foobar";
    scope lexer = new Lexer("test", sourceCode.ptr, 0, sourceCode.length, 0, 0);
    lexer.nextToken;

    TOK[] result;

    do
    {
        result ~= lexer.token.value;
    } while (lexer.nextToken != TOK.endOfFile);

    assert(result == expected);
}

然后只需"$dub run".

posted @ 2023-01-07 10:21  zjh6  阅读(25)  评论(0)    收藏  举报  来源