Вопрос

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

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 вы можете либо создать структуру узла, либо отобразить содержимое в массив.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top