срочный вопрос по Yacc
если ты под $1 "адресуешь" терминал, например, то его значение равно yylex (то, что вернул лексер. если ты следишь за его значениями, можно поймать его текст через yytext).
если через $1 "адресуешь" нетерминал - то его значение - это то, что ты присвоил при его выводе в "переменную" $$, например:
ClassBody
: '{' ClassDecls '}'
{
...
$$:=TreeNode ... // здесь возвращаем какой-нибудь int
}
| ...
потом, при свёртке правила
ClassDecl
: CLASS ClassId BaseClause ClassBody ';'
{
...
DoClassDecl($2,$3,$4); // << здесь в $4 будет лежать int, который вернул в правиле ClassBody
...
}
| ...
Уже всё выяснилось, но спасибо.
Оставить комментарий
Prise
Допустим, правило для Yacc описывает некую входную конструкцию, содержащуюидентификатор (idword):
myrule: HELLO idword { fprintf(my_file, "%s", ?); }
Требуется указанной функцией фпринтф записать идентификатор idword в my_file как
строку.
Как это сделать?
Я пробовал ?=$2, но получаются ворнинги про неприводимость указателей, и в
итоге в файл пишется всякая лабуда.