2014-04-25 31 views
0

Helo。在Yacc中打印僞變量

我在學習yacc,我在理解某些問題時遇到了一些問題。

這是我.y文件的一部分:

statement: statement expression '\n' {$$=insert_expression_list($1, $2); printf("1\n");} 
     | expression '\n' {$$=insert_expression_list(NULL, $1); myprogram=$$; printf("1.1\n");} 
     ; 

expression: infix_expression {$$=insert_i_expression($1); printf("2\n");} 
     | unary_expression {$$=insert_u_expression($1);} 
     | NUMBER  {$$=insert_NUMBER($1); printf("test %d\n", $1); } 
     ;  

infix_expression: expression '+' expression {printf("3 %d + %d\n", $1, $3); $$=insert_infix_expression($1, is_PLUS, $3);} 
     | expression '-' expression {$$=insert_infix_expression($1, is_MINUS, $3);} 
     ; 

unary_expression: '-' expression %prec UMINUS {$$=insert_unary_expression($2);} 
      ; 

正如你可以看到我想打印一些「調試」信息。 這是包含1+2+5的文件的輸出。

test 1 
test 2 
3 -2147318816 + -2147318800 
2 
test 5 
3 -2147069008 + -2147068992 
2 
1.1 

的問題是在infix_expression: expression '+' expression {printf("3 %d + %d\n", $1, $3); 這不是打印這些值的正確方法是什麼?在NUMBER {$$=insert_NUMBER($1); printf("test %d\n", $1); }如我所料值印刷...

回答

0

在行3 -2147318816 + -2147318800的情況下,該值-2147318816-2147318800都在expression: NUMBER規則分配給$$的價值觀 - 你insert_NUMBER函數返回的值。我猜這些實際上是指針,你打印爲整數。通常我會希望你的編譯器給你一個關於分配一個沒有強制轉換的整數指針的消息,但是如果你編譯時沒有警告它可能不會。

一般來說,如果你想使用不同類型的YACC /野牛的值(而不是僅僅擁有一切是int - 默認),你需要一個%union聲明定義所有可能的不同語義值類型和您需要指定具有適當的%token%type聲明的所有令牌和非終端使用哪個聯合字段。

+0

謝謝。將盡力做到這一點。 – Favolas