为什么要返回令牌名称?

Nag*_*tri 1 lex

%{
    #include "y.tab.h"
    extern int yylval;
%}
%%
    [0-9]+ {yylval = atoi (yytext); return NUM;}
    [ \t]  ;
    \n     return 0;
    .      return yytext[0];
%%
Run Code Online (Sandbox Code Playgroud)

当我使用指向值的yylval时,为什么要返回NUM?我的意思是NUM代表什么(在YACC部分中NUM是否已经死亡)?NUM存储任何值吗?

即使有适当的解决方案,我也很困惑.我只是没有得到返回NUM的正确理由,因为我在YACC中有指针yylval.

pax*_*blo 5

NUM是令牌类型.它是价值的范畴而不是价值本身.

换句话说,您自己的一些YACC代码可能并不关心实际值是什么,只是它是特定类型的.

一个典型的例子是(非常)简单的表达式求值程序NUM + NUM.您不希望每个案例都有特殊规则:

0 + 0
0 + 1
0 + 2
:
65535 + 65534
65535 + 65535
Run Code Online (Sandbox Code Playgroud)

所以你有一个规则来处理一般情况,然后yylval用于特定的值.