为什么在YACC做$ 1 /野牛具有的值为0(why does $1 in yacc/bison h

2019-11-04 06:34发布

我有一个后续的生产bison规格:

op : '+' { printf("%d %d %c\n", $1, '+', '+'); }

当我输入+我得到以下的输出:

0 43 +

有人可以解释为什么$1具有的值为0,应该不会是43? 我在想什么?

编辑

有没有弯曲的文件,但我可以提供一个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 */

Answer 1:

$1是在右手侧的第一符号,其在这种情况下是语义值'+' 。 因为这是一个终端,其语义值将是任何的值yylval是当扫描仪返回的'+'标记的解析器。

由于扫描仪不设置yylval在它返回的情况下, '+' (这完全是正常的),使用$1在产量没有明确定义。 一般情况下,语法不引用类似的令牌的语义值'+' ,其是纯语法和不具有语义值。

然而,由于yylval是一个静态变量,它会被初始化为0,所以直到它被设置它将继续为具有值(例如,在扫描NUMBER )。



文章来源: why does $1 in yacc/bison has a value of 0
标签: bison yacc