在Yacc中打印伪变量

时间:2014-04-25 17:46:58

标签: bison 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); }中,该值按照我的预期打印...

1 个答案:

答案 0 :(得分:0)

对于行3 -2147318816 + -2147318800,值-2147318816-2147318800$$规则中分配给expression: NUMBER的值 - 值由insert_NUMBER函数返回。我猜这些实际上是你要打印成整数的指针。通常我希望你的编译器给你一个关于在没有强制转换的情况下分配指向整数的指针的消息,但是如果你编译时没有警告它可能没有。

通常,如果你想对yacc / bison中的值使用不同的类型(而不仅仅是将所有内容都设为int - 默认值),则需要%union声明来定义所有不同的可能语义值类型,您需要使用适当的%token%type声明来指定要用于所有令牌和非终结符的联合字段。