为什么yacc/bison中的$1的值为0

为什么yacc/bison中的$1的值为0,bison,yacc,Bison,Yacc,我在野牛规格中有以下产品: op : '+' { printf("%d %d %c\n", $1, '+', '+'); } 当我输入+时,我得到以下输出: 0 43 + 有人能解释一下为什么$1的值是0,是不是应该是43?我错过了什么 编辑 没有flex文件,但我可以提供bison语法: %{ #include <stdio.h> #include <ctype.h> #include <string.h> int yylex(); int yyerr

我在
野牛
规格中有以下产品:

op : '+' { printf("%d %d %c\n", $1, '+', '+'); }
当我输入
+
时,我得到以下输出:

0 43 +
有人能解释一下为什么
$1
的值是0,是不是应该是43?我错过了什么

编辑

没有flex文件,但我可以提供
bison
语法:

%{
#include <stdio.h>
#include <ctype.h>
#include <string.h>

int yylex();
int yyerror();

%}

%token NUMBER

%%

lexp : NUMBER 
     | '(' op lexp-seq ')'
     ;
op : '+' { printf("%d %d %c\n", $1, '+', '+'); }
   | '-' { printf("%d %d %c\n", $1, '-', '-'); }
   | '*' { printf("%d %d %c\n", $1, '*', '*'); }
   ;

lexp-seq : lexp-seq lexp
         | lexp
         ;

%%

int main(int argc, char** argv) {
  if (2 == argc && (0 == strcmp("-g", argv[1])))
    yydebug = 1;

  return yyparse();
}

int yylex() {
  int c;

  /* eliminate blanks*/
  while((c = getchar()) == ' ');

  if (isdigit(c)) {
    ungetc(c, stdin);
    scanf("%d", &yylval);
    return (NUMBER);
  }

  /* makes the parse stop */
  if (c == '\n') return 0;

  return (c);
}

int yyerror(char * s) {
  fprintf(stderr, "%s\n", s);
  return 0;
} /* allows for printing of an error message */
%{
#包括
#包括
#包括
int-yylex();
int yyerror();
%}
%令牌号
%%
号码
|“(“op lexp seq”)”
;
op:“+”{printf(“%d%d%c\n”,$1,“+”,“+”);}
|“-”{printf(“%d%d%c\n”,$1,“-”,“-”);}
|'*'{printf(“%d%d%c\n”,$1,'*','*');}
;
lexp seq:lexp seq lexp
|lexp
;
%%
int main(int argc,字符**argv){
如果(2==argc&(0==strcmp(“-g”,argv[1]))
yydebug=1;
返回yyparse();
}
int-yylex(){
INTC;
/*消除空白*/
而((c=getchar())=“”);
if(isdigit(c)){
ungetc(c、stdin);
scanf(“%d”&yylval);
报税表(编号);
}
/*使解析停止*/
如果(c=='\n')返回0;
返回(c);
}
int yyerror(字符*s){
fprintf(标准字符,“%s\n”,s);
返回0;
}/*允许打印错误消息*/

$1
是右侧第一个符号的语义值,在本例中为
'+'
。因为这是一个终端,所以当扫描器向解析器返回
'+'
标记时,它的语义值将是
yylval
的值

由于扫描仪在返回
'+'
的情况下未设置
yylval
(这是完全正常的),因此在该产品中使用
$1
的定义不明确。通常,语法不引用标记的语义值,如
“+”
,这些标记纯粹是语法性的,没有语义值


但是,由于
yylval
是一个静态变量,它将被初始化为0,因此它将继续具有该值,直到它被设置为止(例如,在扫描
数字时)。

$1
是右侧第一个符号的语义值,在本例中为
'+'
。因为这是一个终端,所以当扫描器向解析器返回
'+'
标记时,它的语义值将是
yylval
的值

由于扫描仪在返回
'+'
的情况下未设置
yylval
(这是完全正常的),因此在该产品中使用
$1
的定义不明确。通常,语法不引用标记的语义值,如
“+”
,这些标记纯粹是语法性的,没有语义值


但是,由于
yylval
是一个静态变量,它将被初始化为0,因此它将继续具有该值,直到它被设置为止(例如,在扫描
数字时)。

您需要向我们显示flex文件,因为正是该代码将值返回给bison。@BrianTompsett-汤莱恩 我刚刚做了一个编辑。也许会有帮助。您需要向我们展示flex文件,因为正是这段代码将值返回给bison。@BrianTompsett-汤莱恩 我刚刚做了一个编辑。也许会有帮助。