yylineno всегда имеет одинаковое значение в файле yacc

для одного проекта в компиляторах у меня есть одна проблема в синтаксическом анализаторе, когда я иду добавить символ в таблицу символов, я принимаю всегда одно и то же значение в yylineno …

я сделал это в начале:

%{ int yylex(void); int yyerror(char* yaccProvidedMessage); extern int yylineno; //i declare yylineno from the lexical analyzer extern char *yytext; extern FILE *yyin; int scope=0; int max_scope; %} 

и в грамматике, когда я собираюсь добавить что-то в таблицу символов:

т.е.

 lvalue: ID { printf("<-ID"); add_data_to_symbol_table((char*)($1),scope,yylineno); printf("lineNO:%d",yylineno); } ; 

в выходе, когда я даю вход с разными строками, он не распознает новую строку

 if(x<=2) { if(t<1) { k=2; } } 

строкаNO никогда не изменяется, всегда имеет значение 1 как значение …

есть идеи?

Предполагая, что вы используете yylineno из flex , тогда вы, вероятно, должны добавить строку

 %option yylineno 

к вашей спецификации flex . Остерегайтесь, однако, что нецелесообразно экспортировать yylineno непосредственно в вашу грамматику, так как ваша грамматика может потребовать поискать токены из токенизатора, и, следовательно, yylineno возможно, уже обновлен. yylineno способ обращения с yylineno – через yylval . Я также видел, что у bison появились новые функции нумерации строк (см. @1 и @@ и т. Д.), Которые, возможно, более легко интегрируются с flex .

PS: Послушайте, я говорю о bison , где вы только упоминали yacc . Если вы привержены yacc , пройдите через yylval .