1

私は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をご覧ください。

よろしくお願いします。

4

1 に答える 1

1

これは、m4入力ファイルまたはm4ヘッダーです。Bisonとflexは、m4と呼ばれる古いUNIXマクロプロセッサユーティリティを使用します。これは、m4入力がどのように見えるかを示しています。(警告だけでm4 -Pにそのファイルを食べさせることができました。)

通常、これはすべて舞台裏で実行され、見えません。あなたは窓の上にいて、DOSボックスのシェルにいるようです。おそらくCygwinを介して、どこかに実際のbashコンソールがあると思います。完全なgnu環境でbisonコマンドを再試行することをお勧めします。それで問題が少ないかもしれません。Windowsは、ストリームを使用して標準出力をエミュレートするのが特に苦手で、何が起こったのかを誰が知っていますか。

それでも問題が解決しない場合は、少なくともご使用の環境に関する詳細情報をお知らせください。bisonの構築方法やインストール方法を説明し、使用しているコマンドラインを貼り付けてください。

于 2009-10-12T00:34:23.757 に答える