Синтаксический анализ «комбинированного» ввода строки в C

#c #parsing #c-strings

#c #синтаксический анализ #c-строки

Вопрос:

Нужны несколько советов о том, что, по вашему мнению, было бы лучшим способом анализа определенного ввода в C.

Входные данные имеют формат xx xx xx xx xx xx xx y1 y2 y3 y4 , в котором xx и yy могут быть любыми двумя символами от a до z, но они имеют разные значения.

xx Необходимость относиться к ним как к «отдельным лицам» и выполнять некоторые проверки. y0 Необходимость рассматривать как комбинации и иметь другой набор проверок и операций. (например, необходимо проверить y1 и y2 вместе, а затем использовать их для выполнения действия).

Я использовал функцию strtoken для перебора xx символов, поскольку ее разделителем является пробел. Однако для второй части мне нужно изменить это поведение, поскольку код должен знать о 3 последовательных пробелах, которые сообщают, что мы сейчас находимся во второй части, и ему нужно начать проверку комбинаций y.

Все советы приветствуются 🙂 Спасибо

Комментарии:

1. Вы можете найти, где находится разрыв, с char *ptr = strstr(input, " "); помощью If found , написать '' в этой точке строковый терминатор и работать с двумя строками input и ptr 3 .

2. Я предполагаю, что не существует постоянного числа xx s или yn s? Как в, их переменное количество? Есть ли хотя бы верхняя граница?

3. Привет @Chase, там действительно постоянное количество, xx но не y's

Ответ №1:

Согласно вопросу OPs, нет никаких ограничений на значение, содержащееся в xx .

Т.е. xx может содержать любое значение от 0x00, 0x00 до 0xFF, 0xFF

Можно switch() использовать оператор, но без ограничений на значения потребуется 256 * 256 случаев.

Аналогичные соображения применимы и к y0 y1 y2 вычислениям.

Учитывая вышесказанное, код будет начинаться с:

 #include <stdio.h>
#include <string.h>


// '7' gotten from the OPs example
#define NUM_XX 7   

int main( void )
{
    char xx[2];
    char dummy;
    
    for( size_t x = 0; x < NUM_XX; x   )
    {
        xx[0] = getchar();
        xx[1] = getchar();
        dummy = getchar();
        
        // calculate index
        int index_xx = xx[0]*256   xx[1];
        switch( index_xx )  
        // index_xx could be most any value from 0 to 256*256
        {
            case 0:
                ....
                break;
                
            ....
            
            case 256*256:
                ....
                break;
        }
        
        // consume the intervening spaces
        getchar();
        getchar();
        getchar();
        
        char y0[2];
        char y1[2];
        char y2[2];
        
        the `y#`s would be read/processed in a similar loop, exiting the loop on EOF