URI:
       tdbg.y - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tdbg.y (5611B)
       ---
            1 %{
            2 #include <u.h>
            3 #include <libc.h>
            4 #include <bio.h>
            5 #include <mach.h>
            6 #define Extern extern
            7 #include "acid.h"
            8 %}
            9 
           10 %union
           11 {
           12         Node        *node;
           13         Lsym        *sym;
           14         u64int        ival;
           15         float        fval;
           16         String        *string;
           17 }
           18 
           19 %type <node> expr monexpr term stmnt name args zexpr slist
           20 %type <node> member members mname castexpr idlist
           21 %type <sym> zname
           22 
           23 %left        ';'
           24 %right        '='
           25 %left        Tfmt
           26 %left        Toror
           27 %left        Tandand
           28 %left        '|'
           29 %left        '^'
           30 %left        '&'
           31 %left        Teq Tneq
           32 %left        '<' '>' Tleq Tgeq
           33 %left        Tlsh Trsh
           34 %left        '+' '-'
           35 %left        '*' '/' '%'
           36 %right        Tdec Tinc Tindir '.' '[' '('
           37 
           38 %token <sym>        Tid
           39 %token <ival>        Tconst Tfmt
           40 %token <fval>        Tfconst
           41 %token <string>        Tstring
           42 %token Tif Tdo Tthen Telse Twhile Tloop Thead Ttail Tappend Tfn Tret Tlocal
           43 %token Tcomplex Twhat Tdelete Teval Tbuiltin
           44 
           45 %%
           46 
           47 prog                : 
           48                 | prog bigstmnt
           49                 ;
           50 
           51 bigstmnt        : stmnt
           52                 {
           53                         /* hold on to current command for gc */
           54                         mkvar("_thiscmd")->proc = $1;
           55                         execute($1);
           56                         gc();
           57                         if(interactive && nlcount){
           58                                 Bprint(bout, "acid; ");
           59                                 nlcount = 0;
           60                         }
           61                 }
           62                 | Tfn Tid '(' args ')' zsemi '{' slist '}'
           63                 {
           64                         $2->proc = an(OLIST, $4, $8);
           65                 }
           66                 | Tfn Tid
           67                 {
           68                         $2->proc = nil;
           69                 }
           70                 | Tcomplex name '{' members '}' ';'
           71                 {
           72                         defcomplex($2, $4);
           73                 }
           74                 ;
           75 
           76 zsemi                :
           77                 | ';' zsemi
           78 
           79 members                : member
           80                 | members member
           81                 {
           82                         $$ = an(OLIST, $1, $2);
           83                 }
           84                 ;
           85 
           86 mname                : Tid
           87                 {
           88                         $$ = an(ONAME, ZN, ZN);
           89                         $$->sym = $1;
           90                 }
           91                 ;
           92 
           93 member                : Tconst Tconst mname ';'
           94                 {
           95                         $3->store.u.ival = $2;
           96                         $3->store.fmt = $1;
           97                         $$ = $3;
           98                 }
           99                 | Tconst mname Tconst mname ';'
          100                 {
          101                         $4->store.u.ival = $3;
          102                         $4->store.fmt = $1;
          103                         $4->right = $2;
          104                         $$ = $4;
          105                 }
          106                 | mname Tconst mname ';'
          107                 {
          108                         $3->store.u.ival = $2;
          109                         $3->left = $1;
          110                         $$ = $3;
          111                 }
          112                 | '{' members '}' ';'
          113                 {
          114                         $$ = an(OCTRUCT, $2, ZN);
          115                 }
          116                 ;
          117 
          118 zname                : 
          119                 { $$ = 0; }
          120                 | Tid
          121                 ;
          122 
          123 slist                : stmnt
          124                 | slist stmnt
          125                 {
          126                         $$ = an(OLIST, $1, $2);
          127                 }
          128                 ;
          129 
          130 stmnt                : zexpr ';'
          131                 | '{' slist '}'
          132                 {
          133                         $$ = $2;
          134                 }
          135                 | Tif expr Tthen stmnt
          136                 {
          137                         $$ = an(OIF, $2, $4);
          138                 }
          139                 | Tif expr Tthen stmnt Telse stmnt
          140                 {
          141                         $$ = an(OIF, $2, an(OELSE, $4, $6));
          142                 }
          143                 | Tloop expr ',' expr Tdo stmnt
          144                 {
          145                         $$ = an(ODO, an(OLIST, $2, $4), $6);
          146                 }
          147                 | Twhile expr Tdo stmnt
          148                 {
          149                         $$ = an(OWHILE, $2, $4);
          150                 }
          151                 | Tret expr ';'
          152                 {
          153                         $$ = an(ORET, $2, ZN);
          154                 }
          155                 | Tlocal idlist
          156                 {
          157                         $$ = an(OLOCAL, $2, ZN);
          158                 }
          159                 | Tcomplex Tid name ';'
          160                 {
          161                         $$ = an(OCOMPLEX, $3, ZN);
          162                         $$->sym = $2;
          163                 }
          164                 ;
          165 
          166 idlist                : Tid
          167                 {
          168                         $$ = an(ONAME, ZN, ZN);
          169                         $$->sym = $1;
          170                 }
          171                 | idlist ',' Tid
          172                 {
          173                         $$ = an(ONAME, $1, ZN);
          174                         $$->sym = $3;
          175                 }
          176                 ;
          177 
          178 zexpr                :
          179                 { $$ = 0; }
          180                 | expr
          181                 ;
          182 
          183 expr                : castexpr
          184                 | expr '*' expr
          185                 {
          186                         $$ = an(OMUL, $1, $3); 
          187                 }
          188                 | expr '/' expr
          189                 {
          190                         $$ = an(ODIV, $1, $3);
          191                 }
          192                 | expr '%' expr
          193                 {
          194                         $$ = an(OMOD, $1, $3);
          195                 }
          196                 | expr '+' expr
          197                 {
          198                         $$ = an(OADD, $1, $3);
          199                 }
          200                 | expr '-' expr
          201                 {
          202                         $$ = an(OSUB, $1, $3);
          203                 }
          204                 | expr Trsh expr
          205                 {
          206                         $$ = an(ORSH, $1, $3);
          207                 }
          208                 | expr Tlsh expr
          209                 {
          210                         $$ = an(OLSH, $1, $3);
          211                 }
          212                 | expr '<' expr
          213                 {
          214                         $$ = an(OLT, $1, $3);
          215                 }
          216                 | expr '>' expr
          217                 {
          218                         $$ = an(OGT, $1, $3);
          219                 }
          220                 | expr Tleq expr
          221                 {
          222                         $$ = an(OLEQ, $1, $3);
          223                 }
          224                 | expr Tgeq expr
          225                 {
          226                         $$ = an(OGEQ, $1, $3);
          227                 }
          228                 | expr Teq expr
          229                 {
          230                         $$ = an(OEQ, $1, $3);
          231                 }
          232                 | expr Tneq expr
          233                 {
          234                         $$ = an(ONEQ, $1, $3);
          235                 }
          236                 | expr '&' expr
          237                 {
          238                         $$ = an(OLAND, $1, $3);
          239                 }
          240                 | expr '^' expr
          241                 {
          242                         $$ = an(OXOR, $1, $3);
          243                 }
          244                 | expr '|' expr
          245                 {
          246                         $$ = an(OLOR, $1, $3);
          247                 }
          248                 | expr Tandand expr
          249                 {
          250                         $$ = an(OCAND, $1, $3);
          251                 }
          252                 | expr Toror expr
          253                 {
          254                         $$ = an(OCOR, $1, $3);
          255                 }
          256                 | expr '=' expr
          257                 {
          258                         $$ = an(OASGN, $1, $3);
          259                 }
          260                 | expr Tfmt
          261                 {
          262                         $$ = an(OFMT, $1, con($2));
          263                 }
          264                 ;
          265 
          266 castexpr        : monexpr
          267                 | '(' Tid ')' monexpr
          268                 {
          269                         $$ = an(OCAST, $4, ZN);
          270                         $$->sym = $2;
          271                 }
          272                 ;
          273 
          274 monexpr                : term
          275                 | '*' monexpr 
          276                 {
          277                         $$ = an(OINDM, $2, ZN);
          278                 }
          279                 | '@' monexpr 
          280                 {
          281                         $$ = an(OINDC, $2, ZN);
          282                 }
          283                 | '+' monexpr
          284                 {
          285                         $$ = an(OUPLUS, $2, ZN);
          286                 }
          287                 | '-' monexpr
          288                 {
          289                         $$ = con(0);
          290                         $$ = an(OSUB, $$, $2);
          291                 }
          292                 | Tdec monexpr
          293                 {
          294                         $$ = an(OEDEC, $2, ZN);
          295                 }
          296                 | Tinc monexpr
          297                 {
          298                         $$ = an(OEINC, $2, ZN);
          299                 }
          300                 | Thead monexpr
          301                 {
          302                         $$ = an(OHEAD, $2, ZN);
          303                 }
          304                 | Ttail monexpr
          305                 {
          306                         $$ = an(OTAIL, $2, ZN);
          307                 }
          308                 | Tappend monexpr ',' monexpr
          309                 {
          310                         $$ = an(OAPPEND, $2, $4);
          311                 }
          312                 | Tdelete monexpr ',' monexpr
          313                 {
          314                         $$ = an(ODELETE, $2, $4);
          315                 }
          316                 | '!' monexpr
          317                 {
          318                         $$ = an(ONOT, $2, ZN);
          319                 }
          320                 | '~' monexpr
          321                 {
          322                         $$ = an(OXOR, $2, con(-1));
          323                 }
          324                 | Teval monexpr
          325                 {
          326                         $$ = an(OEVAL, $2, ZN);        
          327                 }
          328                 ;
          329 
          330 term                : '(' expr ')'
          331                 {
          332                         $$ = $2;
          333                 }
          334                 | '{' args '}'
          335                 {
          336                         $$ = an(OCTRUCT, $2, ZN);
          337                 }
          338                 | term '[' expr ']'
          339                 {
          340                         $$ = an(OINDEX, $1, $3);
          341                 }
          342                 | term Tdec
          343                 {
          344                         $$ = an(OPDEC, $1, ZN);
          345                 }
          346                 | term '.' Tid
          347                 {
          348                         $$ = an(ODOT, $1, ZN);
          349                         $$->sym = $3;
          350                 }
          351                 | term Tindir Tid
          352                 {
          353                         $$ = an(ODOT, an(OINDM, $1, ZN), ZN);
          354                         $$->sym = $3;
          355                 }
          356                 | term Tinc
          357                 {
          358                         $$ = an(OPINC, $1, ZN);
          359                 }
          360                 | name '(' args ')'
          361                 {
          362                         $$ = an(OCALL, $1, $3);
          363                 }
          364                 | Tbuiltin name '(' args ')'
          365                 {
          366                         $$ = an(OCALL, $2, $4);
          367                         $$->builtin = 1;
          368                 }
          369                 | name
          370                 | Tconst
          371                 {
          372                         $$ = con($1);
          373                 }
          374                 | Tfconst
          375                 {
          376                         $$ = an(OCONST, ZN, ZN);
          377                         $$->type = TFLOAT;
          378                         $$->store.fmt = 'f';
          379                         $$->store.u.fval = $1;
          380                 }
          381                 | Tstring
          382                 {
          383                         $$ = an(OCONST, ZN, ZN);
          384                         $$->type = TSTRING;
          385                         $$->store.u.string = $1;
          386                         $$->store.fmt = 's';
          387                 }
          388                 | Twhat zname
          389                 {
          390                         $$ = an(OWHAT, ZN, ZN);
          391                         $$->sym = $2;
          392                 }
          393                 ;
          394 
          395 name                : Tid
          396                 {
          397                         $$ = an(ONAME, ZN, ZN);
          398                         $$->sym = $1;
          399                 }
          400                 | Tid ':' name
          401                 {
          402                         $$ = an(OFRAME, $3, ZN);
          403                         $$->sym = $1;
          404                 }
          405                 ;
          406 
          407 args                : zexpr
          408                 | args ','  zexpr
          409                 {
          410                         $$ = an(OLIST, $1, $3);
          411                 }
          412                 ;