1 /* @(#)r.y 1.1 (Berkeley) 12/15/82 */ 2 %{ 3 extern int transfer; 4 extern int indent; 5 %} 6 7 %term IF ELSE FOR WHILE BREAK NEXT 8 %term DIGITS DO 9 %term GOK DEFINE INCLUDE 10 %term REPEAT UNTIL 11 %term RETURN 12 %term SWITCH CASE DEFAULT 13 %% 14 15 statl : statl stat 16 | 17 ; 18 stat : if stat ={ indent--; outcont($1); } 19 | ifelse stat ={ indent--; outcont($1+1); } 20 | switch fullcase '}' ={ endsw($1, $2); } 21 | while stat ={ whilestat($1); } 22 | for stat ={ forstat($1); } 23 | repeat stat UNTIL ={ untils($1,1); } 24 | repeat stat ={ untils($1,0); } 25 | BREAK ={ breakcode(); } 26 | NEXT ={ nextcode(); } 27 | do stat ={ dostat($1); } 28 | GOK ={ gokcode($1); } 29 | RETURN ={ retcode(); } 30 | ';' 31 | '{' statl '}' 32 | label stat 33 | error ={ errcode(); yyclearin; } 34 ; 35 switch : sw '{' 36 ; 37 sw : SWITCH ={ swcode(); } 38 ; 39 fullcase: caselist ={ $$ = 0; } 40 | caselist defpart ={ $$ = 1; } 41 ; 42 caselist: casepart 43 | caselist casepart 44 ; 45 defpart : default statl 46 ; 47 default : DEFAULT ={ getdefault(); } 48 ; 49 casepart: case statl 50 ; 51 case : CASE ={ getcase(); } 52 ; 53 label : DIGITS ={ transfer = 0; outcode($1); } 54 ; 55 if : IF ={ ifcode(); } 56 ; 57 ifelse : if stat ELSE ={ elsecode($1); } 58 ; 59 while : WHILE ={ whilecode(); } 60 ; 61 for : FOR ={ forcode(); } 62 ; 63 repeat : REPEAT ={ repcode(); } 64 ; 65 do : DO ={ docode(); } 66 ; 67 %% 68