2013-04-11 123 views
2

我正在使用flex和野牛寫一個語義分析器。在那裏,我有一個矩陣文字,就像[1,2,3; 3,4; 5]一樣。假設它們是整數。我有以下規則:C-Bison-flex中的字符串串聯

在柔性文件:

int {yylval.type_id.Type=1;return tINTTYPE;} 

在野牛文件:

char m[80]; //to keep the value of matrix literal 

%union semrec 
{ 
    struct 
    { 
     int Type; 
     char *id; 
    }type_id; 
} 

matrixLit : '[' row ';' rows ']' 

row : value 
     | value ',' row 

rows : row   
     | row ';' rows 

value : tINT  {$$.id=$1.id;} 
    | tREAL  {$$.id=$1.id;} 
    | tIDENT {$$.id=$1.id;} 

通過使用這些,我想獲得的矩陣文字的值。例如,如果矩陣文字是[1; 2; 3,4; 5,6],我嘗試得到1; 2; 3,4; 5,6。我嘗試了一些使用$$ .id = $ 1.id和strcat(m,$ 1.id),strcpy(m,$ 1.id)等等,但無論我做什麼,我都無法按照此順序獲取值。我得到像4,2; 1; 3,5,6的東西。誰能幫我這個?

謝謝

回答

3

對於初學者來說,總是在野牛中使用left-recursion。 Bison的解析器能夠摺疊樹的左側,創建更快更高效的解析器。

我要作一個假設,它是文字爲空矩陣非法的。如果這不是你想要的行爲,你必須稍微玩一下。

%type <list> rows row 
%% 
matrixLit : '[' rows ']' 

rows : row   { $$ = create_list(); $$->add($1); } 
    | rows ';' row { $$->add($3); } 
    ; 

row : value   { $$ = create_list(); $$->add($1); } 
    | row ',' value { $$->add($3); } 
    ; 

您將需要添加某種列表類型到您的野牛聯盟。行是行條目的列表,行是值條目的列表。

+1

[家庭作業標籤現已正式棄用(http://meta.stackexchange.com/questions/147100/the-homework-tag-is-now-officially-deprecated)。 – 2013-04-11 19:06:23

+0

@JonathanLeffler:謝謝,我現在已經受過教育! – Josh 2013-04-11 19:17:11

+0

@Josh謝謝,這對數字有效,但我無法處理在哪裏放置逗號和分號? – yrazlik 2013-04-11 22:38:26