繁体   English   中英

yacc中的$$ = $ 1 + $ 3是什么意思?

[英]What does $$ = $1 + $3 mean in yacc?

Lex部分:

%%
[0-9]+ { yyval = atoi (yytext); return num; }
%%

Yacc部分:

%token num 
%%
exp:num '+' num ; {$$ = $1 + $3;}
%%
  1. 在这部分代码中, $$$1$2代表什么?
  2. 我现在如何打印$$
  3. 如果我将5+9作为输入发送到该程序,那么lex程序会标识59 ,但是+呢? 符号+发送到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. $$代表当前规则的结果。 $1$3代表第一部分和第三部分的结果。 因此,在这种情况下, $1将保留左侧num令牌的值,而右侧则保留$3 $2将保留'+'令牌的值(假设它有一个),但是代码中并未实际使用该令牌。

  2. 通过添加printf("%d\\n", $$); 在操作结束时,或通过添加另一个使用exp并显示其值的规则,如下所示:

     main: exp { printf("%d\\n", $1); } ; 
  3. 如果您所拥有的只是您发布的代码,则+将被打印到标准输出,否则将被忽略。 因此,规则num '+' num将永远不会匹配,因为词法分析器不会生成'+'令牌,因此解析器看不到一个。

作为其他答案的补充,您可能想添加lex规则:

[ \t\r\n]    ;
.          { return *yytext; }  /* should be the LAST rule */

这里的第一个规则将忽略输入中的任何空格并将其丢弃。 第二个规则(应该在所有其他规则之后)将匹配输入中的任何其他字符,并将其返回到解析器,以便可以直接将其作为带引号的字符进行匹配(就像对'+'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM