/[smarc]/smarc/src/spasm/spasm.y
ViewVC logotype

Diff of /smarc/src/spasm/spasm.y

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.4 by batonik, Tue Dec 31 12:17:23 2002 UTC revision 1.5 by batonik, Wed Jan 1 21:22:55 2003 UTC
# Line 1  Line 1 
1    
2  %union {  %union {
3          unsigned long   lcalk;          unsigned long           lcalk;
4          char *  string;          char                    *string;
5  }  }
6    
7  %type <string> tekst_ascii  %type <string> tekst_ascii
# Line 18  Line 18 
18  %type <lcalk> mem_store  %type <lcalk> mem_store
19  %type <lcalk> adres  %type <lcalk> adres
20  %type <lcalk> adres_wew  %type <lcalk> adres_wew
21    %type <lcalk> adres_dsp
22    
23    
24  %token <lcalk> LICZBA  %token <lcalk> LICZBA
25  %token MINUS  %token MINUS
# Line 247  liczba:                LICZBA Line 249  liczba:                LICZBA
249                                  sword = -$2;                                  sword = -$2;
250                                  $$ = (ulint) sword;                                  $$ = (ulint) sword;
251                          }                          }
252                    | CIAG_ALNUM
253                            {       /* stała */
254                                    Lista *stala = ZnajdzEtykieteStalej($1);
255    
256                                    if (!stala)
257                                    {
258                                            yyerror(E_NOCONST);
259                                            YYABORT;
260                                    }
261                                    else
262                                            $$ = stala->adres;
263                            }
264  ;  ;
265    
266  wyr2:           dyrektywa  wyr2:           dyrektywa
# Line 294  tekst_ascii:   TEKSTCIAGU      { Line 308  tekst_ascii:   TEKSTCIAGU      {
308                                  }                                  }
309  ;  ;
310    
311  align:          LICZBA          {  align:          liczba          {
312                                          int _al = $1;                                          int _al = $1;
313                                          if (_al != 2 && _al != 4)                                          if (_al != 2 && _al != 4)
314                                                  yywarn(W_ALIGNVAL);                                                  yywarn(W_ALIGNVAL);
# Line 306  align:         LICZBA          { Line 320  align:         LICZBA          {
320                                  }                                  }
321  ;  ;
322    
323  skip:           LICZBA          {  skip:           liczba          {
324                                          unsigned int i;                                          unsigned int i;
325    
326                                          if (SprawdzSekcje(DANE))                                          if (SprawdzSekcje(DANE))
# Line 329  dane_bajty:    liczba Line 343  dane_bajty:    liczba
343                                  if (SprawdzSekcje(DANE))                                  if (SprawdzSekcje(DANE))
344                                          YYABORT;                                          YYABORT;
345    
346                                  if (sbajt < INT8_MIN || (sbajt >0 && sbajt > UINT8_MAX))                                  if (sbajt < INT8_MIN || (sbajt > 0 && sbajt > UINT8_MAX))
347                                  {                                  {
348                                          yyerror(E_OVERFLOW);                                          yyerror(E_OVERFLOW);
349                                          YYABORT;                                          YYABORT;
# Line 360  dane_slowa:    liczba Line 374  dane_slowa:    liczba
374    
375  dane_polslowa:  liczba  dane_polslowa:  liczba
376                          {                          {
377                                  int shalf = $1;                                  long int shalf = $1;
378    
379                                  if (SprawdzSekcje(DANE))                                  if (SprawdzSekcje(DANE))
380                                          YYABORT;                                          YYABORT;
# Line 489  jeden_arg:     PR_TST rejestr Line 503  jeden_arg:     PR_TST rejestr
503                                  }                                  }
504                                  etykLink = NULL;                                  etykLink = NULL;
505                          }                          }
506                    | PR_JMP adres_wew
507                            {
508                                    ulint rozkaz = $2;
509    
510                                    rozkaz &= (ROZKAZ_F(F_ALU) | 0x3FFFFFFF);
511                                    rozkaz |= ROZKAZ_OPC(OPC_JMPL);
512                                    DodajRozkaz(rozkaz, TAK, NULL);
513                            }
514  ;  ;
515    
516  b_cond:         B_BN            { $$ = $1 }  b_cond:         B_BN            { $$ = $1 }
# Line 587  adres_wew:     rejestr Line 609  adres_wew:     rejestr
609                          }                          }
610                  | liczba                  | liczba
611                          {                          {
612                                  if ((signed long) $1 < -4096 || ($1 > 0 && $1 > 4095))                                  long int sword = $1;
613                                  {  
614                                          yyerror(E_OVERFLOW);                                  if (sword < -4096 || (sword > 0 && sword > 4095))
                                         YYABORT;  
                                 }  
                                 $$ = ZrobRozkaz(TYP_REGIMM, F_MEM, 0, 0, 0, 0, $1);  
                         }  
                 | rejestr PLUS LICZBA  
                         {  
                                 if ($3 > 4095)  
615                                  {                                  {
616                                          yyerror(E_OVERFLOW);                                          yyerror(E_OVERFLOW);
617                                          YYABORT;                                          YYABORT;
618                                  }                                  }
619                                  $$ = ZrobRozkaz(TYP_REGIMM, F_MEM, 0, 0, $1, 0, $3);                                  $$ = ZrobRozkaz(TYP_REGIMM, F_MEM, 0, 0, 0, 0, sword);
620                          }                          }
621                  | rejestr MINUS LICZBA                  | rejestr adres_dsp
622                          {                          {
623                                  if ($3 > 4096)                                  long int sword = $2;
624    
625                                    if (sword < -4096 || (sword > 0 && sword > 4095))
626                                  {                                  {
627                                          yyerror(E_OVERFLOW);                                          yyerror(E_OVERFLOW);
628                                          YYABORT;                                          YYABORT;
629                                  }                                  }
630                                  $$ = ZrobRozkaz(TYP_REGIMM, F_MEM, 0, 0, $1, 0, -$3);                                  $$ = ZrobRozkaz(TYP_REGIMM, F_MEM, 0, 0, $1, 0, sword);
631                          }                          }
632  ;  ;
633    
634    adres_dsp:      PLUS liczba             { $$ = $2 }
635                    | MINUS liczba          { $$ = (signed long) $2 * (-1); }
636    ;
637    
638  trzy_arg:       rozkazy_3arg argumenty  trzy_arg:       rozkazy_3arg argumenty
639                          {                          {
# Line 694  lo_op:         LO NAWIASL CIAG_ALNUM NAWIASP Line 714  lo_op:         LO NAWIASL CIAG_ALNUM NAWIASP
714                                          if (!etykLink)                                          if (!etykLink)
715  */  */
716                          }                          }
717                  | LO NAWIASL LICZBA NAWIASP                  | LO NAWIASL liczba NAWIASP
718                          {                          {
719                                  $$ = ROZKAZ_TYP(TYP_REGIMM) | ROZKAZ_IMM($3 & 0x3FF);                                  $$ = ROZKAZ_TYP(TYP_REGIMM) | ROZKAZ_IMM(OP_LO($3));
720                          }                          }
721  ;  ;
722    
723  hi_op:          HI NAWIASL CIAG_ALNUM NAWIASP  hi_op:          HI NAWIASL CIAG_ALNUM NAWIASP
724                          {                          {
725                          }                          }
726                  | HI NAWIASL LICZBA NAWIASP                  | HI NAWIASL liczba NAWIASP
727                          {                          {
728                                    $$ = OP_HI($3);
729                          }                          }
730  ;  ;

Legend:
Removed from v.1.4  
changed lines
  Added in v.1.5

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26