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

πTh*_*h0n 6 yacc lex

莱克斯部分:

%%
[0-9]+ { yyval = atoi (yytext); return num; }
%%
Run Code Online (Sandbox Code Playgroud)

Yacc 部分:

%token num 
%%
exp:num '+' num ; {$$ = $1 + $3;}
%%
Run Code Online (Sandbox Code Playgroud)
  1. 这部分代码中$$,$1$2代表什么?
  2. 我现在如何打印$$
  3. 如果我5+9作为输入发送到该程序5并被9lex 程序识别,但是 呢+?符号+是否发送到 lex?

MAP*_*MAP 7

exp:num \xe2\x80\x98+\xe2\x80\x99 num ; {$$ = $1 + $3;} \n
Run Code Online (Sandbox Code Playgroud)\n\n

这些$$$1$3是规则中使用的符号和标记的语义值(按它们出现的顺序排列)。语义值是当扫描器获取新标记时在 yylval 中获得的值。

\n\n

$1具有第一个数字的语义值。

\n\n

$3具有第二个数字的语义值

\n\n

$2未被使用,因为它是标记“+”。词法分析器确实将此标记发送到解析器。它还具有语义值“0”。

\n\n

$$标识“exp”的语义值(该规则下的整个分组)。

\n\n

你有没有尝试过类似的事情:

\n\n
exp:num \xe2\x80\x98+\xe2\x80\x99 num ; {$$ = $1 + $3;printf("%d", $$);}\n
Run Code Online (Sandbox Code Playgroud)\n\n

另请检查:为什么 yacc/bison 中的 $1 的值为 0\n

\n