Added support to generate code for struct bit fields.
[fw/sdcc] / src / SDCC.y
index c66605232e1b0bdc8903bc6314360920c88012f3..d2aaedc06d2a7bf541069f820b42ae72d16e8619 100644 (file)
@@ -256,18 +256,20 @@ postfix_expr
           {       
            $$ = newNode  (CALL,$1,$3) ; $$->left->funcName = 1;
          }
-   | postfix_expr '.' identifier       
+   | postfix_expr '.' { ignoreTypedefType = 1; } identifier       
                      {    
-                       $3 = newSymbol($3->name,NestLevel);
-                       $3->implicit = 1;
-                       $$ = newNode(PTR_OP,newNode('&',$1,NULL),newAst_VALUE(symbolVal($3)));
-/*                     $$ = newNode('.',$1,newAst(EX_VALUE,symbolVal($3))) ;                   */
+                       ignoreTypedefType = 0;
+                       $4 = newSymbol($4->name,NestLevel);
+                       $4->implicit = 1;
+                       $$ = newNode(PTR_OP,newNode('&',$1,NULL),newAst_VALUE(symbolVal($4)));
+/*                     $$ = newNode('.',$1,newAst(EX_VALUE,symbolVal($4))) ;                   */
                      }
-   | postfix_expr PTR_OP identifier    
+   | postfix_expr PTR_OP { ignoreTypedefType = 1; } identifier    
                       { 
-                       $3 = newSymbol($3->name,NestLevel);
-                       $3->implicit = 1;                       
-                       $$ = newNode(PTR_OP,$1,newAst_VALUE(symbolVal($3)));
+                       ignoreTypedefType = 0;
+                       $4 = newSymbol($4->name,NestLevel);
+                       $4->implicit = 1;                       
+                       $$ = newNode(PTR_OP,$1,newAst_VALUE(symbolVal($4)));
                      }
    | postfix_expr INC_OP   
                       {        $$ = newNode(INC_OP,$1,NULL);}
@@ -399,7 +401,7 @@ conditional_expr
 
 assignment_expr
    : conditional_expr
-   | unary_expr assignment_operator assignment_expr   
+   | cast_expr assignment_operator assignment_expr   
                      { 
                                 
                             switch ($2) {
@@ -702,6 +704,8 @@ sfr_reg_bit
                $$ = newLink(SPECIFIER) ;
                SPEC_NOUN($$) = V_SBIT;
                SPEC_SCLS($$) = S_SBIT;
+              SPEC_BLEN($$) = 1;
+              SPEC_BSTR($$) = 0;
               ignoreTypedefType = 1;
             }
    |  sfr_attributes
@@ -1395,20 +1399,21 @@ critical_statement
       
 labeled_statement
 //   : identifier ':' statement          {  $$ = createLabel($1,$3);  }   
-   : identifier ':'                    {  $$ = createLabel($1,NULL);  }   
-   | CASE constant_expr ':' statement
+   : identifier ':'                    {  $$ = createLabel($1,NULL);
+                                         $1->isitmp = 0;  }   
+   | CASE constant_expr ':'
      {
        if (STACK_EMPTY(swStk))
-         $$ = createCase(NULL,$2,$4);
+         $$ = createCase(NULL,$2,NULL);
        else
-         $$ = createCase(STACK_PEEK(swStk),$2,$4);
+         $$ = createCase(STACK_PEEK(swStk),$2,NULL);
      }
-   | DEFAULT { $<asts>$ = newNode(DEFAULT,NULL,NULL); } ':' statement
+   | DEFAULT { $<asts>$ = newNode(DEFAULT,NULL,NULL); } ':'
      {
        if (STACK_EMPTY(swStk))
-         $$ = createDefault(NULL,$<asts>2,$4);
+         $$ = createDefault(NULL,$<asts>2,NULL);
        else
-         $$ = createDefault(STACK_PEEK(swStk),$<asts>2,$4);
+         $$ = createDefault(STACK_PEEK(swStk),$<asts>2,NULL);
      }
    ;