YYSETSTATE как узнать идентификатор YYFILL?

В руководстве четко сказано:

YYSETSTATE (s)

[...]
The parameter to YYSETSTATE is a signed integer that uniquely identifies
the specific instance of YYFILL (n) that is about to be called.
[...]

Проблема в том, что я вызываю свой макрос YYSETSTATE из анализатора бизонов. Как я могу начать состояние, не зная integer UI? Другими словами, как я могу получить идентификатор состояния, которое я хочу начать.

На лексере:

<MY_STATE>{NAME} {
    return FN_NAME;
}

На парсере:

expr: { push_state( ? ) } /* what's the identifier of MY_STATE? */
    '(' FN_NAME VALUE VALUE ')' { compile_expr($2, $3, $4); }
;

1 ответ

Решение

Я не думаю, что вы когда-либо должны ссылаться на YYSETSTATE макро. Он используется как часть re2cмеханизм управления инверсией, включенный с -f флаг командной строки, который превращает сканер в "push" сканер. Это удобная функция, но она не имеет ничего общего с начальными условиями, и трудно представить себе обстоятельство, при котором вы могли бы прорваться через абстракцию, чтобы напрямую установить состояние.

re2c действительно имеет функцию, похожую на flexусловия запуска, которые активируются с -c флаг командной строки. Чтобы установить текущее состояние, вы используете YYSETCONDITION, который принимает значение из перечисления начальных условий. Если вы также поставите -t флаг командной строки, re2c создаст заголовочный файл с этим перечислением, так что вы можете выполнить YYSETCONDITION из других переводческих подразделений.

Другие вопросы по тегам