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

时间:2013-05-08 14:16:23

标签: 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;
%}

在语法中,当我在符号表中添加内容时:

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;   
    }
}

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

任何想法?

1 个答案:

答案 0 :(得分:6)

假设您使用yylineno中的flex,那么您应该添加一行

%option yylineno

到您的flex规范。但请注意,不建议将yylineno直接导出到您的语法中,因为您的语法可能会请求从标记器中查看令牌,因此yylineno可能已经更新。自称处理yylineno的方式是yylval。我还看到bison有新的行编号功能(请参阅@1@@等),这些功能可能更轻松地与flex集成。

P.S:看我说bison,你只提到yacc。如果您致力于yacc,请将其传递给yylval