1798Speter /* Copyright (c) 1979 Regents of the University of California */ 2798Speter 3798Speter /* 4798Speter * Yacc grammar for UNIX Pascal 5798Speter * 6798Speter * This grammar is processed by the commands in the shell script 7798Speter * "gram" to yield parse tables and semantic routines in the file 8798Speter * "y.tab.c" and a header defining the lexical tokens in "yy.h". 9798Speter * 10798Speter * In order for the syntactic error recovery possible with this 11798Speter * grammar to work, the grammar must be processed by a yacc which 12798Speter * has been modified to fully enumerate possibilities in states 13798Speter * which involve the symbol "error". 14798Speter * The parser used for Pascal also uses a different encoding of 15798Speter * the test entries in the action table which speeds the parse. 16798Speter * A version of yacc which will work for Pascal is included on 17798Speter * the distribution table as "eyacc". 18798Speter * 19798Speter * The "gram" script also makes the following changes to the "y.tab.c" 20798Speter * file: 21798Speter * 22798Speter * 1) Causes yyval to be declared int *. 23798Speter * 24798Speter * 2) Loads the variable yypv into a register as yyYpv so that 25798Speter * the arguments $1, ... are available as yyYpv[1] etc. 26798Speter * This produces much smaller code in the semantic actions. 27798Speter * 28798Speter * 3) Deletes the unused array yysterm. 29798Speter * 30798Speter * 4) Moves the declarations up to the flag line containing 31798Speter * '##' to the file yy.h so that the routines which use 32798Speter * these "magic numbers" don't have to all be compiled at 33798Speter * the same time. 34798Speter * 35798Speter * 5) Creates the semantic restriction checking routine yyEactr 36804Speter * by processing action lines containing `@@'. 37798Speter * 38798Speter * This compiler uses a different version of the yacc parser, a 39798Speter * different yyerror which is called yerror, and requires more 40798Speter * lookahead sets than normally provided by yacc. 41798Speter * 42798Speter * Source for the yacc used with this grammar is included on 43798Speter * distribution tapes. 44798Speter */ 45798Speter 46798Speter /* 47798Speter * TERMINAL DECLARATIONS 48798Speter * 49798Speter * Some of the terminal declarations are out of the most natural 50798Speter * alphabetic order because the error recovery 51798Speter * will guess the first of equal cost non-terminals. 52798Speter * This makes, e.g. YTO preferable to YDOWNTO. 53798Speter */ 54798Speter 55798Speter %term 56798Speter YAND YARRAY YBEGIN YCASE 57798Speter YCONST YDIV YDO YDOTDOT 58798Speter YTO YELSE YEND YFILE 5912932Speter YFOR YFORWARD YPROCEDURE YGOTO 60798Speter YID YIF YIN YINT 61798Speter YLABEL YMOD YNOT YNUMB 62798Speter YOF YOR YPACKED YNIL 6312932Speter YFUNCTION YPROG YRECORD YREPEAT 64798Speter YSET YSTRING YTHEN YDOWNTO 65798Speter YTYPE YUNTIL YVAR YWHILE 66798Speter YWITH YBINT YOCT YHEX 677927Smckusick YCASELAB YILLCH YEXTERN YLAST 68798Speter 69798Speter /* 70798Speter * PRECEDENCE DECLARATIONS 71798Speter * 72798Speter * Highest precedence is the unary logical NOT. 73798Speter * Next are the multiplying operators, signified by '*'. 74798Speter * Lower still are the binary adding operators, signified by '+'. 75798Speter * Finally, at lowest precedence and non-associative are the relationals. 76798Speter */ 77798Speter 78798Speter %binary '<' '=' '>' YIN 79798Speter %left '+' '-' YOR '|' 80798Speter %left UNARYSIGN 81798Speter %left '*' '/' YDIV YMOD YAND '&' 82798Speter %left YNOT 83798Speter 84798Speter %{ 85798Speter /* 86798Speter * GLOBALS FOR ACTIONS 87798Speter */ 88798Speter 89798Speter /* Copyright (c) 1979 Regents of the University of California */ 90798Speter 91*14752Sthien #ifndef lint 92*14752Sthien static char sccsid[] = "@(#)pas.y 1.11 08/19/83"; 93*14752Sthien #endif 94798Speter 95798Speter /* 96798Speter * The following line marks the end of the yacc 97798Speter * Constant definitions which are removed from 98798Speter * y.tab.c and placed in the file y.tab.h. 99798Speter */ 100798Speter ## 101798Speter /* Copyright (c) 1979 Regents of the University of California */ 102798Speter 103*14752Sthien static char sccsid[] = "@(#)pas.y 1.11 08/19/83"; 104798Speter 105798Speter #include "whoami.h" 106798Speter #include "0.h" 107*14752Sthien #include "tree_ty.h" /* must be included for yy.h */ 108798Speter #include "yy.h" 109798Speter #include "tree.h" 110798Speter 111798Speter #ifdef PI 112798Speter #define lineof(l) l 113798Speter #define line2of(l) l 114798Speter #endif 115798Speter 116798Speter %} 117798Speter 118798Speter %% 119798Speter 120798Speter /* 121798Speter * PRODUCTIONS 122798Speter */ 123798Speter 124798Speter goal: 125837Speter prog_hedr decls block '.' 126*14752Sthien = funcend($1.nl_entry, $3.tr_entry, lineof($4.i_entry)); 127798Speter | 128837Speter decls 129798Speter = segend(); 130798Speter ; 131798Speter 132798Speter 133798Speter prog_hedr: 134798Speter YPROG YID '(' id_list ')' ';' 135*14752Sthien = $$.nl_entry = funcbody(funchdr(tree5(T_PROG, lineof($1.i_entry), $2.tr_entry, fixlist($4.tr_entry), TR_NIL))); 136798Speter | 1377953Speter YPROG YID ';' 138*14752Sthien = $$.nl_entry = funcbody(funchdr(tree5(T_PROG, lineof($1.i_entry), $2.tr_entry, TR_NIL, TR_NIL))); 1397953Speter | 140798Speter YPROG error 141798Speter = { 142798Speter yyPerror("Malformed program statement", PPROG); 143798Speter /* 144798Speter * Should make a program statement 145798Speter * with "input" and "output" here. 146798Speter */ 147*14752Sthien $$.nl_entry = funcbody(funchdr(tree5(T_PROG, lineof($1.i_entry), TR_NIL, TR_NIL, TR_NIL))); 148798Speter } 149798Speter ; 150798Speter block: 151798Speter YBEGIN stat_list YEND 152798Speter = { 153*14752Sthien $$.tr_entry = tree3(T_BSTL, lineof($1.i_entry), fixlist($2.tr_entry)); 154*14752Sthien if ($3.i_entry < 0) 155*14752Sthien brerror($1.i_entry, "begin"); 156798Speter } 157798Speter ; 158798Speter 159798Speter 160798Speter /* 161798Speter * DECLARATION PART 162798Speter */ 163798Speter decls: 164798Speter decls decl 165798Speter = trfree(); 166798Speter | 167798Speter decls error 168798Speter = { 169798Speter constend(), typeend(), varend(), trfree(); 170798Speter yyPerror("Malformed declaration", PDECL); 171798Speter } 172798Speter | 173798Speter /* lambda */ 174798Speter = trfree(); 175798Speter ; 176798Speter 177798Speter decl: 178798Speter labels 179798Speter | 180798Speter const_decl 181798Speter = constend(); 182798Speter | 183798Speter type_decl 184798Speter = typeend(); 185798Speter | 186798Speter var_decl 187798Speter = varend(); 188837Speter | 189837Speter proc_decl 190798Speter ; 191798Speter 192798Speter /* 193798Speter * LABEL PART 194798Speter */ 195798Speter 196798Speter labels: 197798Speter YLABEL label_decl ';' 198*14752Sthien = label(fixlist($2.tr_entry), lineof($1.i_entry)); 199798Speter ; 200798Speter label_decl: 201798Speter YINT 202*14752Sthien = $$.tr_entry = newlist($1.i_entry == NIL ? TR_NIL : 203*14752Sthien (struct tnode *) *hash($1.cptr, 1)); 204798Speter | 205798Speter label_decl ',' YINT 206*14752Sthien = $$.tr_entry = addlist($1.tr_entry, $3.i_entry == NIL ? 207*14752Sthien TR_NIL : (struct tnode *) *hash($3.cptr, 1)); 208798Speter ; 209798Speter 210798Speter /* 211798Speter * CONST PART 212798Speter */ 213798Speter 214798Speter const_decl: 215798Speter YCONST YID '=' const ';' 216*14752Sthien = constbeg($1.i_entry), const(lineof($3.i_entry), $2.cptr, 217*14752Sthien $4.tr_entry); 218798Speter | 219798Speter const_decl YID '=' const ';' 220*14752Sthien = const(lineof($3.i_entry), $2.cptr, $4.tr_entry); 221798Speter | 222798Speter YCONST error 223798Speter = { 224*14752Sthien constbeg($1.i_entry); 225798Speter Cerror: 226798Speter yyPerror("Malformed const declaration", PDECL); 227798Speter } 228798Speter | 229798Speter const_decl error 230798Speter = goto Cerror; 231798Speter ; 232798Speter 233798Speter /* 234798Speter * TYPE PART 235798Speter */ 236798Speter 237798Speter type_decl: 238798Speter YTYPE YID '=' type ';' 239*14752Sthien = typebeg($1.i_entry, line2of($2.i_entry)), type(lineof($3.i_entry), $2.cptr, $4.tr_entry); 240798Speter | 241798Speter type_decl YID '=' type ';' 242*14752Sthien = type(lineof($3.i_entry), $2.cptr, $4.tr_entry); 243798Speter | 244798Speter YTYPE error 245798Speter = { 246*14752Sthien typebeg($1.i_entry, line2of($1.i_entry)); 247798Speter Terror: 248798Speter yyPerror("Malformed type declaration", PDECL); 249798Speter } 250798Speter | 251798Speter type_decl error 252798Speter = goto Terror; 253798Speter ; 254798Speter 255798Speter /* 256798Speter * VAR PART 257798Speter */ 258798Speter 259798Speter var_decl: 260798Speter YVAR id_list ':' type ';' 261*14752Sthien = varbeg($1.i_entry, line2of($3.i_entry)), var(lineof($3.i_entry), fixlist($2.tr_entry), $4.tr_entry); 262798Speter | 263798Speter var_decl id_list ':' type ';' 264*14752Sthien = var(lineof($3.i_entry), fixlist($2.tr_entry), $4.tr_entry); 265798Speter | 266798Speter YVAR error 267798Speter = { 268*14752Sthien varbeg($1.i_entry, line2of($1.i_entry)); 269798Speter Verror: 270798Speter yyPerror("Malformed var declaration", PDECL); 271798Speter } 272798Speter | 273798Speter var_decl error 274798Speter = goto Verror; 275798Speter ; 276798Speter 277798Speter /* 278798Speter * PROCEDURE AND FUNCTION DECLARATION PART 279798Speter */ 280798Speter 281837Speter proc_decl: 282798Speter phead YFORWARD ';' 283*14752Sthien = funcfwd($1.nl_entry); 284798Speter | 285798Speter phead YEXTERN ';' 286*14752Sthien = (void) funcext($1.nl_entry); 287798Speter | 288837Speter pheadres decls block ';' 289*14752Sthien = funcend($1.nl_entry, $3.tr_entry, lineof($4.i_entry)); 2908000Speter | 2918000Speter phead error 292798Speter ; 293798Speter pheadres: 294798Speter phead 295*14752Sthien = (void) funcbody($1.nl_entry); 296798Speter ; 297798Speter phead: 298798Speter porf YID params ftype ';' 299*14752Sthien = $$.nl_entry = funchdr(tree5($1.i_entry, lineof($5.i_entry), 300*14752Sthien $2.tr_entry, $3.tr_entry, $4.tr_entry)); 301798Speter ; 302798Speter porf: 303798Speter YPROCEDURE 304*14752Sthien = $$.i_entry = T_PDEC; 305798Speter | 306798Speter YFUNCTION 307*14752Sthien = $$.i_entry = T_FDEC; 308798Speter ; 309798Speter params: 310798Speter '(' param_list ')' 311*14752Sthien = $$.tr_entry = fixlist($2.tr_entry); 312798Speter | 313798Speter /* lambda */ 314*14752Sthien = $$.tr_entry = TR_NIL; 315798Speter ; 316798Speter 317798Speter /* 318798Speter * PARAMETERS 319798Speter */ 320798Speter 321798Speter param: 322798Speter id_list ':' type 323*14752Sthien = $$.tr_entry = tree3(T_PVAL, (int) fixlist($1.tr_entry), $3.tr_entry); 324798Speter | 325798Speter YVAR id_list ':' type 326*14752Sthien = $$.tr_entry = tree3(T_PVAR, (int) fixlist($2.tr_entry), $4.tr_entry); 327798Speter | 3283298Smckusic YFUNCTION id_list params ftype 329*14752Sthien = $$.tr_entry = tree5(T_PFUNC, (int) fixlist($2.tr_entry), 330*14752Sthien $4.tr_entry, $3.tr_entry, 331*14752Sthien (struct tnode *) lineof($1.i_entry)); 332798Speter | 3333298Smckusic YPROCEDURE id_list params ftype 334*14752Sthien = $$.tr_entry = tree5(T_PPROC, (int) fixlist($2.tr_entry), 335*14752Sthien $4.tr_entry, $3.tr_entry, 336*14752Sthien (struct tnode *) lineof($1.i_entry)); 337798Speter ; 338798Speter ftype: 339798Speter ':' type 340798Speter = $$ = $2; 341798Speter | 342798Speter /* lambda */ 343*14752Sthien = $$.tr_entry = TR_NIL; 344798Speter ; 345798Speter param_list: 346798Speter param 347*14752Sthien = $$.tr_entry = newlist($1.tr_entry); 348798Speter | 349798Speter param_list ';' param 350*14752Sthien = $$.tr_entry = addlist($1.tr_entry, $3.tr_entry); 351798Speter ; 352798Speter 353798Speter /* 354798Speter * CONSTANTS 355798Speter */ 356798Speter 357798Speter const: 358798Speter YSTRING 359*14752Sthien = $$.tr_entry = tree2(T_CSTRNG, $1.i_entry); 360798Speter | 361798Speter number 362798Speter | 363798Speter '+' number 364*14752Sthien = $$.tr_entry = tree2(T_PLUSC, $2.i_entry); 365798Speter | 366798Speter '-' number 367*14752Sthien = $$.tr_entry = tree2(T_MINUSC, $2.i_entry); 368798Speter ; 369798Speter number: 370798Speter const_id 371*14752Sthien = $$.tr_entry = tree2(T_ID, $1.i_entry); 372798Speter | 373798Speter YINT 374*14752Sthien = $$.tr_entry = tree2(T_CINT, $1.i_entry); 375798Speter | 376798Speter YBINT 377*14752Sthien = $$.tr_entry = tree2(T_CBINT, $1.i_entry); 378798Speter | 379798Speter YNUMB 380*14752Sthien = $$.tr_entry = tree2(T_CFINT, $1.i_entry); 381798Speter ; 382798Speter const_list: 383798Speter const 384*14752Sthien = $$.tr_entry = newlist($1.tr_entry); 385798Speter | 386798Speter const_list ',' const 387*14752Sthien = $$.tr_entry = addlist($1.tr_entry, $3.tr_entry); 388798Speter ; 389798Speter 390798Speter /* 391798Speter * TYPES 392798Speter */ 393798Speter 394798Speter type: 395798Speter simple_type 396798Speter | 397798Speter '^' YID 398*14752Sthien = $$.tr_entry = tree3(T_TYPTR, lineof($1.i_entry), tree2(T_ID, 399*14752Sthien $2.i_entry)); 400798Speter | 401798Speter struct_type 402798Speter | 403798Speter YPACKED struct_type 404*14752Sthien = $$.tr_entry = tree3(T_TYPACK, lineof($1.i_entry), $2.tr_entry); 405798Speter ; 406798Speter simple_type: 407798Speter type_id 408798Speter | 409798Speter '(' id_list ')' 410*14752Sthien = $$.tr_entry = tree3(T_TYSCAL, lineof($1.i_entry), fixlist($2.tr_entry)); 411798Speter | 412798Speter const YDOTDOT const 413*14752Sthien = $$.tr_entry = tree4(T_TYRANG, lineof($2.i_entry), $1.tr_entry, 414*14752Sthien $3.tr_entry); 415798Speter ; 416798Speter struct_type: 417798Speter YARRAY '[' simple_type_list ']' YOF type 418*14752Sthien = $$.tr_entry = tree4(T_TYARY, lineof($1.i_entry), 419*14752Sthien fixlist($3.tr_entry), $6.tr_entry); 420798Speter | 421798Speter YFILE YOF type 422*14752Sthien = $$.tr_entry = tree3(T_TYFILE, lineof($1.i_entry), $3.tr_entry); 423798Speter | 424798Speter YSET YOF simple_type 425*14752Sthien = $$.tr_entry = tree3(T_TYSET, lineof($1.i_entry), $3.tr_entry); 426798Speter | 427798Speter YRECORD field_list YEND 428798Speter = { 429*14752Sthien $$.tr_entry = setuptyrec( lineof( $1.i_entry ) , $2.tr_entry); 430*14752Sthien if ($3.i_entry < 0) 431*14752Sthien brerror($1.i_entry, "record"); 432798Speter } 433798Speter ; 434798Speter simple_type_list: 435798Speter simple_type 436*14752Sthien = $$.tr_entry = newlist($1.tr_entry); 437798Speter | 438798Speter simple_type_list ',' simple_type 439*14752Sthien = $$.tr_entry = addlist($1.tr_entry, $3.tr_entry); 440798Speter ; 441798Speter 442798Speter /* 443798Speter * RECORD TYPE 444798Speter */ 445798Speter field_list: 446798Speter fixed_part variant_part 447*14752Sthien = $$.tr_entry = tree4(T_FLDLST, lineof(NIL), 448*14752Sthien fixlist($1.tr_entry), $2.tr_entry); 449798Speter ; 450798Speter fixed_part: 451798Speter field 452*14752Sthien = $$.tr_entry = newlist($1.tr_entry); 453798Speter | 454798Speter fixed_part ';' field 455*14752Sthien = $$.tr_entry = addlist($1.tr_entry, $3.tr_entry); 456798Speter | 457798Speter fixed_part error 458798Speter = yyPerror("Malformed record declaration", PDECL); 459798Speter ; 460798Speter field: 461798Speter /* lambda */ 462*14752Sthien = $$.tr_entry = TR_NIL; 463798Speter | 464798Speter id_list ':' type 465*14752Sthien = $$.tr_entry = tree4(T_RFIELD, lineof($2.i_entry), 466*14752Sthien fixlist($1.tr_entry), $3.tr_entry); 467798Speter ; 468798Speter 469798Speter variant_part: 470798Speter /* lambda */ 471*14752Sthien = $$.tr_entry = TR_NIL; 472798Speter | 473798Speter YCASE type_id YOF variant_list 474*14752Sthien = $$.tr_entry = tree5(T_TYVARPT, lineof($1.i_entry), TR_NIL, 475*14752Sthien $2.tr_entry, fixlist($4.tr_entry)); 476798Speter | 477798Speter YCASE YID ':' type_id YOF variant_list 478*14752Sthien = $$.tr_entry = tree5(T_TYVARPT, lineof($1.i_entry), 479*14752Sthien $2.tr_entry, $4.tr_entry, 480*14752Sthien fixlist($6.tr_entry)); 481798Speter ; 482798Speter variant_list: 483798Speter variant 484*14752Sthien = $$.tr_entry = newlist($1.tr_entry); 485798Speter | 486798Speter variant_list ';' variant 487*14752Sthien = $$.tr_entry = addlist($1.tr_entry, $3.tr_entry); 488798Speter | 489798Speter variant_list error 490798Speter = yyPerror("Malformed record declaration", PDECL); 491798Speter ; 492798Speter variant: 493798Speter /* lambda */ 494*14752Sthien = $$.tr_entry = TR_NIL; 495798Speter | 496798Speter const_list ':' '(' field_list ')' 497*14752Sthien = $$.tr_entry = tree4(T_TYVARNT,lineof($2.i_entry), fixlist($1.tr_entry), 498*14752Sthien $4.tr_entry); 499798Speter ; 500798Speter 501798Speter /* 502798Speter * STATEMENT LIST 503798Speter */ 504798Speter 505798Speter stat_list: 506798Speter stat 507*14752Sthien = $$.tr_entry = newlist($1.tr_entry); 508798Speter | 509798Speter stat_lsth stat 510798Speter = { 511*14752Sthien if ((p = $1.tr_entry) != TR_NIL && (q = p->list_node.list)->tag == T_IFX) { 512*14752Sthien q->tag = T_IFEL; 513*14752Sthien q->if_node.else_stmnt = $2.tr_entry; 514798Speter } else 515*14752Sthien $$.tr_entry= addlist($1.tr_entry, $2.tr_entry); 516798Speter } 517798Speter ; 518798Speter 519798Speter stat_lsth: 520798Speter stat_list ';' 521*14752Sthien = if ((q = $1.tr_entry) != TR_NIL && (p = q->list_node.list) != TR_NIL && p->tag == T_IF) { 522798Speter if (yychar < 0) 523798Speter yychar = yylex(); 524798Speter if (yyshifts >= 2 && yychar == YELSE) { 525798Speter recovered(); 526*14752Sthien copy((char *) (&Y), (char *) (&OY), sizeof Y); 527798Speter yerror("Deleted ';' before keyword else"); 528798Speter yychar = yylex(); 529*14752Sthien p->tag = T_IFX; 530798Speter } 531798Speter } 532798Speter ; 533798Speter 534798Speter /* 535798Speter * CASE STATEMENT LIST 536798Speter */ 537798Speter 538798Speter cstat_list: 539798Speter cstat 540*14752Sthien = $$.tr_entry = newlist($1.tr_entry); 541798Speter | 542798Speter cstat_list ';' cstat 543*14752Sthien = $$.tr_entry = addlist($1.tr_entry, $3.tr_entry); 544798Speter | 545798Speter error 546798Speter = { 547*14752Sthien $$.tr_entry = TR_NIL; 548798Speter Kerror: 549798Speter yyPerror("Malformed statement in case", PSTAT); 550798Speter } 551798Speter | 552798Speter cstat_list error 553798Speter = goto Kerror; 554798Speter ; 555798Speter 556798Speter cstat: 557798Speter const_list ':' stat 558*14752Sthien = $$.tr_entry = tree4(T_CSTAT, lineof($2.i_entry), 559*14752Sthien fixlist($1.tr_entry), $3.tr_entry); 560798Speter | 561798Speter YCASELAB stat 562*14752Sthien = $$.tr_entry = tree4(T_CSTAT, lineof($1.i_entry), TR_NIL, 563*14752Sthien $2.tr_entry); 564798Speter | 565798Speter /* lambda */ 566*14752Sthien = $$.tr_entry = TR_NIL; 567798Speter ; 568798Speter 569798Speter /* 570798Speter * STATEMENT 571798Speter */ 572798Speter 573798Speter stat: 574798Speter /* lambda */ 575*14752Sthien = $$.tr_entry = TR_NIL; 576798Speter | 577798Speter YINT ':' stat 578*14752Sthien = $$.tr_entry = tree4(T_LABEL, lineof($2.i_entry), 579*14752Sthien $1.tr_entry == TR_NIL ? TR_NIL : 580*14752Sthien (struct tnode *) *hash($1.cptr, 1), $3.tr_entry); 581798Speter | 582798Speter proc_id 583*14752Sthien = $$.tr_entry = tree4(T_PCALL, lineof(yyline), $1.tr_entry, 584*14752Sthien TR_NIL); 585798Speter | 586798Speter proc_id '(' wexpr_list ')' 587*14752Sthien = $$.tr_entry = tree4(T_PCALL, lineof($2.i_entry), $1.tr_entry, 588*14752Sthien fixlist($3.tr_entry)); 589798Speter | 590798Speter YID error 591798Speter = goto NSerror; 592798Speter | 593798Speter assign 594798Speter | 595798Speter YBEGIN stat_list YEND 596798Speter = { 597*14752Sthien $$.tr_entry = tree3(T_BLOCK, lineof($1.i_entry), 598*14752Sthien fixlist($2.tr_entry)); 599*14752Sthien if ($3.i_entry < 0) 600*14752Sthien brerror($1.i_entry, "begin"); 601798Speter } 602798Speter | 603798Speter YCASE expr YOF cstat_list YEND 604798Speter = { 605*14752Sthien $$.tr_entry = tree4(T_CASE, lineof($1.i_entry), 606*14752Sthien $2.tr_entry, fixlist($4.tr_entry)); 607*14752Sthien if ($5.i_entry < 0) 608*14752Sthien brerror($1.i_entry, "case"); 609798Speter } 610798Speter | 611798Speter YWITH var_list YDO stat 612*14752Sthien = $$.tr_entry = tree4(T_WITH, lineof($1.i_entry), 613*14752Sthien fixlist($2.tr_entry), $4.tr_entry); 614798Speter | 615798Speter YWHILE expr YDO stat 616*14752Sthien = $$.tr_entry = tree4(T_WHILE, lineof($1.i_entry), $2.tr_entry, 617*14752Sthien $4.tr_entry); 618798Speter | 619798Speter YREPEAT stat_list YUNTIL expr 620*14752Sthien = $$.tr_entry = tree4(T_REPEAT, lineof($3.i_entry), 621*14752Sthien fixlist($2.tr_entry), $4.tr_entry); 622798Speter | 623798Speter YFOR assign YTO expr YDO stat 624*14752Sthien = $$.tr_entry = tree5(T_FORU, lineof($1.i_entry), $2.tr_entry, 625*14752Sthien $4.tr_entry, $6.tr_entry); 626798Speter | 627798Speter YFOR assign YDOWNTO expr YDO stat 628*14752Sthien = $$.tr_entry = tree5(T_FORD, lineof($1.i_entry), $2.tr_entry, 629*14752Sthien $4.tr_entry, $6.tr_entry); 630798Speter | 631798Speter YGOTO YINT 632*14752Sthien = $$.tr_entry = tree3(T_GOTO, lineof($1.i_entry), 633*14752Sthien (struct tnode *) *hash($2.cptr, 1)); 634798Speter | 635798Speter YIF expr YTHEN stat 636*14752Sthien = $$.tr_entry = tree5(T_IF, lineof($1.i_entry), $2.tr_entry, 637*14752Sthien $4.tr_entry, TR_NIL); 638798Speter | 639798Speter YIF expr YTHEN stat YELSE stat 640*14752Sthien = $$.tr_entry = tree5(T_IFEL, lineof($1.i_entry), $2.tr_entry, 641*14752Sthien $4.tr_entry, $6.tr_entry); 642798Speter | 643798Speter error 644798Speter = { 645798Speter NSerror: 646*14752Sthien $$.tr_entry = TR_NIL; 647798Speter yyPerror("Malformed statement", PSTAT); 648798Speter } 649798Speter ; 650798Speter assign: 651798Speter variable ':' '=' expr 652*14752Sthien = $$.tr_entry = tree4(T_ASGN, lineof($2.i_entry), $1.tr_entry, 653*14752Sthien $4.tr_entry); 654798Speter ; 655798Speter 656798Speter /* 657798Speter * EXPRESSION 658798Speter */ 659798Speter 660798Speter expr: 661798Speter error 662798Speter = { 663798Speter NEerror: 664*14752Sthien $$.tr_entry = TR_NIL; 665798Speter yyPerror("Missing/malformed expression", PEXPR); 666798Speter } 667798Speter | 668798Speter expr relop expr %prec '<' 669*14752Sthien = $$.tr_entry = tree4($2.i_entry, 670*14752Sthien $1.tr_entry->expr_node.const_tag == SAWCON ? 671*14752Sthien $3.tr_entry->expr_node.const_tag : 672*14752Sthien $1.tr_entry->expr_node.const_tag, 673*14752Sthien $1.tr_entry, $3.tr_entry); 674798Speter | 675798Speter '+' expr %prec UNARYSIGN 676*14752Sthien = $$.tr_entry = tree3(T_PLUS, $2.tr_entry->expr_node.const_tag, 677*14752Sthien $2.tr_entry); 678798Speter | 679798Speter '-' expr %prec UNARYSIGN 680*14752Sthien = $$.tr_entry = tree3(T_MINUS, $2.tr_entry->expr_node.const_tag, 681*14752Sthien $2.tr_entry); 682798Speter | 683798Speter expr addop expr %prec '+' 684*14752Sthien = $$.tr_entry = tree4($2.i_entry, 685*14752Sthien $1.tr_entry->expr_node.const_tag == SAWCON ? 686*14752Sthien $3.tr_entry->expr_node.const_tag : 687*14752Sthien $1.tr_entry->expr_node.const_tag, $1.tr_entry, 688*14752Sthien $3.tr_entry); 689798Speter | 690798Speter expr divop expr %prec '*' 691*14752Sthien = $$.tr_entry = tree4($2.i_entry, 692*14752Sthien $1.tr_entry->expr_node.const_tag == SAWCON ? 693*14752Sthien $3.tr_entry->expr_node.const_tag : 694*14752Sthien $1.tr_entry->expr_node.const_tag, $1.tr_entry, 695*14752Sthien $3.tr_entry); 696798Speter | 697798Speter YNIL 698*14752Sthien = $$.tr_entry = tree2(T_NIL, NOCON); 699798Speter | 700798Speter YSTRING 701*14752Sthien = $$.tr_entry = tree3(T_STRNG, SAWCON, $1.tr_entry); 702798Speter | 703798Speter YINT 704*14752Sthien = $$.tr_entry = tree3(T_INT, NOCON, $1.tr_entry); 705798Speter | 706798Speter YBINT 707*14752Sthien = $$.tr_entry = tree3(T_BINT, NOCON, $1.tr_entry); 708798Speter | 709798Speter YNUMB 710*14752Sthien = $$.tr_entry = tree3(T_FINT, NOCON, $1.tr_entry); 711798Speter | 712798Speter variable 713798Speter | 714798Speter YID error 715798Speter = goto NEerror; 716798Speter | 717798Speter func_id '(' wexpr_list ')' 718*14752Sthien = $$.tr_entry = tree4(T_FCALL, NOCON, $1.tr_entry, 719*14752Sthien fixlist($3.tr_entry)); 720798Speter | 721798Speter '(' expr ')' 722*14752Sthien = $$.tr_entry = $2.tr_entry; 723798Speter | 724798Speter negop expr %prec YNOT 725*14752Sthien = $$.tr_entry = tree3(T_NOT, NOCON, $2.tr_entry); 726798Speter | 727798Speter '[' element_list ']' 728*14752Sthien = $$.tr_entry = tree3(T_CSET, SAWCON, fixlist($2.tr_entry)); 729798Speter | 730798Speter '[' ']' 731*14752Sthien = $$.tr_entry = tree3(T_CSET, SAWCON, TR_NIL); 732798Speter ; 733798Speter 734798Speter element_list: 735798Speter element 736*14752Sthien = $$.tr_entry = newlist($1.tr_entry); 737798Speter | 738798Speter element_list ',' element 739*14752Sthien = $$.tr_entry = addlist($1.tr_entry, $3.tr_entry); 740798Speter ; 741798Speter element: 742798Speter expr 743798Speter | 744798Speter expr YDOTDOT expr 745*14752Sthien = $$.tr_entry = tree3(T_RANG, $1.i_entry, $3.tr_entry); 746798Speter ; 747798Speter 748798Speter /* 749798Speter * QUALIFIED VARIABLES 750798Speter */ 751798Speter 752798Speter variable: 753798Speter YID 754798Speter = { 755804Speter @@ return (identis(var, VAR)); 756*14752Sthien $$.tr_entry = setupvar($1.cptr, TR_NIL); 757798Speter } 758798Speter | 759798Speter qual_var 760*14752Sthien = $1.tr_entry->var_node.qual = 761*14752Sthien fixlist($1.tr_entry->var_node.qual); 762798Speter ; 763798Speter qual_var: 764798Speter array_id '[' expr_list ']' 765*14752Sthien = $$.tr_entry = setupvar($1.cptr, tree2(T_ARY, 766*14752Sthien (int) fixlist($3.tr_entry))); 767798Speter | 768798Speter qual_var '[' expr_list ']' 769*14752Sthien = $1.tr_entry->var_node.qual = 770*14752Sthien addlist($1.tr_entry->var_node.qual, 771*14752Sthien tree2(T_ARY, (int) fixlist($3.tr_entry))); 772798Speter | 773798Speter record_id '.' field_id 774*14752Sthien = $$.tr_entry = setupvar($1.cptr, setupfield($3.tr_entry, 775*14752Sthien TR_NIL)); 776798Speter | 777798Speter qual_var '.' field_id 778*14752Sthien = $1.tr_entry->var_node.qual = 779*14752Sthien addlist($1.tr_entry->var_node.qual, 780*14752Sthien setupfield($3.tr_entry, TR_NIL)); 781798Speter | 782798Speter ptr_id '^' 783*14752Sthien = $$.tr_entry = setupvar($1.cptr, tree1(T_PTR)); 784798Speter | 785798Speter qual_var '^' 786*14752Sthien = $1.tr_entry->var_node.qual = 787*14752Sthien addlist($1.tr_entry->var_node.qual, tree1(T_PTR)); 788798Speter ; 789798Speter 790798Speter /* 791798Speter * Expression with write widths 792798Speter */ 793798Speter wexpr: 794798Speter expr 795798Speter | 796798Speter expr ':' expr 797*14752Sthien = $$.tr_entry = tree4(T_WEXP, $1.i_entry, $3.tr_entry, TR_NIL); 798798Speter | 799798Speter expr ':' expr ':' expr 800*14752Sthien = $$.tr_entry = tree4(T_WEXP, $1.i_entry, $3.tr_entry, 801*14752Sthien $5.tr_entry); 802798Speter | 803798Speter expr octhex 804*14752Sthien = $$.tr_entry = tree4(T_WEXP, $1.i_entry, TR_NIL, $2.tr_entry); 805798Speter | 806798Speter expr ':' expr octhex 807*14752Sthien = $$.tr_entry = tree4(T_WEXP, $1.i_entry, $3.tr_entry, 808*14752Sthien $4.tr_entry); 809798Speter ; 810798Speter octhex: 811798Speter YOCT 812*14752Sthien = $$.i_entry = OCT; 813798Speter | 814798Speter YHEX 815*14752Sthien = $$.i_entry = HEX; 816798Speter ; 817798Speter 818798Speter expr_list: 819798Speter expr 820*14752Sthien = $$.tr_entry = newlist($1.tr_entry); 821798Speter | 822798Speter expr_list ',' expr 823*14752Sthien = $$.tr_entry = addlist($1.tr_entry, $3.tr_entry); 824798Speter ; 825798Speter 826798Speter wexpr_list: 827798Speter wexpr 828*14752Sthien = $$.tr_entry = newlist($1.tr_entry); 829798Speter | 830798Speter wexpr_list ',' wexpr 831*14752Sthien = $$.tr_entry = addlist($1.tr_entry, $3.tr_entry); 832798Speter ; 833798Speter 834798Speter /* 835798Speter * OPERATORS 836798Speter */ 837798Speter 838798Speter relop: 839*14752Sthien '=' = $$.i_entry = T_EQ; 840798Speter | 841*14752Sthien '<' = $$.i_entry = T_LT; 842798Speter | 843*14752Sthien '>' = $$.i_entry = T_GT; 844798Speter | 845*14752Sthien '<' '>' = $$.i_entry = T_NE; 846798Speter | 847*14752Sthien '<' '=' = $$.i_entry = T_LE; 848798Speter | 849*14752Sthien '>' '=' = $$.i_entry = T_GE; 850798Speter | 851*14752Sthien YIN = $$.i_entry = T_IN; 852798Speter ; 853798Speter addop: 854*14752Sthien '+' = $$.i_entry = T_ADD; 855798Speter | 856*14752Sthien '-' = $$.i_entry = T_SUB; 857798Speter | 858*14752Sthien YOR = $$.i_entry = T_OR; 859798Speter | 860*14752Sthien '|' = $$.i_entry = T_OR; 861798Speter ; 862798Speter divop: 863*14752Sthien '*' = $$.i_entry = T_MULT; 864798Speter | 865*14752Sthien '/' = $$.i_entry = T_DIVD; 866798Speter | 867*14752Sthien YDIV = $$.i_entry = T_DIV; 868798Speter | 869*14752Sthien YMOD = $$.i_entry = T_MOD; 870798Speter | 871*14752Sthien YAND = $$.i_entry = T_AND; 872798Speter | 873*14752Sthien '&' = $$.i_entry = T_AND; 874798Speter ; 875798Speter 876798Speter negop: 877798Speter YNOT 878798Speter | 879798Speter '~' 880798Speter ; 881798Speter 882798Speter /* 883798Speter * LISTS 884798Speter */ 885798Speter 886798Speter var_list: 887798Speter variable 888*14752Sthien = $$.tr_entry = newlist($1.tr_entry); 889798Speter | 890798Speter var_list ',' variable 891*14752Sthien = $$.tr_entry = addlist($1.tr_entry, $3.tr_entry); 892798Speter ; 893798Speter 894798Speter id_list: 895798Speter YID 896*14752Sthien = $$.tr_entry = newlist($1.tr_entry); 897798Speter | 898798Speter id_list ',' YID 899*14752Sthien = $$.tr_entry = addlist($1.tr_entry, $3.tr_entry); 900798Speter ; 901798Speter 902798Speter /* 903798Speter * Identifier productions with semantic restrictions 904798Speter * 905804Speter * For these productions, the characters @@ signify 906798Speter * that the associated C statement is to provide 907798Speter * the semantic restriction for this reduction. 908798Speter * These lines are made into a procedure yyEactr, similar to 909798Speter * yyactr, which determines whether the corresponding reduction 910798Speter * is permitted, or whether an error is to be signaled. 911798Speter * A zero return from yyEactr is considered an error. 912798Speter * YyEactr is called with an argument "var" giving the string 913798Speter * name of the variable in question, essentially $1, although 914798Speter * $1 will not work because yyEactr is called from loccor in 915798Speter * the recovery routines. 916798Speter */ 917798Speter 918798Speter const_id: 919798Speter YID 920804Speter = @@ return (identis(var, CONST)); 921798Speter ; 922798Speter type_id: 923798Speter YID 924798Speter = { 925804Speter @@ return (identis(var, TYPE)); 926*14752Sthien $$.tr_entry = tree3(T_TYID, lineof(yyline), $1.tr_entry); 927798Speter } 928798Speter ; 929798Speter var_id: 930798Speter YID 931804Speter = @@ return (identis(var, VAR)); 932798Speter ; 933798Speter array_id: 934798Speter YID 935804Speter = @@ return (identis(var, ARRAY)); 936798Speter ; 937798Speter ptr_id: 938798Speter YID 939804Speter = @@ return (identis(var, PTRFILE)); 940798Speter ; 941798Speter record_id: 942798Speter YID 943804Speter = @@ return (identis(var, RECORD)); 944798Speter ; 945798Speter field_id: 946798Speter YID 947804Speter = @@ return (identis(var, FIELD)); 948798Speter ; 949798Speter proc_id: 950798Speter YID 951804Speter = @@ return (identis(var, PROC)); 952798Speter ; 953798Speter func_id: 954798Speter YID 955804Speter = @@ return (identis(var, FUNC)); 956798Speter ; 957