为什么要返回令牌名称?

时间:2010-06-01 09:23:45

标签: lex

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

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

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

1 个答案:

答案 0 :(得分:5)

NUM是令牌类型。它是值的类别而不是值本身。

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

一个典型的例子是(非常)简单的表达式求值程序,它采用NUM + NUM。您不希望每种情况都有特殊规则:

0 + 0
0 + 1
0 + 2
:
65535 + 65534
65535 + 65535

所以你有一个规则处理一般情况,然后使用yylval作为特定值。