Bison 使用野牛时看到垃圾

Bison 使用野牛时看到垃圾,bison,lex,Bison,Lex,我试图使用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); } ; e

我试图使用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 ();
}
%{
#定义YYSTYPE双精度
#包括
#包括
%}
%令牌数
%%
输入:/*空*/
|输入线
;
行:'\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;}
/*指数化*/
|exp exp'^'{$$=pow($1,$2);}
/*一元负号*/
|exp'n'{$$=-$1;}
;
%%
/*词法分析器返回一个双浮点
堆栈上的数字和标记NUM,或ASCII
如果不是数字,则读取字符。跳过所有空格
和制表符,返回0表示EOF*/
#包括
#包括
yyerror(常量字符*s)
yylex()
{
INTC;
/*跳过空白*/
而((c=getchar())=''|| c=='\t')
;
/*过程编号*/
如果(c='.| isdigit(c))
{
ungetc(c、stdin);
扫描频率(“%lf”、&yylval);
返回NUM;
}
/*返回文件结尾*/
如果(c==EOF)
返回0;
/*返回单字符*/
返回c;
}
yyerror/*在发生错误时由yyparse调用*/
char*s;
{
printf(“%s\n”,s);
}
主要()
{
yyparse();
}
我在控制台中收到一些“垃圾”(不是在文件或类似文件中),请看:


致以问候。

这是m4输入文件或m4头。Bison和flex使用一个古老的unix宏处理器实用程序m4,这就是m4输入的样子。(我能够让m4-P在只有警告的情况下吃掉该文件。)

通常,这一切都是在幕后进行的,是看不见的。你似乎在windows上,在dos机箱外壳中。我猜您在某处有一个真正的bash控制台,可能是通过Cygwin,我建议您在完整的gnu环境中重试bison命令。它可能不会那么麻烦。Windows特别不擅长用流模拟标准输出,谁知道会发生什么


如果这没有直接帮助,请至少向我们提供有关您的环境的更多信息,请描述bison是如何构建或以其他方式安装的,并可能粘贴您正在使用的命令行。

这是一个m4输入文件或m4头。Bison和flex使用一个古老的unix宏处理器实用程序m4,这就是m4输入的样子。(我能够让m4-P在只有警告的情况下吃掉该文件。)

通常,这一切都是在幕后进行的,是看不见的。你似乎在windows上,在dos机箱外壳中。我猜您在某处有一个真正的bash控制台,可能是通过Cygwin,我建议您在完整的gnu环境中重试bison命令。它可能不会那么麻烦。Windows特别不擅长用流模拟标准输出,谁知道会发生什么


如果这对我们没有直接帮助,请至少向我们提供有关您的环境的更多信息,请描述bison是如何构建或以其他方式安装的,并可能粘贴您正在使用的命令行。

它看起来不像bison输出。您系统上的“bison”是否可能不是指向实际的bison,而是指向其他对象?我不知道,但这可能吗?NC:非常幸运的是,您用
D:\>
提示符粘贴了一行额外的内容。我所有的推理都是基于看到这4个字符的结果。:-)它看起来不像野牛的产出。您系统上的“bison”是否可能不是指向实际的bison,而是指向其他对象?我不知道,但这可能吗?NC:非常幸运的是,您用
D:\>
提示符粘贴了一行额外的内容。我所有的推理都是基于看到这4个字符的结果。:-)