2011-12-26 51 views
3

我有這個令牌我.lex文件:如何在flex和bison中獲取令牌的字符串值?

[a-zA-Z0-9]+ { yylval = yytext; return ALPHANUM; } 

這個代碼我.Y文件:

Sentence: "Sphere(" ALPHANUM ")." 
{ 
FILE* file = fopen("C:/test.txt", "a+"); 
char st1[] = "polySphere -name "; 
strcat(st1, $2); 
strcat(st1, ";"); 
fprintf(file,"%s", st1); 
fclose(file); 
} 

我得到這個錯誤,當我嘗試編譯:

警告:傳遞'strcat'的參數2使得整型指針沒有轉換

所以$ 2是一個int,我如何使它成爲一個字符串?

例如:「Sphere(worldGlobe)」。我想要$ 2在這裏獲得字符串值worldGlobe。

感謝所有幫助

+0

我刪除了Flex標籤;這是用於Adobe Flex並添加了引用詞法分析器的gnu-flex標籤和[我相信]您正在尋找的內容。 – JeffryHouser 2011-12-26 04:00:31

+0

您能否向我們展示您的.y文件中的聯合聲明以及來自.y文件的ALPHANUM的令牌聲明? – MtnViewJohn 2011-12-26 04:46:27

+1

假設您有多個yylval類型。如果你所有返回的都是char *,那麼你應該在.y文件的序言部分有'#define YYSTYPE char *'。 – MtnViewJohn 2011-12-26 05:28:36

回答

6

在沒有%union聲明,野牛定義YYSTYPE爲int,所以所有的 符號值都是整數。 其實你有此問題的幾個解決方案:

1)的yylval |聯合解決方案(推薦):
正如你可能知道的yylval是所使用的詞法分析器來存儲yytext中變量一個全局變量(yylval = yytext;)所以你應該告訴你的詞法分析器哪些類型將向store.you可以簡單地將此行添加到您的YACC語法頭:

#define YYSTYPE char * 

,你會在這裏只存儲字符串值。

順便說一句,如果你想存儲你應該在你的yacc文件中指定不同的類型:

%union { 
    char *a; 
    double d; 
    int fn; 
} 

然後在你的法,你將有

[a-zA-Z0-9]+ { **yylval.a** = yytext; return ALPHANUM; } 

2)使用yytext中:

建議:對於yacc中的規則之後的回調我個人更喜歡使用函數。而不是整個代碼:)

這個解決方案非常簡單。
Sentence: "Sphere("{callback_your_function(yytext);} ALPHANUM ")."

yytext中這裏有你自己的ALPHANUM代幣的價值,因爲它的下一個標記。

+10

我會小心將原始yytext指針粘貼到yylval中。當你下一次操作時,緩衝區被覆蓋。如果您有一個解析器將收集多個此類標記放入規則中,並且您同時以$ 1,$ 2引用它們,則這不是一種合適的方法。如果您只是在循環中調用yylex()並逐個處理令牌,則可能會有問題。 – Kaz 2012-03-06 06:56:52