Pergunta

Eu gostaria de ser capaz de analisar a seguinte estrutura:

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

Eu estou usando flex para tokenizar, e que está trabalhando perfeitamente. Estou usando yacc (bisonte) para a análise.

O que é a maneira recomendada para permitir que esta estrutura? Agora, no meu arquivo test.y, eu tenho:

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);
    }

Eu suspeito que o strcat () é um muito, muito má ideia. Eu sou um novato real quando se trata de lex / yacc (cerca de 3 horas de experiência) de modo um tapa no pulso e um ponteiro na direção certa seria ótimo.

EDIT: O objetivo deste é para permitir-me para construir um equipamento de teste para um aplicativo externo. O léxico / análise será usado para interpretar um script de teste que o usuário fornece. Um comando permite ao usuário enviar uma mensagem para a aplicação, então eu li a resposta multi-line e comparar com a lista de cadeias de comprimento variável que o usuário tenha fornecido no script. O fragmento que eu postei acima é a maneira que eu percebi que eu iria deixar o usuário definir a resposta possível.

Por exemplo:

blah
{
    "COMMAND EXECUTED CORRECTLY"
}

ou

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

Solução

Se tudo que você está fazendo está imprimindo isso, strcat () multa trabalha para conectar todas as cordas juntos.

Normalmente, no entanto, seu analisador será a construção de uma árvore de sintaxe abstrata. Então, ao invés de produzir a corda, você teria algo como o seguinte:

Node* n = new_node(STRING_LIST_NODE); // STRING_LIST_NODE being an enum node type
n->value = $1
n->next = $3
$$ = n;

Outras dicas

No seu exemplo, você está simplesmente a saída de entrada, de modo strcat é bom.

Normalmente, o que se tenta fazer é construir uma árvore de sintaxe abstrata. No caso de um AST, você pode criar uma estrutura de nó, ou mapear o conteúdo em uma matriz.

Se você dá mais detalhes sobre o objetivo de seu programa, eu posso lhe dar uma resposta mais detalhada.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top