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
из других переводческих подразделений.