我正在try 用C本身为C程序实现某种语法突出显示.假设我已经将我想要突出显示的所有源代码存储到一个字符串中,在打印它之前,我想知道每个标记使用什么 colored颜色 .

我知道我可以使用<regex.h>test个正则表达式,但我不确定如何在字符串中匹配表达式的位置.

假设我有以下输入代码:

int main(int argc, char** argv) {
    int var = my_func("Hello, world.");
    return 0;
}

我想用 colored颜色 来呈现它,就像上面的代码块中显示的那样.

我想要的是能够测试字符串中的一些表达式,并在字符串中第一个匹配项ends处获得一个指针(或位置).所以我会从测试int main(int [...]开始,第一个匹配的是int关键字,它在位置3结束.然后我可以从那里继续判断,以此类推.

这是我第一次要处理这样的事情,所以如果有人知道更好的方法,请告诉我.

推荐答案

如果将源代码加载到char数组中,则可以考虑编写一个int get_token(const char *s, int *token_len)函数,该函数返回令牌类型并将令牌长度存储到*token_len.根据令牌类型,您可以使用以下命令输出相应的 colored颜色 和令牌源:

#include <stdio.h>

enum tokenType {
    END, WHITESPACE, NEWLINE, COMMENT, PREPROCESSOR,
    KEYWORD, IDENTIFIER, STRING, CHARCONST, NUMBER, OPERATOR,
    OTHER
};

struct parse_context {
    const char *filename;
    const char *source;
    size_t source_pos;
    int line_number;
    int column_number;
    int at_bol;
    ...
};

const char *colors[] = {
    [END] = ...,
    [WHITESPACE] = ...,
    [NEWLINE] = ...,
    [COMMENT] = ...,
    [PREPROCESSOR] = ...,
    [KEYWORD] = ...,
    [IDENTIFIER] = ...,
    [STRING] = ...,
    [CHARCONST] = ...,
    [NUMBER] = ...,
    [OPERATOR] = ...,
    [OTHER] = ...,
};

enum tokenType get_token(struct parse_context *pc, const char *s, int *token_len) {
    ...
}

void my_func(const char *filename, const char *s) {
    struct parse_context ctx = {
        filename, s, 0, 1, 1, 1,
    };
    enum tokenType last_token = END;

    for (;;) {
        int len;
        enum tokenType tok_type = get_token(&ctx, s, &len);
        if (tok_type != last_token) {            
            printf("%s", colors[tok_type]);
            last_token = tok_type;
        }
        if (tok_type == END) {
            break;
        } else {
            printf("%.*s", len, s);
            s += len;
        }
    }
}

C++相关问答推荐

如何将不同长度的位转换成字节数组?

标准的C17标准是用括号将参数包装在函数声明中吗

我编译了一个新的c程序,并收到以下错误

如何将字符串argv[]赋给C中的整型数组?

难以理解Makefile隐含规则

警告:C++中数组下标的类型为‘char’[-Wchar-subpts]

如何在C语言中正确打印图形

如何使用libgpio(d)为Raspberry Pi编译C程序?

这个空指针类型的转换是有效代码还是恶意代码?

GCC错误,共享内存未定义引用?

为什么电路板被循环删除?

不确定如何处理此编译错误

如何使用空元素块声明指针数组

为什么我无法访问C语言中的文件

为什么我的旧式&q;函数在传递浮点数时会打印2?

解密Chrome加密密钥

在C中交换字符串和数组的通用交换函数

我正在使用 klib 库 我可以使用 (khash) KHASH_SET_INIT_INT64() 负值作为键.因为我在头文件中看到它使用 unsigned long int

为什么程序在打印每个数字之前要等待所有输入?

我怎样才能用c语言正常运行这两个进程?