processing of %= was missing
[fw/sdcc] / src / SDCC.y
index e777a3133db6bd59dd9ab5c3e7ef902b3e8a6116..a73224e2db0fd387e27ba6ab1a482787c9f78e95 100644 (file)
@@ -31,6 +31,7 @@
 #include "SDCCval.h"
 #include "SDCCmem.h"
 #include "SDCCast.h"
+
 extern int yyerror (char *);
 extern FILE    *yyin;
 extern char srcLstFname[];
@@ -75,10 +76,10 @@ value *cenum = NULL  ;  /* current enumeration  type chain*/
 %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 INTERRUPT SFR AT SBIT
-%token REENTRANT USING  XDATA DATA IDATA PDATA VAR_ARGS CRITICAL
+%token TYPEDEF EXTERN STATIC AUTO REGISTER CODE EEPROM INTERRUPT SFR AT SBIT
+%token REENTRANT USING  XDATA DATA IDATA PDATA VAR_ARGS CRITICAL NONBANKED
 %token CHAR SHORT INT LONG SIGNED UNSIGNED FLOAT DOUBLE CONST VOLATILE VOID BIT
-%token STRUCT UNION ENUM ELIPSIS RANGE FAR _XDATA _CODE _GENERIC _NEAR _PDATA _IDATA
+%token STRUCT UNION ENUM ELIPSIS RANGE FAR _XDATA _CODE _GENERIC _NEAR _PDATA _IDATA _EEPROM
 %token CASE DEFAULT IF ELSE SWITCH WHILE DO FOR GOTO CONTINUE BREAK RETURN 
 %token <yyinline> INLINEASM
 %token IFX ADDRESS_OF GET_VALUE_AT_ADDRESS SPIL UNSPIL GETHBIT
@@ -164,6 +165,10 @@ using_reentrant_interrupt
                         $$->class = SPECIFIER   ;
                         SPEC_CRTCL($$) = 1;
                      }
+   |  NONBANKED      {$$ = newLink ();
+                        $$->class = SPECIFIER   ;
+                        SPEC_NONBANKED($$) = 1;
+                     }
    |  Interrupt_storage
                      {
                         $$ = newLink () ;
@@ -358,6 +363,9 @@ assignment_expr
                             case DIV_ASSIGN:
                                     $$ = newNode('=',$1,newNode('/',copyAst($1),$3));
                                     break;
+                            case MOD_ASSIGN:
+                                    $$ = newNode('=',$1,newNode('%',copyAst($1),$3));
+                                    break;
                             case ADD_ASSIGN:
                                     $$ = newNode('=',$1,newNode('+',copyAst($1),$3));
                                     break;
@@ -576,6 +584,11 @@ type_specifier2
                   $$->class = SPECIFIER  ;
                   SPEC_SCLS($$) = S_CODE ;                 
                }
+   | EEPROM      {
+                  $$ = newLink () ;
+                  $$->class = SPECIFIER  ;
+                  SPEC_SCLS($$) = S_EEPROM ;
+               }
    | DATA      {
                   $$ = newLink ();
                   $$->class = SPECIFIER ;
@@ -914,7 +927,11 @@ pointer
                 case S_CODE:
                     DCL_PTR_CONST($3) = 1;
                     DCL_TYPE($3) = CPOINTER ;
+                case S_EEPROM:
+                    DCL_TYPE($3) = EEPPOINTER;
                     break;
+                default:
+                    werror(W_PTR_TYPE_INVALID);
                 }
             }
             else 
@@ -941,6 +958,7 @@ far_near
    | _IDATA    { $$ = newLink() ; DCL_TYPE($$) = IPOINTER ; }
    | _NEAR     { $$ = NULL ; }
    | _GENERIC  { $$ = newLink() ; DCL_TYPE($$) = GPOINTER ; } 
+   | _EEPROM   { $$ = newLink() ; DCL_TYPE($$) = EEPPOINTER ;} 
    |           { $$ = newLink() ; DCL_TYPE($$) = UPOINTER ; }
    ;