2016-04-14 104 views
0
%option case-insensitive 
%option noyywrap 
%option yylineno 


id    [a-zA-Z][a-zA-Z_0-9]* 

integer   (0[xX][0-9A-Fa-f]+)|([0-9]+) 

real   [0-9]*\.[0-9](e|E)?[0-9]* 

undefined  [^"\r\n \t] 

%x STR 
%% 
\" string_buf_ptr = string_buf; BEGIN(STR); 

<STR>\"  { /* saw closing quote - all done */ 
    BEGIN(INITIAL); 
    *string_buf_ptr = '\0'; 
    /* return string constant token type and 
    * value to parser 
    */ 

    yylval.strVal = strdup(string_buf); 
    sprintf(yyout, yylval.strVal); 
    return STR; 
    } 

<STR>\\n *string_buf_ptr++ = '\n'; 
<STR>\\t *string_buf_ptr++ = '\t'; 
<STR>\\r *string_buf_ptr++ = '\r'; 
<STR>\\b *string_buf_ptr++ = '\b'; 
<STR>\\f *string_buf_ptr++ = '\f'; 

<STR>\\(.|\n) *string_buf_ptr++ = yytext[1]; 

<STR>[^\\\n\"]+  { 
    char *yptr = yytext; 

    while (*yptr) 
      *string_buf_ptr++ = *yptr++; 
    } 

這是我的字符串詞法分析代碼的一部分。這段代碼的目標是定位字符串(類似C的字符串,例如"Hello World")並將它們返回給我們的解析器進行處理。處理字符串時解析錯誤

我還建造了使用Yacc工具的分析器,它的不同之處,從當我們爲變量分配字符串近乎完美的(例如:x="Hello World";) 當我這樣做,yyerror(const char*)函數被調用和消息是unexpected $undefined.我不明白爲什麼會發生這種情況。減少應該承認left valuexassignmentconstant String"Hello World",我出了什麼問題?

回答

2

問題是,你已經明確地將STR定義爲令牌和lex開始狀態。這兩個實際上都是宏(擴展爲整型常量字面值),因此您可能會在編譯器輸出中重新定義宏STR的警告。上面的代碼中的return STR;最終返回STR的啓動狀態代碼,而不是令牌代碼,而野牛生成的分析器不會將其識別爲有效的令牌代碼。

+0

謝謝!就是這樣! – Jack