Bison & rec2c: Получить номер текущей строки - PullRequest
3 голосов
/ 28 февраля 2012

Я имею дело с грамматикой PHP и хочу передать моей функции номер строки У меня есть что-то вроде: internal_functions_in_yacc:

        T_ISSET '(' isset_variables ')'
    |   T_EMPTY '(' variable ')'
    |   T_INCLUDE expr  { observers.IncludeFound($2); } 
    |   T_INCLUDE_ONCE expr { observers.IncludeFound($2); } 
    |   T_EVAL '(' expr ')' 
    |   T_REQUIRE expr  { observers.IncludeFound($2); } 
    |   T_REQUIRE_ONCE expr { observers.IncludeFound($2); } 
;

Теперь я хочу передать номер строки, что-то вроде

T_REQUIRE_ONCE expr { observers.IncludeFound($2,$line_number_here); } 

Есть ли способ узнать номер строки токена, который анализирует бизон? Или это нужно делать в лексинге?

EDIT

Я обнаружил, что лексирование выполняется с использованием rec2c, а не lex.

1 Ответ

5 голосов
/ 28 февраля 2012

Если разрешены номера строк , то к ним можно получить доступ с помощью @n, где n - местоположение токенов.

T_REQUIRE_ONCE expr { observers.IncludeFound($2,@2.first_line); }

Редактировать:

Чтобы развернуть ответ %locations - это директива в ссылке, которая разрешает номера строк в зубрах.Лексер по-прежнему отвечает за увеличение номеров строк и требует %option yylineno.

Lex File:

\n       { yylloc->lines(yyleng); yylloc->step(); }
...