Annotation of researchv9/jerq/sgs/ld/ld.yac, revision 1.1

1.1     ! root        1: %{
        !             2: static char ID[] = "@(#) ld.yac: 1.8 12/1/83";
        !             3: #include "system.h"
        !             4: #include <stdio.h>
        !             5: #include "bool.h"
        !             6: #include "attributes.h"
        !             7: #include "list.h"
        !             8: #include "structs.h"
        !             9: 
        !            10: #if TRVEC
        !            11: #include "tv.h"
        !            12: #include "ldtv.h"
        !            13: #endif
        !            14: 
        !            15: #include "extrns.h"
        !            16: #include "sgs.h"
        !            17: #include "sgsmacros.h"
        !            18: #include "ldmacros.h"
        !            19: 
        !            20: 
        !            21: 
        !            22: extern char inline[];
        !            23: 
        !            24: 
        !            25: /*
        !            26:  *
        !            27:  *     There is a very important variable, called
        !            28:  *
        !            29:  *             in_y_exp
        !            30:  *
        !            31:  *     that is used to help recognize filenames.
        !            32:  *
        !            33:  *     The problems is this:  a UNIX filename can contain
        !            34:  *     virtually any character, and the nodes in the pathname
        !            35:  *     are separated by slashes.  Unfortunately, slashes also
        !            36:  *     occur in expressions, comments, and the /= assignment
        !            37:  *     operator.  Moreover, the LEX rules ignore white space,
        !            38:  *     which is important to knowing where one filename stops
        !            39:  *     and the next begins.
        !            40:  *
        !            41:  *     The resolution is this.  Lex doesn't know enough alone to
        !            42:  *     recognize a filename; so we give it some help.  Whenever we
        !            43:  *     are in an expression, we set in_y_exp to TRUE, and then lex knows
        !            44:  *     that any slash is a slash, and should not be kept as part of
        !            45:  *     a filename.  a/b is a divided by b, not the file a/b.
        !            46:  *
        !            47:  *     Consequently, whenever a slash must be kept as a slash,
        !            48:  *     in_y_exp will be TRUE.  Otherwise, it will be FALSE, and the
        !            49:  *     lexical analyzer will treat a/b as a filename.
        !            50:  */
        !            51: 
        !            52: int in_y_exp;
        !            53: 
        !            54: static secnum;                                 /* number of sections */
        !            55: static char *fnamptr;
        !            56: static int nsecspcs, fillflag;                 /* parsing status flags */
        !            57: static ACTITEM *aiptr, *afaiptr, *grptr;       /* pointers to action items */
        !            58: extern char *curfilnm;                         /* name of current ifile */
        !            59: 
        !            60: #if TRVEC
        !            61: static TVASSIGN *tvslotn,              /* ptr to last  in list of tv slots */
        !            62:                *slotptr;               /* temp for traversing list         */
        !            63: #endif
        !            64: 
        !            65: static int tempi;                              /* temporary int */
        !            66: /*eject*/
        !            67: %}
        !            68: /*eject*/
        !            69: %token <sptr>  NAME    2       /* ld directives and their component tokens */
        !            70: %token <lptr>  LONGINT 3
        !            71: %token <ivalue> INT    4
        !            72: %token <ivalue> ALIGN  5
        !            73: %token <ivalue> DOT    6
        !            74: %token <ivalue> LEN    7
        !            75: %token <ivalue> MEMORY 8
        !            76: %token <ivalue> ORG    9
        !            77: %token <ivalue> REGIONS        10
        !            78: %token <ivalue> SECTIONS       11
        !            79: %token <ivalue>        PHY     12
        !            80: 
        !            81: %token <ivalue> AND    13      /* operators */
        !            82: %token <ivalue> ANDAND 14
        !            83: %token <ivalue> BNOT   15      /* bitwise NOT "~" */
        !            84: %token <ivalue> COLON  16
        !            85: %token <ivalue> COMMA  17
        !            86: %token <ivalue> DIV    18
        !            87: %token <ivalue> EQ     19
        !            88: %token <ivalue> EQEQ   20
        !            89: %token <ivalue> GE     21
        !            90: %token <ivalue> GT     23
        !            91: %token <ivalue> LBRACE 24
        !            92: %token <ivalue> LE     26
        !            93: %token <ivalue> LPAREN 27
        !            94: %token <ivalue> LSHIFT 28
        !            95: %token <ivalue> LT     29
        !            96: %token <ivalue> MINUS  30
        !            97: %token <ivalue> MULT   31
        !            98: %token <ivalue> NE     32
        !            99: %token <ivalue> NOT    33
        !           100: %token <ivalue> OR     34
        !           101: %token <ivalue> OROR   35
        !           102: %token <ivalue> PC     36
        !           103: %token <ivalue> PLUS   37
        !           104: %token <ivalue> RBRACE 38
        !           105: %token <ivalue> RPAREN 39
        !           106: %token <ivalue> RSHIFT 40
        !           107: %token <ivalue> SEMICOL        41
        !           108:                        /* operator assignments */
        !           109: %token <ivalue> DIVEQ  42
        !           110: %token <ivalue> MINUSEQ        43
        !           111: %token <ivalue> MULTEQ 44
        !           112: %token <ivalue> PLUSEQ 45
        !           113: 
        !           114: %token <sptr>  FILENAME        46
        !           115: %token <ivalue> TV     47
        !           116: %token <ivalue> SPARE  48
        !           117: 
        !           118: %token <ivalue> DSECT  49
        !           119: %token <ivalue> NOLOAD         50
        !           120: %token <ivalue> COPY   51
        !           121: %token <ivalue> INFO   52
        !           122: 
        !           123: %token <ivalue> BLOCK  53
        !           124: 
        !           125: %token <ivalue> UMINUS 54
        !           126: %token <ivalue> GROUP  55
        !           127: %token <ivalue> RANGE  56
        !           128: %token <ivalue> ASSIGN 57
        !           129: 
        !           130: 
        !           131: 
        !           132: 
        !           133: %type <enode>  assnment        /* link value types with nonterminals */
        !           134: %type <ivalue> assnop
        !           135: %type <ivalue> attr
        !           136: %type <enode>  ename
        !           137: %type <enode>  expr
        !           138: %type <sptr>   filename
        !           139: %type <ivalue> fillspc
        !           140: %type <aitem>  flgstmt2
        !           141: %type <ivalue> inclspc
        !           142: %type <ivalue> opt_attr
        !           143: %type <lptr>   opt_block
        !           144: %type <lptr>   opt_org
        !           145: %type <lptr>   opt_aln
        !           146: %type <ivalue> opt_type
        !           147: %type <enode>  term
        !           148: %type <lptr>   vaddr
        !           149: 
        !           150: 
        !           151: 
        !           152: 
        !           153: %right EQ PLUSEQ MINUSEQ MULTEQ DIVEQ
        !           154: %left OROR
        !           155: %left ANDAND
        !           156: %left OR
        !           157: %left AND
        !           158: %binary EQEQ NE GT LT LE GE
        !           159: %left LSHIFT RSHIFT
        !           160: %left PLUS MINUS
        !           161: %left MULT DIV PC
        !           162: %right NOT BNOT
        !           163: %left LPAREN
        !           164: 
        !           165: 
        !           166: 
        !           167: %union {
        !           168:        int ivalue;     /* yylval values */
        !           169:        char *sptr;
        !           170:        long *lptr;
        !           171: 
        !           172:        ACTITEM *aitem; /* nonterminal values */
        !           173:        ENODE   *enode;
        !           174:        }
        !           175: /*eject*/
        !           176: %%
        !           177: 
        !           178: wholefile:     cmds = ;
        !           179: 
        !           180: cmds:          cmds cmd
        !           181:                |               /* empty */
        !           182:                = ;
        !           183: 
        !           184: cmd:           regspecs
        !           185:                | memspecs
        !           186:                | tvspecs
        !           187:                | secspecs
        !           188:                | assnment = {
        !           189:                        bldexp($1, &explist);
        !           190:                        }
        !           191:                | filename = {
        !           192:                        filespec($1);
        !           193:                        }
        !           194:                | flagstmt
        !           195:                | error = {
        !           196:                        for( tempi = lineno; tempi == lineno; )
        !           197:                                yychar = yylex();
        !           198:                        yyerrok;
        !           199:                        yyclearin;
        !           200:                        }
        !           201:                ;
        !           202: /*eject*/
        !           203: regspecs:      REGIONS LBRACE reglist RBRACE   = {
        !           204: #if USEREGIONS == 0
        !           205:                        yyerror("REGIONS command not allowed in a %s load", SGS);
        !           206: #endif
        !           207:                        }
        !           208:                ;
        !           209: 
        !           210: reglist:       rgnspc
        !           211:                | reglist rgnspc   = ;
        !           212: 
        !           213: rgnspc:                NAME COLON ORG EQ LONGINT com LEN EQ LONGINT com vaddr = {
        !           214:                        long *orgp, *lenp, *vaddrp, vzero;
        !           215:                        REGION *rgnp;
        !           216:                        orgp = $5;
        !           217:                        lenp = $9;
        !           218:                        if (*lenp <= 0)
        !           219:                                yyerror("region %s has invalid length",$1);
        !           220:                        if ( (vaddrp = $11) == NULL )
        !           221:                                vzero = *orgp;
        !           222:                        else
        !           223:                                vzero = *orgp - *vaddrp;
        !           224:                        if ( (vzero & 0xfL) != 0 ) {
        !           225:                                yyerror("virtual 0 (paddr %.1lx) of region %s is not a multiple of 16",
        !           226:                                        vzero, $1);
        !           227:                                vzero &= ~0xfL;
        !           228:                                }
        !           229:                        rgnp = (REGION *) myalloc(sizeof(REGION));
        !           230:                        rgnp->rgorig = *orgp;
        !           231:                        rgnp->rglength = *lenp;
        !           232:                        rgnp->rgvaddr = (vaddrp == NULL) ? 0L : *vaddrp;
        !           233:                        if( (rgnp->rgvaddr + rgnp->rglength) > 0x10000L ) {
        !           234:                                yyerror("addresses of region %s (vaddr=%.1lx  len=%.1lx) exceed 64K",
        !           235:                                        $1, rgnp->rgvaddr, *lenp);
        !           236:                                rgnp->rglength = 0x10000L - rgnp->rgvaddr;
        !           237:                                }
        !           238:                        strncpy( rgnp->rgname, $1, 8 );
        !           239:                        listadd(l_REG, &reglist, rgnp);
        !           240:                        }
        !           241:                | error = {
        !           242:                        yyerror("REGIONS specification ignored");
        !           243:                        }
        !           244:                ;
        !           245: 
        !           246: com:           COMMA
        !           247:                |               /* empty */
        !           248:                = ;
        !           249: 
        !           250: vaddr:         DOT EQ LONGINT = {
        !           251:                        if ( *(long *) $3 > 0xffffL ) {
        !           252:                                yyerror("virtual address %.1lx exceeds 0xffff: truncated to %.1lx",
        !           253:                                        *(long *) $3, *(long *) $3 & 0xffffL);
        !           254:                                *(long *) $3 &= 0xffffL;
        !           255:                                }
        !           256:                        $$ = $3;
        !           257:                        }
        !           258:                |               /* empty */
        !           259:                = {
        !           260:                        $$ = NULL;
        !           261:                        }
        !           262:                ;
        !           263: /*eject*/
        !           264: memspecs:      MEMORY LBRACE memlist RBRACE  = 
        !           265:                ;
        !           266: 
        !           267: memlist:       memspc
        !           268:                | memlist memspc = ;
        !           269: 
        !           270: memspc:                NAME opt_attr COLON ORG EQ LONGINT com LEN EQ LONGINT com = {
        !           271:                        long *orgp, *lenp;
        !           272:                        MEMTYPE *memp;
        !           273:                        orgp = $6;
        !           274:                        lenp = $10;
        !           275:                        memp = (MEMTYPE *) myalloc(sizeof(MEMTYPE));
        !           276:                        memp->mtorig = *orgp;
        !           277:                        memp->mtlength = *lenp;
        !           278:                        memp->mtattr = $2;
        !           279:                        strncpy( memp->mtname, $1, 8 );
        !           280:                        listadd(l_MEM, &memlist, memp);
        !           281:                        }
        !           282:                | error = {
        !           283:                        yyerror("MEMORY specification ignored");
        !           284:                        }
        !           285:                ;
        !           286:        
        !           287: opt_attr:      attr = {
        !           288:                        $$ = $1;
        !           289:                        }
        !           290:                | = {                   /* empty */
        !           291:                        $$ = att_R | att_W | att_X | att_I;
        !           292:                        }
        !           293:                ;
        !           294: 
        !           295: attr:          LPAREN NAME RPAREN  =  { 
        !           296:                        int attflgs;
        !           297:                        char *p;
        !           298:                        attflgs = 0;
        !           299:                        for( p = $2; *p; p++ )
        !           300:                                switch (*p) {
        !           301:                                case 'R': attflgs |= att_R; break;
        !           302:                                case 'W': attflgs |= att_W; break;
        !           303:                                case 'X': attflgs |= att_X; break;
        !           304:                                case 'I': attflgs |= att_I; break;
        !           305:                                default:  yyerror("bad attribute value in MEMORY directive: %c", *p);
        !           306:                                }
        !           307:                        $$ = attflgs;
        !           308:                        }
        !           309:                ;
        !           310: /*eject*/
        !           311: tvspecs:       TV opt_long LBRACE tvlist RBRACE tvfill = {
        !           312: #if TRVEC
        !           313:                        int length;
        !           314: 
        !           315:                        tvspec.tvinflnm = curfilnm;
        !           316:                        tvspec.tvinlnno = lineno;
        !           317: 
        !           318:                        length = 0;
        !           319:                        for( slotptr = tvslot1; slotptr != NULL; slotptr = slotptr->nxtslot ) {
        !           320:                                TVASSIGN *slotptr2;
        !           321:                                length = max(length, slotptr->slot);
        !           322:                                for (slotptr2 = tvslot1; slotptr2 != slotptr; slotptr2 = slotptr2->nxtslot )
        !           323:                                        if (slotptr2->slot == slotptr->slot) {
        !           324:                                                lderror(1,0,NULL,
        !           325:                                                "function %s assigned to tv slot %d which is already in use", slotptr->funname, slotptr->slot);
        !           326:                                                break;
        !           327:                                                }
        !           328:                                }
        !           329:                        if( tvspec.tvlength > 0 ) {
        !           330:                                if( length > tvspec.tvlength ) {
        !           331:                                        yyerror("ASSIGN slot %d exceeds total TV size of %d",
        !           332:                                                length, tvspec.tvlength);
        !           333:                                        tvspec.tvlength = length;
        !           334:                                        }
        !           335:                                if( tvspec.tvrange[1] > tvspec.tvlength ) {
        !           336:                                        yyerror("RANGE value %d exceeds total TV size of %d",
        !           337:                                                tvspec.tvrange[1], tvspec.tvlength);
        !           338:                                        tvspec.tvlength = tvspec.tvrange[1];
        !           339:                                        }
        !           340:                                }
        !           341:                        else
        !           342:                                tvspec.tvlength = max(length, tvspec.tvrange[1]);
        !           343: #else
        !           344:                        yyerror("usage of unimplemented syntax");
        !           345: #endif
        !           346:                        }
        !           347:                ;
        !           348: 
        !           349: tvlist:                SPARE EQ LONGINT = {
        !           350: #if TRVEC
        !           351:                        tvspec.tvosptr = (OUTSECT *) ((unsigned) *(long *) $3);
        !           352: #else
        !           353:                        yyerror("usage of unimplemented syntax");
        !           354: #endif
        !           355:                        }
        !           356:                | tvdirlist
        !           357:                ;
        !           358: 
        !           359: tvdirlist:     tvdir tvdirlist
        !           360:                |                       /* empty */
        !           361:                ;
        !           362: 
        !           363: tvdir:         LEN EQ LONGINT = {
        !           364: #if TRVEC
        !           365:                        if( tvspec.tvlength > 0 )
        !           366:                                yyerror("illegal multiple LENGTH fields in the TV directive");
        !           367:                        tvspec.tvlength = (int) (*(long *) $3);
        !           368: #else
        !           369:                        yyerror("usage of unimplemented syntax");
        !           370: #endif
        !           371:                        }
        !           372:                | RANGE LPAREN LONGINT COMMA LONGINT RPAREN = {
        !           373: #if TRVEC
        !           374:                        if( tvspec.tvrange[1] > 0 )
        !           375:                                yyerror("illegal multiple RANGE fields in the TV directive");
        !           376:                        if( tvspec.tvrange[0] < 0 || tvspec.tvrange[0] > tvspec.tvrange[1] )
        !           377:                                yyerror("illegal RANGE syntax: r[0]<0 or r[0]>r[1]");
        !           378:                        else {
        !           379:                                tvspec.tvrange[0] = (int) (*(long *) $3);
        !           380:                                tvspec.tvrange[1] = (int) (*(long *) $5);
        !           381:                                }
        !           382: #else
        !           383:                        yyerror("usage of unimplemented syntax");
        !           384: #endif
        !           385:                        }
        !           386:                | ASSIGN LPAREN slotlist RPAREN
        !           387:                ;
        !           388: 
        !           389: tvfill :       EQ NAME = {
        !           390: #if TRVEC
        !           391: #if FLEXNAMES
        !           392:                        tvspec.tvfnfill = savefn($2);
        !           393: #else
        !           394:                        strncpy(tvspec.tvfnfill, $2, 8 );
        !           395: #endif
        !           396: #else
        !           397:                        yyerror("usage of unimplemented syntax");
        !           398: #endif
        !           399:                        }
        !           400:                |                       /* empty */
        !           401:                ;
        !           402: 
        !           403: slotlist:      slotspec
        !           404:                | slotlist com slotspec
        !           405:                |               /* empty */
        !           406:                ;
        !           407: slotspec:      NAME EQ LONGINT = {
        !           408: #if TRVEC
        !           409:                        if( (int) (*(long *) $3) == 0 )
        !           410:                                yyerror("illegal ASSIGN slot number (0)");
        !           411:                        if( tvslot1 == NULL )
        !           412:                                tvslot1 = tvslotn = (TVASSIGN *) myalloc(sizeof(TVASSIGN));
        !           413:                        else
        !           414:                                tvslotn = tvslotn->nxtslot = (TVASSIGN *) myalloc(sizeof(TVASSIGN));
        !           415: #if FLEXNAMES
        !           416:                        tvslotn->funname = savefn($1);
        !           417: #else
        !           418:                        strncpy(tvslotn->funname, $1, 8);
        !           419: #endif
        !           420:                        tvslotn->slot = (int) (*(long *) $3);
        !           421:                        tvslotn->nxtslot = NULL;
        !           422: #else
        !           423:                        yyerror("usage of unimplemented syntax");
        !           424: #endif
        !           425:                }
        !           426:                ;
        !           427: 
        !           428: opt_long :     LONGINT = {
        !           429:                        long org;
        !           430:                        org = *(long *) $1;
        !           431: #if TRVEC
        !           432:                        chktvorg(org, &(tvspec.tvbndadr));
        !           433: #endif
        !           434:                        }
        !           435:                |               /* empty */
        !           436:                ;
        !           437: /*eject*/
        !           438: secspecs:      SECTIONS LBRACE sglist RBRACE  = 
        !           439:                ;
        !           440: 
        !           441: sglist:                sec_or_grp
        !           442:                | sglist com sec_or_grp
        !           443:                ;
        !           444: 
        !           445: sec_or_grp:    scnspc
        !           446:                | groupspc
        !           447:                | flgstmt2
        !           448:                ;
        !           449: 
        !           450: seclist:       scnspc
        !           451:                | seclist com scnspc 
        !           452:                ;
        !           453: 
        !           454: groupspc:      grprfx LBRACE seclist RBRACE inclspc = {
        !           455:                        listadd(l_AI,&bldoutsc,grptr);
        !           456:                        grptr = NULL;
        !           457:                        }
        !           458:                ;
        !           459: 
        !           460: grprfx:                GROUP opt_org opt_aln opt_block COLON = {
        !           461:                        if ( $2 != NULL && $3 != NULL )
        !           462:                                yyerror("bonding excludes alignment");
        !           463:                        grptr = dfnscngrp(AIDFNGRP, (long *)$2, (long *)$3, (long *)$4);
        !           464:                        strncpy( grptr->dfnscn.ainame, "*group*", 8 );
        !           465:                        }
        !           466:                ;
        !           467: 
        !           468: flgstmt2:      MINUS NAME = {
        !           469:                        char *fp;
        !           470:                        fp = $2;
        !           471:                        if (fp[0] == 'l')       /* library flag */
        !           472:                                library(fp);
        !           473:                        else
        !           474:                                yyerror("bad flag value in SECTIONS directive: -%s", $2);
        !           475:                        }
        !           476:                ;
        !           477: 
        !           478: scnspc:                scnprfx LBRACE scnstmts RBRACE fillspc inclspc = {
        !           479:                        if (aiptr == NULL)
        !           480:                                goto scnerr;
        !           481:                        aiptr->dfnscn.aifill = $5;
        !           482:                        aiptr->dfnscn.aifillfg = fillflag;
        !           483:                        listadd(l_AI,grptr ? &grptr->dfnscn.sectspec : &bldoutsc,aiptr);
        !           484:                        if (grptr && $6)
        !           485:                                yyerror("can not specify an owner for section within a group");
        !           486:                        aiptr = NULL;
        !           487:                }
        !           488:                | error = {
        !           489:                        if (aiptr)
        !           490:                                yyerror("section %s not built", aiptr->dfnscn.ainame);
        !           491:                scnerr:
        !           492:                        aiptr = NULL;
        !           493:                        }
        !           494:                ;
        !           495: 
        !           496: scnprfx:       NAME opt_org opt_aln opt_block opt_type COLON = {
        !           497:                        secnum++;
        !           498:                        if ( OKSCNNAME($1) == 0 )
        !           499:                                yyerror("%s is a reserved section name", $1);
        !           500:                        if ( $2 != NULL && $3 != NULL )
        !           501:                                yyerror("bonding excludes alignment");
        !           502:                        aiptr = dfnscngrp(AIDFNSCN, (long *)$2, (long *)$3, (long *)$4);
        !           503:                        if (grptr && aiptr->dfnscn.aibndadr != -1L)
        !           504:                                yyerror("can not bond a section within a group");
        !           505:                        if (grptr && aiptr->dfnscn.aialign != 0L)
        !           506:                                yyerror("can not align a section within a group");
        !           507:                        aiptr->dfnscn.aisctype = $5;
        !           508:                        strncpy( aiptr->dfnscn.ainame, $1, 8 );
        !           509:                        }
        !           510:                ;
        !           511: 
        !           512: opt_block:     BLOCK LPAREN LONGINT RPAREN = {
        !           513:                        $$ = $3;
        !           514:                        }
        !           515:                | = {                   /* empty */
        !           516:                        $$ = NULL;
        !           517:                        }
        !           518:                ;
        !           519: 
        !           520: opt_org:       LONGINT   = {
        !           521:                        $$ = $1;
        !           522:                        }
        !           523:                | = {                   /* empty */
        !           524:                        $$ = NULL;
        !           525:                        }
        !           526:                ;
        !           527: 
        !           528: opt_aln:       ALIGN LPAREN LONGINT RPAREN = {
        !           529:                        $$ = $3;
        !           530:                        }
        !           531:                | = {                   /* empty */
        !           532:                        $$ = NULL;
        !           533:                        }
        !           534:                ;
        !           535: 
        !           536: opt_type:      LPAREN DSECT RPAREN = {
        !           537:                        $$ = STYP_DSECT;
        !           538:                        }
        !           539:                | LPAREN NOLOAD RPAREN = {
        !           540:                        $$ = STYP_NOLOAD;
        !           541:                        }
        !           542:                | LPAREN COPY RPAREN = {
        !           543:                        $$ = STYP_COPY | STYP_DSECT;
        !           544:                        }
        !           545:                | LPAREN INFO RPAREN = {
        !           546:                        $$ = STYP_INFO | STYP_DSECT;
        !           547:                        }
        !           548:                | = {                   /* empty */
        !           549:                        $$ = STYP_REG;
        !           550:                        }
        !           551:                ;
        !           552: 
        !           553: scnstmts:      scnstmt
        !           554:                | scnstmts com scnstmt
        !           555:                |                       /* empty */
        !           556:                ;
        !           557: 
        !           558: scnstmt:       fname insecspc    
        !           559:                | flgstmt2 = {
        !           560:                        bldadfil( ((ACTITEM *) ldfilist.tail)->ldlbry.aifilnam, aiptr );
        !           561:                        }
        !           562:                | assnment   = {
        !           563:                        bldexp($1,&aiptr->dfnscn.sectspec);
        !           564:                        }
        !           565:                | error = {
        !           566:                        in_y_exp = 0;
        !           567:                        yyerror("statement ignored");
        !           568:                        for( tempi = lineno; ((int)yychar > 0) && (tempi == lineno) ; )
        !           569:                                yychar = yylex();
        !           570:                        if ((int) yychar <= 0)
        !           571:                                lderror(2,0,NULL, "unexpected EOF");
        !           572:                        yyerrok;
        !           573:                        yyclearin;
        !           574:                        }
        !           575:                ;
        !           576: 
        !           577: fname:         filename = {
        !           578:                        fnamptr = savefn($1);
        !           579:                        nsecspcs = 0;
        !           580:                        bldldfil(fnamptr,0);
        !           581:                        afaiptr = bldadfil(fnamptr,aiptr);
        !           582:                        }
        !           583:                ;
        !           584: insecspc:      LPAREN inseclist RPAREN fillspc = {
        !           585:                        afaiptr->adfile.ainadscs = nsecspcs;
        !           586:                        afaiptr->adfile.aifilflg = fillflag;
        !           587:                        afaiptr->adfile.aifill2 = $4;
        !           588:                        }
        !           589:                |                       /* empty */
        !           590:                ;
        !           591: 
        !           592: inseclist:     NAME = {
        !           593:                        nsecspcs++;
        !           594:                        bldadscn($1,fnamptr,aiptr);
        !           595:                        }
        !           596:                | inseclist com NAME = {
        !           597:                        nsecspcs++;
        !           598:                        bldadscn($3,fnamptr,aiptr);
        !           599:                        }
        !           600:                ;
        !           601: 
        !           602: inclspc:       GT NAME = {
        !           603:                        if (grptr)
        !           604:                                strncpy( grptr->dfnscn.aiowname, $2, 8 );
        !           605:                        else
        !           606:                                strncpy( aiptr->dfnscn.aiowname, $2, 8 );
        !           607:                        $$ = 1;
        !           608:                        }
        !           609:                | GT attr = {
        !           610:                        if (grptr)
        !           611:                                grptr->dfnscn.aiattown = $2;
        !           612:                        else
        !           613:                                aiptr->dfnscn.aiattown = $2;
        !           614:                        $$ = 1;
        !           615:                        }
        !           616:                | = {                           /* empty */ 
        !           617:                        $$ = 0;
        !           618:                        }
        !           619:                ;
        !           620: 
        !           621: fillspc:       EQ LONGINT = {
        !           622:                        fillflag = 1;
        !           623:                        $$ = (int) (*(long *)$2);
        !           624:                        }
        !           625:                | = {                           /* empty */
        !           626:                        fillflag = 0;
        !           627:                        $$ = 0;
        !           628:                        }
        !           629:                | EQ error = {
        !           630:                        yyerror("bad fill value");
        !           631:                        fillflag = 0;
        !           632:                        yyerrok;
        !           633:                        yyclearin;
        !           634:                        $$ = 0;
        !           635:                        }
        !           636:                ;
        !           637: /*eject*/
        !           638: assnment:      ename assnop expr exend = {
        !           639:                        in_y_exp = 0;
        !           640:                        if ( $2 == EQ )
        !           641:                                $$ = buildtree(EQ, $1, $3);
        !           642:                        else {
        !           643:                                ENODE *p,*ndp;
        !           644:                                ndp = buildtree($2,$1,$3);
        !           645:                                p = (ENODE *) myalloc(sizeof(ENODE));
        !           646:                                *p = *$1;
        !           647:                                $$ = buildtree(EQ,p,ndp);
        !           648:                                }
        !           649:                        }
        !           650:                ;
        !           651: 
        !           652: assnop:                DIVEQ =         { $$ = DIV;     in_y_exp = TRUE; }
        !           653:                | EQ =          { $$ = EQ;      in_y_exp = TRUE; }
        !           654:                | MINUSEQ =     { $$ = MINUS;   in_y_exp = TRUE; }
        !           655:                | MULTEQ =      { $$ = MULT;    in_y_exp = TRUE; }
        !           656:                | PLUSEQ =      { $$ = PLUS;    in_y_exp = TRUE; }
        !           657:                ;
        !           658: 
        !           659: expr:          expr PLUS expr = {
        !           660:                        bop:
        !           661:                                $$ = buildtree($2,$1,$3);
        !           662:                        }
        !           663:                | expr MINUS expr = { goto bop; }
        !           664:                | expr MULT expr = { goto bop; }
        !           665:                | expr DIV expr = { goto bop; }
        !           666:                | expr PC expr = { goto bop; }
        !           667:                | expr RSHIFT expr = { goto bop; }
        !           668:                | expr LSHIFT expr = { goto bop; }
        !           669:                | expr AND expr = { goto bop; }
        !           670:                | expr OR expr = { goto bop; }
        !           671:                | expr GT expr = { goto bop; }
        !           672:                | expr LT expr = { goto bop; }
        !           673:                | expr GE expr = { goto bop; }
        !           674:                | expr LE expr = { goto bop; }
        !           675:                | expr NE expr = { goto bop; }
        !           676:                | expr EQEQ expr = { goto bop; }
        !           677:                | expr ANDAND expr = { goto bop; }
        !           678:                | expr OROR expr = { goto bop; }
        !           679:                | term = {
        !           680:                        $$ = $1;
        !           681:                        }
        !           682:                ;
        !           683: 
        !           684: exend:         SEMICOL
        !           685:                | COMMA  
        !           686:                | error = {
        !           687:                        yyerror ("semicolon required after expression");
        !           688:                        }
        !           689:                ;
        !           690: 
        !           691: term:          LONGINT = {
        !           692:                        $$ = cnstnode(*(long *) $1);
        !           693:                        }
        !           694:                | ename = {
        !           695:                        $$ = $1;
        !           696:                        }
        !           697:                | MINUS term = {
        !           698:                        $$ = buildtree(UMINUS,$2,NULL);
        !           699:                        }
        !           700:                | NOT term = {
        !           701:                        $$ = buildtree($1,$2,NULL);
        !           702:                        }
        !           703:                | BNOT term = {
        !           704:                        $$ = buildtree(BNOT,$1,NULL);
        !           705:                        }
        !           706:                | ALIGN LPAREN expr RPAREN = {
        !           707:                        $$ = buildtree($1,$3,NULL);
        !           708:                        }
        !           709:                | PHY LPAREN ename RPAREN = {
        !           710:                        $$ = buildtree($1,$3,NULL);
        !           711:                        }
        !           712:                | LPAREN expr RPAREN = {
        !           713:                        $$ = $2;
        !           714:                        }
        !           715:                ;
        !           716: 
        !           717: ename:         NAME =  {
        !           718:                        $$ = symnode($1);
        !           719:                        }
        !           720:                | DOT = {
        !           721:                        $$ = symnode(NULL);
        !           722:                        }
        !           723:                ;
        !           724: /*eject*/
        !           725: filename:      NAME = {
        !           726:                        $$ = $1;
        !           727:                        }
        !           728:                | FILENAME = {
        !           729:                        $$ = $1;
        !           730:                        }
        !           731:                ;
        !           732: /*eject*/
        !           733: flagstmt:      MINUS filename  = {
        !           734:                        pflags($2, TRUE);
        !           735:                        }
        !           736:                ;
        !           737: %%
        !           738: /*eject*/
        !           739: /*VARARGS*/
        !           740: yyerror(format, a1, a2, a3, a4)
        !           741: char *format;
        !           742: {
        !           743: 
        !           744: /*
        !           745:  * Issue a parsing error message
        !           746:  */
        !           747: 
        !           748:        char *p;
        !           749: 
        !           750:        p = sname(curfilnm);    /* strip off directories from path name */
        !           751: 
        !           752: /*
        !           753:  * For any purely YACC-generated error, also print out the current
        !           754:  * line, up to the point of the error
        !           755:  */
        !           756: 
        !           757:        if( strcmp(format, "syntax error") == 0 )
        !           758:                lderror(1, lineno, p, "%s : scanned line = (%s)", format, inline, a1, a2 );
        !           759:        else
        !           760:                lderror(1, lineno, p, format, a1, a2, a3, a4);
        !           761: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.