0 votes

Autoriser les listes de longueur variable dans yacc

J'aimerais être capable d'analyser la structure suivante :

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

J'utilise flex pour tokeniser, et ça marche parfaitement. J'utilise yacc (bison) pour l'analyse syntaxique.

Quelle est la méthode recommandée pour autoriser cette structure ? Pour l'instant, 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 pense que strcat() est une très, très mauvaise idée. Je suis un vrai novice en ce qui concerne lex/yacc (environ 3 heures d'expérience), alors une tape sur le poignet et une indication dans la bonne direction seraient les bienvenues.

EDIT : Le but est de me permettre de construire un harnais de test pour une application externe. Le lexing/parsing sera utilisé pour interpréter un test script que l'utilisateur fournit. Une commande permet à l'utilisateur d'envoyer un message à l'application, puis je lis la réponse de plusieurs lignes et je la compare avec la liste de longueur variable de chaînes de caractères que l'utilisateur a fournie 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--"
}

1voto

Fragsworth Points 5854

Si tout ce que vous faites est d'imprimer ceci, strcat() fonctionne bien pour connecter toutes les chaînes ensemble.

Normalement, cependant, votre analyseur syntaxique construira un arbre syntaxique abstrait. Ainsi, au lieu de sortir la chaîne de caractères, vous auriez quelque chose comme ce qui suit :

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

0voto

brianegge Points 12857

Dans votre exemple, vous ne faites que sortir l'entrée, donc strcat est parfait.

Typiquement, ce que l'on essaie de faire est de construire un arbre syntaxique abstrait. Dans le cas d'un AST, vous pouvez soit créer une structure de nœuds, soit 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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X