2009-10-11 8 views
1

Je suis en train d'utiliser Bison pour compiler (je ne sais pas si cela est le mot correct à utiliser), mais lorsque je tente de compiler ce code source:Voyant Garbage lors de l'utilisation Bison

%{ 
#define YYSTYPE double 
#include <math.h> 
#include <stdio.h> 
%} 
%token NUM 
%% 
input: /* empty */ 
     | input line 
; 

line:  '\n' 
     | exp '\n' { printf ("\t%.10g\n", $1); } 
; 

exp:  NUM    { $$ = $1;   } 
     | exp exp '+'  { $$ = $1 + $2; } 
     | exp exp '-'  { $$ = $1 - $2; } 
     | exp exp '*'  { $$ = $1 * $2; } 
     | exp exp '/'  { $$ = $1/$2; } 
     /* Exponentiation */ 
     | exp exp '^'  { $$ = pow ($1, $2); } 
     /* Unary minus */ 
     | exp 'n'   { $$ = -$1;  } 
; 
%% 

/* Lexical analyzer returns a double floating point 
    number on the stack and the token NUM, or the ASCII 
    character read if not a number. Skips all blanks 
    and tabs, returns 0 for EOF. */ 

#include <ctype.h> 
#include <stdio.h> 

yyerror(const char *s) 

yylex() 
{ 
    int c; 

    /* skip white space */ 
    while ((c = getchar()) == ' ' || c == '\t') 
    ; 
    /* process numbers */ 
    if (c == '.' || isdigit (c))     
    { 
     ungetc (c, stdin); 
     scanf ("%lf", &yylval); 
     return NUM; 
    } 
    /* return end-of-file */ 
    if (c == EOF)        
    return 0; 
    /* return single chars */ 
    return c;         
} 

yyerror (s) /* Called by yyparse on error */ 
    char *s; 
{ 
    printf ("%s\n", s); 
} 

main() 
{ 
    yyparse(); 
} 

Je reçois des « déchets » dans la console (pas dans un fichier ou quelque chose comme), jetez un oeil: http://pastie.org/650893

Cordialement.

+1

Cela ne ressemble pas à la sortie Bison. Est-il possible que «bison» sur votre système ne pointe pas vers le Bison réel mais quelque chose d'autre? –

+0

Je ne sais pas, mais est-ce possible? –

+1

NC: C'est vraiment très heureux que vous ayez collé la ligne supplémentaire avec l'invite 'D: \>'. Tout mon raisonnement était basé sur la vision de ces 4 personnages. :-) – DigitalRoss

Répondre

1

C'est un fichier d'entrée m4 ou un en-tête m4. Bison et Flex utilisent un ancien utilitaire de processeur de macros appelé m4, et c'est ce à quoi ressemble l'entrée m4. (J'ai été en mesure d'obtenir m4 -P pour manger ce fichier avec seulement des avertissements.)

Normalement, tout cela fonctionne dans les coulisses et est invisible. Vous semblez être sur Windows, et dans un shell de boîte DOS. Je suppose que vous avez une vraie console bash quelque part, peut-être via Cygwin, et je vous suggère de réessayer la commande bison dans l'environnement GNU complet. Cela peut avoir moins de problèmes avec ça. Windows est particulièrement médiocre pour émuler la sortie standard avec les flux et qui sait ce qui est arrivé. Si cela ne vous aide pas directement, au moins nous donner plus d'informations sur votre environnement, veuillez décrire comment Bison a été construit ou installé, et peut-être coller la ligne de commande que vous utilisez.

+0

Merci beaucoup, tout fonctionne maintenant! –

Questions connexes