Разрешение списков переменной длины в yacc
Вопрос
Я хотел бы иметь возможность проанализировать следующую структуру:
blah
{
"string-1",
"string-2",
...,
"string-n"
}
Я использую flex для токенизации, и это работает отлично.Я использую yacc (bison) для синтаксического анализа.
Каков рекомендуемый способ разрешить такую структуру?Прямо сейчас, в моем файле 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--"
}
Решение
Если все, что вы делаете, это печатаете это, strcat() отлично работает, чтобы соединить все строки вместе.
Однако обычно ваш анализатор будет создавать абстрактное синтаксическое дерево.Таким образом, вместо вывода строки у вас будет что-то вроде следующего:
Node* n = new_node(STRING_LIST_NODE); // STRING_LIST_NODE being an enum node type
n->value = $1
n->next = $3
$$ = n;
Другие советы
В вашем примере вы просто выводите входные данные, так что strcat работает нормально.
Как правило, то, что кто-то пытается сделать, - это создать абстрактное синтаксическое дерево.В случае AST вы можете либо создать структуру узла, либо отобразить содержимое в массив.
Если вы более подробно расскажете о цели вашей программы, я могу дать вам более подробный ответ.