Разрешение списков переменной длины в yacc - PullRequest
0 голосов
/ 14 сентября 2009

Я хотел бы иметь возможность проанализировать следующую структуру:

blah
{
    "string-1",
    "string-2",
    ...,
    "string-n"
}

Я использую flex для токенизации, и это отлично работает. Я использую yacc (бизон) для разбора.

Какой рекомендуемый способ разрешить эту структуру? Прямо сейчас, в моем файле test.y, у меня есть:

blah_command:
    BLAH OPEN_BRACE string_list CLOSE_BRACE
    {
        printf( "String list is %s\n", $3 );
    }

string_list: /* empty */
    |
    STRING
    {
        return $1;
    }
    |
    STRING COMMA string_list
    {
        strcat($1, ",");
        strcat($1, $3);
    }

Я подозреваю, что strcat () - действительно очень плохая идея. Я настоящий новичок, когда дело доходит до lex / yacc (около 3 часов опыта), так что удар по запястью и указатель в правильном направлении было бы здорово.

РЕДАКТИРОВАТЬ: Цель этого состоит в том, чтобы позволить мне создать тестовый комплект для внешнего приложения. Лексинг / синтаксический анализ будут использоваться для интерпретации тестового сценария, который предоставляет пользователь. Одна команда позволяет пользователю отправить сообщение приложению, затем я читаю многострочный ответ и сравниваю со списком строк переменной длины, которые пользователь предоставил в сценарии. Фрагмент, который я разместил выше, - это то, как я решил дать пользователю возможность определить возможный ответ.

Например:

blah
{
    "COMMAND EXECUTED CORRECTLY"
}

или

blah
{
    "QUERY COMPLETE IN .0034 SECONDS",
    "1 RECORD FOUND:",
    "FOO=12345",
    "--END OF LIST--"
}

Ответы [ 2 ]

1 голос
/ 14 сентября 2009

Если все, что вы делаете, это распечатываете, strcat () отлично работает для соединения всех строк вместе.

Обычно, однако, ваш парсер будет создавать абстрактное синтаксическое дерево. Поэтому вместо вывода строки у вас будет что-то вроде следующего:

Node* n = new_node(STRING_LIST_NODE); // STRING_LIST_NODE being an enum node type
n->value = $1
n->next = $3
$$ = n;
0 голосов
/ 14 сентября 2009

В вашем примере вы просто выводите ввод, поэтому с strcat все в порядке.

Как правило, каждый пытается создать абстрактное синтаксическое дерево. В случае AST вы можете либо создать структуру узла, либо отобразить содержимое в массив.

Если вы дадите более подробную информацию о цели вашей программы, я могу дать вам более подробный ответ.

...