Question

J'aimerais pouvoir analyser la structure suivante:

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

J'utilise flex pour tokenize, et cela fonctionne parfaitement. J'utilise yacc (bison) pour l'analyse.

Quelle est la méthode recommandée pour autoriser cette structure? À l'heure actuelle, dans mon fichier test.y, j'ai:

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

Je soupçonne que strcat () est une très très mauvaise idée. Je suis un vrai novice en matière de lex / yacc (environ 3 heures d’expérience), c’est génial de mordre le poignet et de placer un pointeur dans la bonne direction.

EDIT: Le but de cette opération est de me permettre de construire un faisceau de test pour une application externe. Lexing / parsing sera utilisé pour interpréter un script de test fourni par l'utilisateur. Une commande permet à l'utilisateur d'envoyer un message à l'application, puis je lis la réponse multiligne et la compare à la liste de chaînes de longueur variable fournie par l'utilisateur dans le script. Le fragment que j'ai posté ci-dessus est la façon dont j'ai pensé laisser l'utilisateur définir la réponse possible.

Par exemple:

blah
{
    "COMMAND EXECUTED CORRECTLY"
}

ou

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

La solution

Si vous ne faites que l’imprimer, strcat () fonctionne correctement pour connecter toutes les chaînes ensemble.

Normalement, cependant, votre analyseur construira un arbre de syntaxe abstraite. Ainsi, au lieu de sortir la chaîne, vous obtiendrez quelque chose comme ceci:

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

Autres conseils

Dans votre exemple, vous produisez simplement l'entrée, donc strcat va bien.

Généralement, on essaie de créer un arbre de syntaxe abstrait. Dans le cas d'un AST, vous pouvez créer une structure de nœud ou mapper le contenu dans un tableau.

Si vous donnez plus de détails sur l'objectif de votre programme, je peux vous donner une réponse plus détaillée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top