Frage

Ich möchte in der Lage sein, die folgende Struktur zu analysieren:

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

Ich verwende Flex zu tokenize, und das funktioniert perfekt. Ich verwende yacc (Bison) für die Analyse.

Was ist der empfohlene Weg, um diese Struktur zu ermöglichen? Gerade jetzt, in meiner test.y Datei, ich habe:

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

Ich vermute, die strcat () ist eine wirklich, wirklich schlechte Idee. Ich bin ein echter Neuling, wenn es um lex / yacc (ca. 3 Stunden Erfahrung) so ein Schlag auf das Handgelenk und einen Zeiger in die richtige Richtung wäre toll.

EDIT: Das Ziel dieser ist mir zu erlauben, eine Testumgebung für eine externe Anwendung zu erstellen. Die lexing / Parsing wird verwendet, um ein Testskript zu interpretieren, die der Benutzer bereitstellt. Ein Befehl ermöglicht es dem Benutzer, eine Nachricht an die Anwendung zu senden, dann lese ich die Multi-line-Reaktion und vergleichen Sie mit der variablen Länge der String-Liste der Benutzer im Skript zur Verfügung gestellt hat. Das Fragment ich oben geschrieben habe, ist die Art, wie ich dachte, ich den Benutzer die mögliche Antwort definieren lassen würde.

Zum Beispiel:

blah
{
    "COMMAND EXECUTED CORRECTLY"
}

oder

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

Lösung

Wenn alles, was Sie tun dies, druckt, strcat () funktioniert gut zusammen alle Fäden zu verbinden.

Normalerweise werden jedoch Ihre Parser bauen einen abstrakten Syntaxbaum sein. Anstatt also die Zeichenfolge der Ausgabe, würden Sie so etwas wie die folgenden haben:

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

Andere Tipps

In Ihrem Beispiel Sie die Ausgabe einfach den Eingang, so strcat ist in Ordnung.

Normalerweise, was man versucht, zu tun, ist einen abstrakten Syntaxbaum aufzubauen. Im Falle eines AST, können Sie entweder eine Knotenstruktur erstellen oder den Inhalt in einem Array zugeordnet werden.

Wenn Sie mehr Details über das Ziel des Programms geben, kann ich Ihnen eine ausführlichere Antwort.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top