我正在尝试在 C 本身中为 C 程序实现某种语法突出显示。想象一下,我已将要突出显示的所有源代码存储到一个字符串中,在打印之前,我想知道每个标记使用什么颜色。
我知道我可以使用
<regex.h>
来测试正则表达式,但我不确定如何找到字符串中匹配表达式的位置。
假设我有以下输入代码:
int main(int argc, char** argv) {
int var = my_func("Hello, world.");
return 0;
}
我想用颜色渲染它,就像上面的代码块中显示的那样。
我想要的是能够测试字符串中的一些表达式,并在字符串中获取第一个匹配结束的指针(或位置)。所以我会从测试
int main(int [...]
开始,第一个匹配将是 int
关键字,它在位置 3 处结束。然后我可以从那里继续检查,依此类推。
这是我第一次处理这样的事情,所以如果有人知道更好的方法,请告诉我。
如果您将源代码加载到
char
数组中,您可以考虑编写一个 int get_token(const char *s, int *token_len)
函数,该函数返回标记类型并将标记长度存储到 *token_len
中。根据令牌类型,您可以使用以下方式输出相应的颜色和令牌源:
enum tokenType {
END, WHITESPACE, NEWLINE, COMMENT, PREPROCESSOR,
KEYWORD, IDENTIFIER, STRING, CHARCONST, NUMBER, OPERATOR,
OTHER
};
const char *colors[] = {
[END] = ...,
[WHITESPACE] = ...,
[NEWLINE] = ...,
[COMMENT] = ...,
[PREPROCESSOR] = ...,
[KEYWORD] = ...,
[IDENTIFIER] = ...,
[STRING] = ...,
[CHARCONST] = ...,
[NUMBER] = ...,
[OPERATOR] = ...,
[OTHER] = ...,
};
enum tokenType get_token(const char *s, int *token_len) {
...
}
void my_func(const char *s) {
for (;;) {
int len;
enum tokenType tok_type = get_token(s, &len);
printf("%s", colors[tok_type]);
if (tok_type == END) {
break;
} else {
printf("%.*s", len, s);
s += len;
}
}
}