使用正则表达式获取字符串中标记的开头和结尾

问题描述 投票:0回答:1

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

我知道我可以使用

<regex.h>
测试正则表达式,但我不确定如何找到字符串中匹配表达式的位置。

假设我有以下输入代码:

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

我想用颜色渲染它,就像上面的代码块中显示的那样。

我想要的是能够测试字符串中的一些表达式,并在字符串中获取第一个匹配结束的指针(或位置)。所以我会从测试

int main(int [...]
开始,第一个匹配将是
int
关键字,它在位置 3 处结束。然后我可以从那里继续检查,依此类推。

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

c regex syntax-highlighting
1个回答
0
投票

如果您将源代码加载到

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;
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.