2013-05-08 32 views
3

对于编译器中的一个项目我在语法分析器中遇到了一个问题, 当我在符号表中添加符号时,我总是使用yylineno中的相同值...yylineno在yacc文件中始终具有相同的值

我这样做在开始时:

%{ 

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

什么想法?

回答

6

假设你正在使用yylinenoflex,那么你或许应该加上一行

%option yylineno 

flex规范。但是请注意,将yylineno直接导出到您的语法是不可取的,因为您的语法可能会请求预先分类器中的令牌,因此yylineno可能已被更新。公开处理yylineno的方式是通过yylval。我也看到bison具有新的行编号功能(请参阅@1@@等),这些功能可能更容易与flex集成。

P.S:看我说的是bison,你只提到了yacc。如果您致力于yacc,请通过yylval

相关问题