yylineno在yacc文件中始终具有相同的值

Ana*_*sis 3 c compiler-construction 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;
%}
Run Code Online (Sandbox Code Playgroud)

在语法中我去符号表中添加一些内容:

lvalue: ID {

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

        }
        ;
Run Code Online (Sandbox Code Playgroud)

在输出中,当我给出不同行的输入时,它不识别新行

if(x<=2)
{

    if(t<1)
    {
        k=2;   
    }
}
Run Code Online (Sandbox Code Playgroud)

lineNO永远不会改变,总是有1作为价值......

有任何想法吗?

Bry*_*ier 7

您使用的假设yylinenoflex,那么你或许应该添加一行

%option yylineno
Run Code Online (Sandbox Code Playgroud)

符合您的flex要求.但请注意,不建议yylineno直接导出到您的语法,因为您的语法可能会请求从标记器中查看令牌,因此yylineno可能已经更新.公开的处理方式yylineno是通过yylval.我也看到bison有新的行编号功能(见@1@@等)可能与整合更加轻松flex.

PS:看我说bison,你刚提到的地方yacc.如果你致力于yacc,通过它yylval.