我有下面的程序来标记一个Xpath表达式.但是它不能处理这样的表达式:

/employees/employee[secret-code=a/b/c][unicode=d/e/f]/salary

基本上通过'/'来标记化,因为谓词本身包含'/'.

const char *g_xpath_node_delim = "/";

static void tokenize_xpath (char *xpath_str)
{
    const char *tok = NULL;

    if (!xpath_str)
        return;

    while ((tok = strsep(&xpath_str, g_xpath_node_delim)) != NULL) {
        
        if (tok[0] == '\0')
            continue;
        fprintf(stdout, "\nToken '%s'\n", tok);
    }
}

我想构建一个由 node 及其谓词组成的 struct .有什么提示吗?

推荐答案

XSLT有一个相当复杂的语法(我不会进入任何计算机科学的语法课,因为我自己对这个主题一无所知),但它是一个递归定义的语法,这意味着你不能用一个基于正则表达式的单级tokenizer对表达式 struct 进行适当的分析.您需要一个真正的语法分析器来构建语法树.根据您想要实现的目标以及您想要投入的精力,您可以try 利用现有的开源NTFS解析器,或者编写自己的解析器.

C++相关问答推荐

这是一个合法的C Strdup函数吗?

在C中将通用字符名称转换为UTF-8

双指针指向常量双指针的指针类型赋值不兼容

C在声明带有值的数组时,声明大小有用吗?

错误:包含文件时类型名称未知

在C++中访问双指针

SSH会话出现意外状态

什么是.c.h文件?

等同于铁 rust 的纯C语言S未实现!()宏

致命错误:ASM/rwan ce.h:没有这样的文件或目录.符号链接还不够

获取前2个连续1比特的索引的有效方法

为四维数组中的Dim-1和Dim-3重新分配空间

我不知道为什么它不能正常工作,我用了get()和fget(),结果是一样的

用C++高效解析HTTP请求的方法

Realloc():中止的下一个大小无效(核心转储)

与外部SPI闪存通信时是否应禁用中断?

在文件描述符上设置FD_CLOEXEC与将其传递给POSIX_SPOWN_FILE_ACTIONS_ADCLOSE有区别吗?

将某些内容添加到链接列表时,列表中的其他项将使用最后添加的项的名称

可以对两种 struct 类型中的任何一种进行操作的C函数

I';我试着从.txt文件中读取文本,并用c计算其中的单词数量