4

对于编译器中的一个项目,我在语法分析器中有一个问题,当我在符号表中添加一个符号时,我在 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;
%}

当我在符号表中添加一些东西时,在语法中:

IE

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 作为值......

有任何想法吗?

4

1 回答 1

9

假设您正在使用yylinenofrom flex,那么您可能应该添加一行

%option yylineno

根据您的flex规格。但是请注意,不建议yylineno直接导出到您的语法,因为您的语法可能会从标记器请求前瞻标记,因此yylineno可能已经更新。公开的处理方式yylineno是通过yylval。我还看到它bison具有新的行号功能(请参阅@1@@),可能更轻松地与flex.

PS:看我说的bison,你只提到的地方yacc。如果你承诺yacc,通过它yylval

于 2013-05-08T15:22:00.400 回答