Domanda

Mi piacerebbe poter analizzare la seguente struttura:

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

Sto usando flex per tokenizzare, e funziona perfettamente. Sto usando yacc (bisonte) per l'analisi.

Qual è il modo consigliato per consentire questa struttura? In questo momento, nel mio file test.y, ho:

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

Sospetto che strcat () sia una pessima idea. Sono un vero principiante quando si tratta di lex / yacc (circa 3 ore di esperienza), quindi uno schiaffo sul polso e un puntatore nella giusta direzione sarebbe fantastico.

EDIT: l'obiettivo di questo è quello di permettermi di costruire un cablaggio di prova per un'applicazione esterna. Il lexing / analisi verrà utilizzato per interpretare uno script di test fornito dall'utente. Un comando consente all'utente di inviare un messaggio all'applicazione, quindi leggo la risposta su più righe e la confronto con l'elenco di stringhe a lunghezza variabile fornito dall'utente nello script. Il frammento che ho pubblicato sopra è il modo in cui ho pensato che avrei lasciato che l'utente definisse la possibile risposta.

Ad esempio:

blah
{
    "COMMAND EXECUTED CORRECTLY"
}

o

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

Soluzione

Se tutto ciò che stai facendo è stampare questo, strcat () funziona bene per connettere tutte le stringhe insieme.

Normalmente, tuttavia, il tuo parser costruirà un albero di sintassi astratto. Quindi, invece di emettere la stringa, avresti qualcosa di simile al seguente:

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

Altri suggerimenti

Nel tuo esempio, stai semplicemente emettendo l'input, quindi strcat va bene.

In genere, ciò che si cerca di fare è costruire un albero di sintassi astratto. Nel caso di un AST, è possibile creare una struttura di nodi o mappare i contenuti in un array.

Se dai maggiori dettagli sull'obiettivo del tuo programma, posso darti una risposta più dettagliata.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top