2009-12-15 5 views
1

Supposons que je veux que mon Lex et Yacc programme pour analyser les arguments de ligne de commande comme:arguments de ligne de commande Parse dans Lex

./a.out show memory 

Je veux lex pour analyser la chaîne "show mémoire". Comment puis-je accomplir cela?

Répondre

2

Vous aurez besoin de concaténer tous les arguments en une grande chaîne, en insérant des espaces entre eux. Ensuite, alimentez le tampon de texte restant en Lex/Yacc en redéfinissant la macro YY_INPUT afin qu'elle lise les entrées de votre tampon de texte.

Le départ pourrait être quelque chose comme:

#include <stdio.h> 
#include <string.h> 

char *argbuf; 
size_t arglen; 

int main(int argc, char *argv[]) 
{ 
    int i; 

    // Compute total length of all arguments, with a single space between. 
    arglen = 0; 
    for(i = 1; argv[i] != NULL; i++) 
    arglen += 1 + strlen(argv[i]); 

    // Allocate buffer space. 
    argbuf = malloc(arglen); 
    if(argbuf == NULL) 
    { 
    fprintf(stderr, "No memory for argument buffer, aborting"); 
    exit(1); 
    } 

    // Concatenate all arguments. This is inefficient, but simple. 
    argbuf[0] = 0; 
    for(i = 1; argv[i] != NULL; i++) 
    { 
    if(i > 1) 
     strcat(argbuf, " "); 
    strcat(argbuf, argv); 
    } 

    // Here we should be ready to call yyparse(), if we had implemented YY_INPUT(). 

    return 0; 
} 
+0

pourriez-vous s'il vous plaît dites-moi comment modifier YY_INPUT dans le cas ci-dessus j'ai mentionné. – ajai

+0

@ajai: Suivez le lien, il montre un exemple. – unwind

+0

je reçois ces erreurs lorsque j'essaye le code ci-dessus try.y: 8: erreur: erreur de syntaxe avant '{' jeton try.y: 10: erreur: 'c 'non déclaré ici (pas dans une fonction) try.y: 10: erreur: 'EOF 'non déclaré ici (pas dans une fonction) try.y: 10: erreur:' YY_NULL' non déclaré ici (pas dans une fonction) try.y: 10: erreur: ' buf 'non déclaré ici (pas dans une fonction) try.y: 10: avertissement: la définition des données n'a pas de type ou de classe de stockage try.y: 11: erreur: erreur de syntaxe avant'} 'jeton – ajai

0

Quel est le problème avec le faire à l'ancienne ?:

if(argc > 1 && !strcmp(argv[1],"show")) 
{ 
    if(argc > 2) 
    { 
     if(!strcmp(argv[2],"memory")) 
      ... 
     else if(!strcmp(argv[2],"cpu")) 
      ... 
     else ... 
    } 
} 

Par ailleurs, getopt() et les amis sont plus appropriés.

+0

non je ne peux pas utiliser la méthode dis bcoz j'ai 20 mots-clés. de plus il n'y a pas d'ordre dans lequel dey devrait se produire – ajai

+0

OK, aller avec la méthode de déroulement alors, mais je sens l'ingénierie. – Wernsey

2
int main(int argc, char **argv) { 
    if(argc > 1) { 
    if(argv[1]) 
     yy_scan_string(argv[1]); 
    } 
    yyparse(); 
    return 0; 
} 
0

Mon article de blog Parsing command line parameters with Yacc & Flex explique cela avec un exemple de travail. Il n'est pas nécessaire de concaténer la chaîne d'argument. La raison est donnée dans l'article.

Le texte de présentation est:

Every once in a while someone comes along and asks how to parse command line parameters with Yacc & Flex. This is rather straight forward, but requires some knowledge of the generated code to get right.

Here we present a source template that does this. The user only has to edit the grammar and scanning rules. Some knowledge of C, Yacc and Flex is assumed.

The code is WTFPL licensed

The template is written for Berkeley Yacc and the reflex variant of Flex. It may be made to work with GNU Bison and SourceForge Flex, possibly with a few changes.

Ce que vous obtenez est un modèle où vous pouvez simplement insérer vos spécifications lexicale et la grammaire.

Veuillez poser des questions sur l'utilisation et l'adaptation du modèle lui-même aux commentaires du blog.

+0

Lien vers le blog est en panne! Opera n'héberge plus de blog! – ArthurLambert

+0

Oh, c'est vrai. Et désolé pour la très, très tardive réponse. –

+0

Je vais mettre le code sur mon nouveau blog et corriger le lien un de ces jours. –

Questions connexes