[英]What does $$ = $1 + $3 mean in yacc?
Lex部分:
%%
[0-9]+ { yyval = atoi (yytext); return num; }
%%
Yacc部分:
%token num
%%
exp:num '+' num ; {$$ = $1 + $3;}
%%
$$
, $1
和$2
代表什么? $$
? 5+9
作为输入发送到该程序,那么lex程序会标识5
和9
,但是+
呢? 符号+
发送到lex? exp:num ‘+’ num ; {$$ = $1 + $3;}
$ , $ 1 , $ 3是规则中使用的符号和标记的语义值(按它们出现的顺序)。 语义值是当扫描程序获得新令牌时在yylval中获得的值。
$ 1具有第一个数字的语义值。
$ 3具有第二个num的语义值
不使用$ 2,因为它是令牌'+'。 词法分析器确实将此令牌发送到解析器。 它还具有语义值“ 0”。
$$标识“ exp”(该规则下的整个分组)的语义值。
您是否尝试过类似的方法:
exp:num ‘+’ num ; {$$ = $1 + $3;printf("%d", $$);}
还要检查: 为什么yacc / bison中的$ 1的值为0
$$
代表当前规则的结果。 $1
和$3
代表第一部分和第三部分的结果。 因此,在这种情况下, $1
将保留左侧num
令牌的值,而右侧则保留$3
。 $2
将保留'+'
令牌的值(假设它有一个),但是代码中并未实际使用该令牌。
通过添加printf("%d\\n", $$);
在操作结束时,或通过添加另一个使用exp
并显示其值的规则,如下所示:
main: exp { printf("%d\\n", $1); } ;
如果您所拥有的只是您发布的代码,则+
将被打印到标准输出,否则将被忽略。 因此,规则num '+' num
将永远不会匹配,因为词法分析器不会生成'+'令牌,因此解析器看不到一个。
作为其他答案的补充,您可能想添加lex规则:
[ \t\r\n] ;
. { return *yytext; } /* should be the LAST rule */
这里的第一个规则将忽略输入中的任何空格并将其丢弃。 第二个规则(应该在所有其他规则之后)将匹配输入中的任何其他字符,并将其返回到解析器,以便可以直接将其作为带引号的字符进行匹配(就像对'+'
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.