2013-05-08 68 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

相關問題