这个问题已经有了答案:
Flex yylineno set to 1
1个答案
对于编译器中的一个项目,语法分析器中有一个问题,
当我要在符号表中添加一个符号时,我在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;
    }
}

线没有变化,总是有1作为值…
有什么想法吗?

最佳答案

假设您使用的是yylinenofromflex,那么您可能应该添加一行

%option yylineno

符合您的flex规范。但是请注意,不建议直接将yylineno导出到语法中,因为语法可能会从标记赋予器请求先行标记,因此yylineno可能已经更新。处理yylineno的专业方法是通过yylval。我还看到bison有新的行号功能(参见@1@@等),可能更容易与flex集成。
注意:我说的是bison,你只提到了yacc。如果您致力于yacc,请通过yylval

09-08 00:12