我在bison
规范中有以下作品:
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 */
答案 0 :(得分:2)
$1
是右侧第一个符号的语义值,在本例中为'+'
。由于这是一个终端,因此当扫描程序将yylval
令牌返回给解析器时,它的语义值将是'+'
的值。
由于您的扫描程序在返回yylval
(这完全正常)的情况下未设置'+'
,因此在该生产中使用$1
的定义不明确。通常,语法不会引用像'+'
这样的标记的语义值,这些标记纯粹是语法的,没有语义值。
但是,由于yylval
是静态变量,因此它将初始化为0,因此在设置之前它将继续具有该值(例如,在扫描NUMBER
时)。