Annotation of researchv9/jtools/src/pi/gram.y, revision 1.1

1.1     ! root        1: %{
        !             2: #include "gram.h"
        !             3: #include "expr.pub"
        !             4: #include "bpts.pub"
        !             5: #include <ctype.h>
        !             6: int LexIndex;
        !             7: int LexGoal;
        !             8: struct Expr *CurrentExpr;
        !             9: char *LexString;
        !            10: char *yyerr;           /* yacc doesn't use this */
        !            11: long yyres;
        !            12: char Token[128];
        !            13: int DotDot;
        !            14: Expr *E_IConst(long), *E_DConst(double);
        !            15: %}
        !            16: 
        !            17: %union {
        !            18:        char            cc;
        !            19:        long            ll;
        !            20:        char            ss[32];
        !            21:        struct Expr     *ee;
        !            22:        double          dd;
        !            23: }
        !            24: 
        !            25: %token G_EXPR G_DOTEQ_CONEX G_DOLEQ_CONEX G_CONEX G_DOTDOT
        !            26: %token ICONST, ID, PCENT, EQUAL, SLASH, DOLLAR, SIZEOF, TYPEOF, QMARK, SEMI
        !            27: %token UNOP, STAR, PLUS, MINUS, AMPER, ARROW, DOT, LB, LP, COMMA, ERROR, RB, RP
        !            28: %token PLUSPLUS, MINUSMINUS, EQUALEQUAL, GREATER, LESS, BAR, BARBAR
        !            29: %token AMPERAMPER, HAT, TILDE, GREATEREQUAL, LESSEQUAL, FABS
        !            30: %token GREATERGREATER, LESSLESS, BANG, BANGEQUAL, DCONST, LC, RC, DOTDOT
        !            31: 
        !            32: %type <dd> DCONST
        !            33: %type <ll> ICONST
        !            34: %type <ss> ID
        !            35: %type <ee> expr, list, conex
        !            36: %type <cc> UNOP, STAR, PLUS, MINUS, AMPER, ARROW, DOT, LB, LP, COMMA, ERROR, SLASH
        !            37: %type <cc> EQUAL, PCENT, QMARK, SEMI
        !            38: %type <cc> PLUSPLUS, MINUSMINUS, EQUALEQUAL, GREATER, LESS, BAR, BARBAR
        !            39: %type <cc> AMPERAMPER, HAT, TILDE, GREATEREQUAL, LESSEQUAL
        !            40: %type <cc> GREATERGREATER, LESSLESS, BANG, BANGEQUAL, FABS, LC, RC, DOTDOT
        !            41: 
        !            42: %left DOTDOT
        !            43: %left COMMA
        !            44: %right EQUAL
        !            45: %left BARBAR
        !            46: %left AMPERAMPER
        !            47: %left BAR
        !            48: %left HAT
        !            49: %left AMPER
        !            50: %left EQUALEQUAL BANGEQUAL
        !            51: %left LESS GREATER LESSEQUAL GREATEREQUAL
        !            52: %left LESSLESS GREATERGREATER
        !            53: %left PLUS MINUS
        !            54: %left STAR SLASH PCENT
        !            55: %left SIZEOF TYPEOF BANG TILDE
        !            56: %right UNOP
        !            57: %left ARROW DOT LB LP
        !            58: 
        !            59: %%
        !            60: 
        !            61: start: G_EXPR   { DotDot=0; } expr SEMI        { yyres = (long) $3;  }
        !            62: |      G_DOTDOT { DotDot=1; } expr SEMI        { yyres = (long) $3;  }
        !            63: |      G_DOTEQ_CONEX DOT EQUAL conex SEMI      { yyres = (long) $4; }
        !            64: |      G_DOLEQ_CONEX DOLLAR EQUAL conex SEMI   { yyres = (long) $4; }
        !            65: |      G_CONEX conex SEMI                      { yyres = (long) $2; }
        !            66: 
        !            67: expr:  DOLLAR                  { if( !CurrentExpr){
        !            68:                                        yyerror("$ cannot be used here");
        !            69:                                        YYACCEPT;
        !            70:                                  }
        !            71:                                  $$ = CurrentExpr;
        !            72:                                }
        !            73: |      LC expr RC ID           { $$ = E_Binary( $2, O_ENV, E_Id($4) ); }
        !            74: |      ID                      { $$ = E_Id( $1 ); }
        !            75: |      DCONST                  { $$ = E_DConst( $1 ); }
        !            76: |      ICONST                  { $$ = E_IConst( $1 ); }
        !            77: |      STAR  expr %prec UNOP   { $$ = E_Unary( O_DEREF, $2 ); }
        !            78: |      AMPER expr              { $$ = E_Unary( O_REF, $2 ); }
        !            79: |      SIZEOF expr             { $$ = E_Unary( O_SIZEOF, $2 ); }
        !            80: |      TYPEOF expr             { $$ = E_Unary( O_TYPEOF, $2 ); }
        !            81: |      BANG expr               { $$ = E_Unary( O_LOGNOT, $2 ); }
        !            82: |      MINUS expr %prec UNOP   { $$ = E_Unary( O_MINUS, $2 ); }
        !            83: |      TILDE expr              { $$ = E_Unary( O_1SCOMP, $2 ); }
        !            84: |      expr DOTDOT expr        { if( !DotDot ){
        !            85:                                        yyerror(".. cannot be used here");
        !            86:                                        YYACCEPT;
        !            87:                                  }
        !            88:                                  $$ = E_Binary( $1, O_RANGE, $3 );}
        !            89: |      expr DOT ID             { $$ = E_Binary( $1, O_DOT, E_Id($3)); }
        !            90: |      expr COMMA expr         { $$ = E_Binary( $1, O_COMMA, $3 ); }
        !            91: |      expr EQUAL expr         { $$ = E_Binary( $1, O_ASSIGN, $3 ); }
        !            92: |      expr BARBAR expr        { $$ = E_Binary( $1, O_LOGOR, $3 ); }
        !            93: |      expr AMPERAMPER expr    { $$ = E_Binary( $1, O_LOGAND, $3 ); }
        !            94: |      expr BAR expr           { $$ = E_Binary( $1, O_BITOR, $3 ); }
        !            95: |      expr AMPER expr         { $$ = E_Binary( $1, O_BITAND, $3 ); }
        !            96: |      expr HAT expr           { $$ = E_Binary( $1, O_BITXOR, $3 ); }
        !            97: |      expr EQUALEQUAL expr    { $$ = E_Binary( $1, O_EQ, $3 ); }
        !            98: |      expr BANGEQUAL expr     { $$ = E_Binary( $1, O_NE, $3 ); }
        !            99: |      expr LESS expr          { $$ = E_Binary( $1, O_LT, $3 ); }
        !           100: |      expr GREATER expr       { $$ = E_Binary( $1, O_GT, $3 ); }
        !           101: |      expr LESSEQUAL expr     { $$ = E_Binary( $1, O_LE, $3 ); }
        !           102: |      expr GREATEREQUAL expr  { $$ = E_Binary( $1, O_GE, $3 ); }
        !           103: |      expr GREATERGREATER expr{ $$ = E_Binary( $1, O_RSHIFT, $3 ); }
        !           104: |      expr LESSLESS expr      { $$ = E_Binary( $1, O_LSHIFT, $3 ); }
        !           105: |      expr MINUS expr         { $$ = E_Binary( $1, O_MINUS, $3 ); }
        !           106: |      expr ARROW ID           { $$ = E_Binary( $1, O_ARROW, E_Id($3)); }
        !           107: |      expr PCENT expr         { $$ = E_Binary( $1, O_MOD, $3 ); }
        !           108: |      expr STAR expr          { $$ = E_Binary( $1, O_MULT, $3 ); }
        !           109: |      expr SLASH expr         { $$ = E_Binary( $1, O_DIV, $3 ); }
        !           110: |      expr PLUS expr          { $$ = E_Binary( $1, O_PLUS, $3 ); }
        !           111: |      expr LB expr RB         { $$ = E_Binary( $1, O_INDEX, $3 );}
        !           112: |      ID LP list RP           { $$ = E_Binary( E_Id($1), O_CALL, $3 ); }
        !           113: |      ID LP RP                { $$ = E_Binary( E_Id($1), O_CALL, 0 ); }
        !           114: |      LP expr RP              { $$ = $2; }
        !           115: |      FABS LP expr RP         { $$ = E_Unary( O_FABS, $3 ); }
        !           116: 
        !           117: conex: DOLLAR                  { if( !CurrentExpr){
        !           118:                                        yyerror("no current expression for $");
        !           119:                                        YYACCEPT;
        !           120:                                  }
        !           121:                                  $$ = CurrentExpr;
        !           122:                                }
        !           123: |      ID                      { $$ = E_Id( $1 ); }
        !           124: |      ICONST                  { $$ = E_IConst( $1 ); }
        !           125: |      AMPER conex  %prec UNOP { $$ = E_Unary( O_REF, $2 ); }
        !           126: |      MINUS conex %prec UNOP  { $$ = E_Unary( O_MINUS, $2 ); }
        !           127: |      conex MINUS conex       { $$ = E_Binary( $1, O_MINUS, $3 ); }
        !           128: |      conex PCENT conex       { $$ = E_Binary( $1, O_MOD, $3 ); }
        !           129: |      conex STAR  conex       { $$ = E_Binary( $1, O_MULT, $3 ); }
        !           130: |      conex SLASH conex       { $$ = E_Binary( $1, O_DIV, $3 ); }
        !           131: |      conex PLUS  conex       { $$ = E_Binary( $1, O_PLUS, $3 ); }
        !           132: |      conex LB conex RB       { $$ = E_Binary( $1, O_INDEX, $3 );}
        !           133: |      LP conex RP             { $$ = $2; }
        !           134: 
        !           135: list:  expr    %prec COMMA     { $$ = $1; }
        !           136: |      list COMMA expr         { $$ = E_Binary( $1, O_COMMA, $3 ); } 
        !           137: 
        !           138: %%
        !           139: 
        !           140: #define LOOK (LexString[LexIndex ])
        !           141: #define TAKE (AddToken(), LexString[LexIndex++])
        !           142: #define MORE (LexString[LexIndex+1])
        !           143: #define yc (yylval.cc)
        !           144: #define yd (yylval.dd)
        !           145: #define yl (yylval.ll)
        !           146: #define ys (yylval.ss)
        !           147: #define ishex(x) (isdigit(x) || (x>='a'&&x<='f') || (x>='A'&&x<='F'))
        !           148: #define isoct(x) ( x>='0' && x<='7' )
        !           149: int doyylex();
        !           150: int yyerror(char*);
        !           151: 
        !           152: yylex()
        !           153: {
        !           154:        int token = doyylex();
        !           155: 
        !           156:        return token;
        !           157: }
        !           158: 
        !           159: void AddToken()
        !           160: {
        !           161:        int l = strlen(Token);
        !           162: 
        !           163:        if( l < 64 ){
        !           164:                Token[l] = LOOK;
        !           165:                Token[l+1] = '\0';
        !           166:        }
        !           167: }
        !           168: 
        !           169: doyylex()
        !           170: {
        !           171:        double atof(char*);
        !           172: 
        !           173:        if( LexIndex < 0 ){
        !           174:                LexIndex = 0;
        !           175:                return LexGoal;
        !           176:        }
        !           177:        while( isspace(LOOK) ) TAKE;
        !           178:        Token[0] = '\0';
        !           179:        if( isalpha(LOOK) || LOOK=='_' || LOOK=='$' ){
        !           180:                TAKE;
        !           181:                while( isalnum(LOOK) || LOOK=='_' ) TAKE;
        !           182:                strcpy( ys, Token );
        !           183:                if( !strcmp(ys,"sizeof") ) return SIZEOF;
        !           184:                if( !strcmp(ys,"typeof") ) return TYPEOF;
        !           185:                if( !strcmp(ys,"fabs") ) return FABS;
        !           186:                if( !strcmp(ys,"$") ) return DOLLAR;
        !           187:                return ID;
        !           188:        }
        !           189:        if( LOOK == '\'' ){
        !           190:                TAKE;
        !           191:                if( LOOK == '\\' ){
        !           192:                        TAKE;
        !           193:                        if( MORE != '\'' ) return 0;
        !           194:                        char *trans = "bnftv", *late = "\b\n\f\t\v";
        !           195:                        yl = LOOK;
        !           196:                        for( int i = 0; trans[i]; ++i )
        !           197:                                if( LOOK == trans[i] ) yl = late[i];
        !           198:                        TAKE; TAKE; return ICONST;
        !           199:                }
        !           200:                if( MORE != '\'' ) return 0;
        !           201:                yl = TAKE;
        !           202:                TAKE;
        !           203:                return ICONST;
        !           204:        }
        !           205:        if( LOOK=='0' && (MORE=='x' || MORE=='X') ){
        !           206:                TAKE; TAKE;
        !           207:                if( !ishex(LOOK) ) return 0;
        !           208:                for( yl = 0; ishex(LOOK); TAKE )
        !           209:                    yl = (yl<<4) + (isalpha(LOOK) ? (LOOK|' ')+10-'a' : LOOK-'0');
        !           210:                return ICONST;
        !           211:        }
        !           212:        if( LOOK=='0' ){
        !           213:                for( TAKE, yl = 0; isoct(LOOK); TAKE ) yl = (yl<<3) + LOOK - '0';
        !           214:                goto IorD;
        !           215:        }
        !           216:        if( isdigit(LOOK) ){
        !           217:                for( yl = 0; isdigit(LOOK); TAKE ) yl = yl*10 + LOOK - '0';
        !           218:                goto IorD;
        !           219:        }
        !           220:        if( LOOK == '.' && isdigit(MORE) ) goto Point;
        !           221: #define EAT2(x) {TAKE; TAKE; return x;}
        !           222:        if( LOOK=='.' && MORE=='.' ) EAT2(DOTDOT)
        !           223:        if( LOOK=='-' && MORE=='>' ) EAT2(ARROW)
        !           224:        if( LOOK=='-' && MORE=='-' ) EAT2(MINUSMINUS)
        !           225:        if( LOOK=='+' && MORE=='+' ) EAT2(PLUSPLUS)
        !           226:        if( LOOK=='=' && MORE=='=' ) EAT2(EQUALEQUAL)
        !           227:        if( LOOK=='!' && MORE=='=' ) EAT2(BANGEQUAL)
        !           228:        if( LOOK==':' && MORE=='=' ) EAT2(EQUAL)
        !           229:        if( LOOK=='>' && MORE=='=' ) EAT2(GREATEREQUAL)
        !           230:        if( LOOK=='<' && MORE=='=' ) EAT2(LESSEQUAL)
        !           231:        if( LOOK=='&' && MORE=='&' ) EAT2(AMPERAMPER)
        !           232:        if( LOOK=='|' && MORE=='|' ) EAT2(BARBAR)
        !           233:        if( LOOK=='>' && MORE=='>' ) EAT2(GREATERGREATER)
        !           234:        if( LOOK=='<' && MORE=='<' ) EAT2(LESSLESS)
        !           235:        switch( TAKE ){
        !           236:                case '>' : return GREATER;
        !           237:                case '<' : return LESS;
        !           238:                case '/' : return SLASH;
        !           239:                case '*' : return STAR;
        !           240:                case '+' : return PLUS;
        !           241:                case '-' : return MINUS;
        !           242:                case '.' : return DOT;
        !           243:                case '(' : return LP;
        !           244:                case ')' : return RP;
        !           245:                case '[' : return LB;
        !           246:                case ']' : return RB;
        !           247:                case '&' : return AMPER;
        !           248:                case ',' : return COMMA;
        !           249:                case '%' : return PCENT;
        !           250:                case '=' : return EQUAL;
        !           251:                case ';' : return SEMI;
        !           252:                case '|' : return BAR;
        !           253:                case '^' : return HAT;
        !           254:                case '~' : return TILDE;
        !           255:                case '!' : return BANG;
        !           256:                case '{' : return LC;
        !           257:                case '}' : return RC;
        !           258:                default  : return 0;
        !           259:        }
        !           260: IorD:
        !           261:        if( LOOK=='l' || LOOK=='L' ) return TAKE, ICONST;
        !           262:        if( LOOK=='.' && MORE=='.' ) return ICONST;
        !           263:        if( LOOK=='.' ) goto Point;
        !           264:        if( LOOK=='e' || LOOK=='E' ) goto Exp;
        !           265:        return ICONST;
        !           266: Point:
        !           267:        for( TAKE; isdigit(LOOK); TAKE) {}
        !           268:        if( LOOK!='e' && LOOK!='E' ) goto Double;
        !           269: Exp:
        !           270:        TAKE;
        !           271:        if( LOOK=='+' || LOOK=='-' ) TAKE;
        !           272:        if( !isdigit(LOOK) ) return 0;
        !           273:        while( isdigit(LOOK) ) TAKE;
        !           274: Double:
        !           275:        yd = atof(Token);
        !           276:        return DCONST;  
        !           277: 
        !           278: }

unix.superglobalmegacorp.com

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