зачем возвращать имя токена? - PullRequest
1 голос
/ 01 июня 2010
%{
    #include "y.tab.h"
    extern int yylval;
%}
%%
    [0-9]+ {yylval = atoi (yytext); return NUM;}
    [ \t]  ;
    \n     return 0;
    .      return yytext[0];
%%

Когда я использую yylval, который указывает на значение, почему я должен возвращать NUM? Я имею в виду то, что представляет NUM (NUM декальдируется в разделе YACC)? Хранит ли NUM какое-либо значение?

Я очень запутался в этом разделе, даже когда он имеет правильное решение. Я просто не получаю правильную причину возврата NUM, так как у меня есть указатель yylval в YACC.

1 Ответ

5 голосов
/ 01 июня 2010

NUM - это тип токена. Это категория значения, а не само значение.

Другими словами, некоторые из ваших собственных кодов YACC могут не заботиться о том, что фактическое значение, просто о том, что оно имеет определенный тип.

Классическим примером является (очень) простой оценщик выражений, который принимает NUM + NUM. Вам не нужно специальное правило для каждого случая:

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

так что у вас есть одно правило, которое обрабатывает общий случай, затем используйте yylval для конкретного значения.

...