2009-10-11 3 views
1

Я пытаюсь использовать Bison для компиляции (я не знаю, если это правильное слово для использования), но когда я пытаюсь скомпилировать этот исходный код:Проводы мусора при использовании 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(); 
} 

Я получаю некоторые «мусор» в консоли (а не в файл или что-то подобное), посмотрите: http://pastie.org/650893

с наилучшими пожеланиями.

+1

Это не похоже на выход Bison. Возможно ли, что «зубр» в вашей системе не указывает на фактического Зубра, но что-то еще? – 2009-10-12 00:01:36

+0

Не знаю, но возможно ли это? –

+1

NC: Действительно очень повезло, что вы вставили одну дополнительную строку с приглашением 'D: \>'. Все мои рассуждения основывались на том, чтобы увидеть этих 4 персонажей. :-) – DigitalRoss

ответ

1

Это входной файл m4 или заголовок m4. Bison и flex используют древнюю утилиту для макросов макросов unix, называемую m4, и это выглядит так, как выглядит m4. (Я смог получить m4 -P, чтобы съесть этот файл только с предупреждениями.)

Обычно это все за кулисами и невидимо. Кажется, вы находитесь в окнах и в оболочке dos. Я предполагаю, что у вас есть реальная консоль bash где-то, возможно, через Cygwin, и я бы предложил повторить команду бизонов в полной среде gnu. У этого может быть меньше проблем с этим. Windows особенно плоха в эмуляции стандартного вывода потоками, и кто знает, что могло бы произойти.

Если это не помогает напрямую, по крайней мере, предоставить нам больше информации о вашей среде, пожалуйста, опишите, как бизон был построен или установлен иным образом, и, возможно, вставьте используемую вами командную строку.

+0

Спасибо большое, все работает сейчас! –