2009-09-14 4 views
0

Je voudrais pouvoir analyser la structure suivante:Permettant la liste de longueur variable dans yacc

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

J'utilise flex à tokenizer, et qui fonctionne parfaitement. J'utilise yacc (bison) pour l'analyse.

Quelle est la méthode recommandée pour autoriser cette structure? En ce moment, dans mon dossier de 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 vraiment, très mauvaise idée. Je suis un vrai novice quand il s'agit de lex/yacc (environ 3 heures d'expérience) donc un claquement sur le poignet et un pointeur dans la bonne direction serait génial.

EDIT: Le but de ceci est de me permettre de construire un faisceau de test pour une application externe. Le 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 avec la liste de longueur variable des chaînes que l'utilisateur a fournies dans le script. Le fragment que j'ai posté ci-dessus est la façon dont j'ai pensé que je laisserais 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--" 
} 

Répondre

1

Si tout ce que vous faites est d'imprimer ceci, strcat() fonctionne très bien pour connecter toutes les chaînes ensemble. Normalement, cependant, votre analyseur construira une arborescence de syntaxe abstraite. Donc, au lieu de sortir la chaîne, vous auriez quelque chose comme:

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

Cela a du sens. Je vais poursuivre ça ... – Andrew

0

Dans votre exemple, vous restituent simplement l'entrée, donc strcat est très bien.

Typiquement, ce que l'on essaie de faire est de construire un arbre de syntaxe abstraite. 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.

+0

Ce que je ne sais pas est ce que $ 1 représente réellement (c'est-à-dire, mémoire sage) donc je n'ai aucune idée de ce que je strcat'ing à. – Andrew

+0

Dans "STRING COMMA string_list", $ 1 fait référence à STRING. 2 $ fait référence à COMMA. $ 3 fait référence à string_list. – Fragsworth

+0

Bien sûr; Je comprends que. Mais quand je strcat(), je modifie la mémoire. Quel souvenir, et où? Est-ce un débordement de tampon en cours? – Andrew

Questions connexes