2014-06-25 43 views
0

我有以下的定義在我的lex文件:萊克斯正則表達式得到了一些額外的字符

L [a-zA-Z_]           
A [a-zA-Z_0-9] 
%% 
{L}{A}*     { yylval.id = yytext; return IDENTIFIER; } 

而且我在我的YACC文件中的以下內容:

primary_expression 
    : IDENTIFIER   { puts("IDENTIFIER: "); printf("%s", $1); } 

我的源代碼(一個我「米分析)被分配如下:

ab= 10; 

出於某種原因,即printf("%s", $1);部分是印刷ab=而不僅僅是ab

我很確定這是打印ab=的部分,因爲當我刪除printf("%s", $1);標識符根本不打印。

我真的跑出了想法。我究竟做錯了什麼?

讓我知道我是否可以更清楚。

回答

3

我在做什麼錯?

你假定yytext所指的字符串是恆定的。不是這樣。

yytext指向的字符串的生存期是關聯規則的詞彙操作。如果該規則最終返回,則yytext將繼續存在,直到下一次調用yylex。就是這樣。

bison - 生成的解析器具有單符號預覽。因此,在解析器執行語義操作時,yylex已被再次調用(用於查找);因此,即使對於規則中的最後(或唯一)令牌,也不能使用保存的值yytext

解決方案:複製字符串。 (我使用strdup,但是無論出於什麼原因,有些人喜歡malloc和strcpy,如果你這樣做,不要忘記NUL終結者。)當你完成它時,記得free()副本。

僅供參考:what the flex manual says.

相關問題