Строка токенизирует выражение XPath

У меня есть программа ниже для токенизации выражения 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);
    }
}

Я хочу построить структуру узлов вместе с их предикатами. Есть какие-нибудь подсказки?

🤔 А знаете ли вы, что...
C можно использовать для создания высокоэффективных и производительных алгоритмов и вычислений.


2
50
1

Ответ:

Решено

XPath имеет довольно сложную грамматику (я не буду вдаваться в информатику на уроках грамматики, потому что сам не совсем разбираюсь в этом предмете), но это рекурсивно определенная грамматика, что означает, что вы не можете провести правильный анализ структуры выражения. с одноуровневым токенизатором на основе регулярных выражений. Вам понадобится настоящий синтаксический анализатор XPath для построения синтаксического дерева. В зависимости от того, чего вы хотите достичь и сколько усилий вы хотите приложить, вы можете либо попытаться воспользоваться существующим парсером XPath с открытым исходным кодом, либо написать свой собственный.