* src/*.c, src/pic16/{gen.c,glue.c,main.c}: applied Vangelis
[fw/sdcc] / src / SDCC.y
index 77182a48ce2a822077a23e66d38bf34aecf758f3..17dacb5dcf983d4f9dcac95417b504b1497d0c16 100644 (file)
@@ -87,9 +87,10 @@ bool uselessDecl = TRUE;
 %token <yyint> MUL_ASSIGN DIV_ASSIGN MOD_ASSIGN ADD_ASSIGN
 %token <yyint> SUB_ASSIGN LEFT_ASSIGN RIGHT_ASSIGN AND_ASSIGN
 %token <yyint> XOR_ASSIGN OR_ASSIGN
-%token TYPEDEF EXTERN STATIC AUTO REGISTER CODE EEPROM INTERRUPT SFR AT SBIT
-%token REENTRANT USING  XDATA DATA IDATA PDATA VAR_ARGS CRITICAL NONBANKED BANKED
-%token CHAR SHORT INT LONG SIGNED UNSIGNED FLOAT DOUBLE CONST VOLATILE VOID BIT
+%token TYPEDEF EXTERN STATIC AUTO REGISTER CODE EEPROM INTERRUPT SFR SFR16 SFR32
+%token AT SBIT REENTRANT USING  XDATA DATA IDATA PDATA VAR_ARGS CRITICAL
+%token NONBANKED BANKED SHADOWREGS WPARAM
+%token CHAR SHORT INT LONG SIGNED UNSIGNED FLOAT DOUBLE FIXED16X16 CONST VOLATILE VOID BIT
 %token STRUCT UNION ENUM ELIPSIS RANGE FAR
 %token CASE DEFAULT IF ELSE SWITCH WHILE DO FOR GOTO CONTINUE BREAK RETURN
 %token NAKED JAVANATIVE OVERLAY
@@ -98,7 +99,7 @@ bool uselessDecl = TRUE;
 %token BITWISEAND UNARYMINUS IPUSH IPOP PCALL  ENDFUNCTION JUMPTABLE
 %token RRC RLC 
 %token CAST CALL PARAM NULLOP BLOCK LABEL RECEIVE SEND ARRAYINIT
-%token DUMMY_READ_VOLATILE ENDCRITICAL SWAP
+%token DUMMY_READ_VOLATILE ENDCRITICAL SWAP INLINE RESTRICT
 
 %type <yyint>  Interrupt_storage
 %type <sym> identifier  declarator  declarator2 declarator3 enumerator_list enumerator
@@ -159,7 +160,7 @@ external_definition
                                        SPEC_EXTR($1->etype) = 1;
                                   }
                               }
-                               addSymChain ($1);
+                               addSymChain (&$1);
                                allocVariables ($1) ;
                               cleanUpLevel (SymbolTab,1);
                              }
@@ -210,6 +211,12 @@ function_attributes
                            werror(W_BANKED_WITH_NONBANKED);
                        }
                      }
+   |  SHADOWREGS     {$$ = newLink (SPECIFIER);
+                        FUNC_ISSHADOWREGS($$) = 1;
+                     }
+   |  WPARAM         {$$ = newLink (SPECIFIER);
+                        FUNC_ISWPARAM($$) = 1;
+                     }
    |  BANKED         {$$ = newLink (SPECIFIER);
                         FUNC_BANKED($$) = 1;
                        if (FUNC_NONBANKED($$)) {
@@ -401,7 +408,7 @@ conditional_expr
 
 assignment_expr
    : conditional_expr
-   | unary_expr assignment_operator assignment_expr   
+   | cast_expr assignment_operator assignment_expr   
                      { 
                                 
                             switch ($2) {
@@ -643,6 +650,11 @@ type_specifier2
               SPEC_NOUN($$) = V_FLOAT;
               ignoreTypedefType = 1;
             }
+   | FIXED16X16  {
+               $$=newLink(SPECIFIER);
+              SPEC_NOUN($$) = V_FIXED16X16;
+              ignoreTypedefType = 1;
+            }
    | XDATA     {
                   $$ = newLink (SPECIFIER);
                   SPEC_SCLS($$) = S_XDATA  ;
@@ -730,6 +742,29 @@ sfr_attributes
             }
    ;
 
+sfr_attributes
+   : SFR16  {
+               $$ = newLink(SPECIFIER) ;
+               FUNC_REGBANK($$) = 0;
+               SPEC_NOUN($$)    = V_INT;
+               SPEC_SCLS($$)    = S_SFR;
+               SPEC_USIGN($$)   = 1 ;
+               ignoreTypedefType = 1;
+            }
+   ;
+
+sfr_attributes
+   : SFR32  {
+               $$ = newLink(SPECIFIER) ;
+               FUNC_REGBANK($$) = 0;
+               SPEC_NOUN($$)    = V_INT;
+               SPEC_SCLS($$)    = S_SFR;
+               SPEC_LONG($$)    = 1;
+               SPEC_USIGN($$)   = 1;
+               ignoreTypedefType = 1;
+            }
+   ;
+
 struct_or_union_specifier
    : struct_or_union opt_stag
         {
@@ -976,7 +1011,7 @@ enumerator
        SPEC_ENUM($1->etype) = 1;
        $$ = $1 ;
        // do this now, so we can use it for the next enums in the list
-       addSymChain($1);
+       addSymChain(&$1);
      }
    ;
 
@@ -1252,7 +1287,7 @@ parameter_declaration
                  pointerTypes($2->type,$1);
                   addDecl ($2,0,$1);             
                  for (loop=$2;loop;loop->_isparm=1,loop=loop->next);
-                 addSymChain ($2);
+                 addSymChain (&$2);
                  $$ = symbolVal($2);
                  ignoreTypedefType = 0;
                }
@@ -1432,10 +1467,10 @@ compound_statement
    : start_block end_block                    { $$ = createBlock(NULL,NULL); }
    | start_block statement_list end_block     { $$ = createBlock(NULL,$2) ;  }
    | start_block 
-          declaration_list                    { addSymChain($2); }
+          declaration_list                    { addSymChain(&$2); }
      end_block                                { $$ = createBlock($2,NULL) ;  }
    | start_block 
-          declaration_list                    {  addSymChain ($2); }
+          declaration_list                    {  addSymChain (&$2); }
           statement_list   
      end_block                                {$$ = createBlock($2,$4)   ;  }
    | error ';'                               { $$ = NULL ; }