2015-02-07 1 views
2

Руководство четко говорит: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 определенный макрос из анализатора Bison. Как я могу начать состояние без знания интерфейса integer? Другими словами, как я могу получить идентификатор состояния, которое я хочу начать.

На лексере:

<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); } 
; 
+0

YYSETSTATE и YYFILL являются частью интерфейса 're2c', afaik. Какое руководство вы цитируете? – rici

+0

обновленные теги :) – marcio

ответ

2

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

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

+0

Я закончил с лучшим решением, но на самом деле мне нужно было создать заголовки и включить сгенерированные файлы заголовков. Я принял этот ответ, но я также не поощряю этот подход. – marcio

+0

@marcio: Не был ли ясен достаточно ясно, что вам нужно будет генерировать и включать заголовки, если вы собираетесь использовать 'SETCONDITION'? И что такое «такой подход», который вы не поощряете (помимо того, что это неестественный backchannel от парсера до lexer)? Или, лучше спросили, «этот подход к * какой проблеме *?» :) – rici

+0

Ваш ответ прекрасен. Подход, на который я имею в виду, - это передача информации из парсера в лексер. В моем конкретном случае был намного лучший способ сделать это :) – marcio