2178: elif_clause: 2179: | ELIF expr DO statement_aster 2180: { 2181: let sr = rstoken $1 $3 in 2182: let sr = fold_left (fun l r -> rsrange l (src_of_stmt r)) sr $4 in 2183: sr,$2,$4 2184: } 2185: | ELIF expr RETURN SEMI 2186: { 2187: let sr = rstoken $1 $4 in 2188: sr,$2,[`AST_proc_return sr] 2189: } 2190: 2191: | ELIF expr GOTO NAME SEMI 2192: { 2193: let sr = rstoken $1 $5 in 2194: sr,$2,[`AST_goto (sr,snd $4)] 2195: } 2196: 2197: elif_clauses: 2198: | elif_clauses elif_clause { $2 :: $1 } 2199: | elif_clause { [$1] } 2200: 2201: else_clause: 2202: | elif_clauses ELSE statement_aster 2203: { 2204: let sr = fold_left (fun l r -> rsrange l (src_of_stmt r)) (slift $2) $3 in 2205: fold_left (* actually a right fold cause list is reversed *) 2206: (fun els (sr,cond,thn) -> 2207: let sr = rsrange sr (fst els) in 2208: sr,[`AST_ifdo ( sr, cond, thn, snd els )] 2209: ) 2210: (sr,$3) $1 2211: } 2212: | ELSE statement_aster 2213: { 2214: let sr = fold_left (fun l r -> rsrange l (src_of_stmt r)) (slift $1) $2 in 2215: sr,$2 2216: } 2217: | elif_clauses 2218: { 2219: match $1 with [] -> assert false 2220: | (sr,_,_) :: _ -> 2221: fold_left (* actually a right fold cause list is reversed *) 2222: (fun els (sr,cond,thn) -> 2223: let sr = rsrange sr (fst els) in 2224: sr,[`AST_ifdo ( sr, cond, thn, snd els )] 2225: ) 2226: (sr,[]) $1 2227: } 2228: 2229: ifgoto_stmt: 2230: | IF expr GOTO NAME SEMI 2231: { `AST_ifgoto (rstoken $1 $5,$2,snd $4) } 2232: 2233: | IF expr RETURN SEMI 2234: { `AST_ifreturn (rstoken $1 $4,$2) } 2235: 2236: | IF expr CALL expr SEMI 2237: { 2238: let isr = rstoken $1 $5 in 2239: match $4 with 2240: | `AST_apply (sr,(proc, arg)) -> 2241: `AST_ifdo (isr, $2,[`AST_call (sr, proc, arg)],[]) 2242: 2243: | proc -> 2244: let u = `AST_tuple (slift $5, []) in 2245: `AST_ifdo (isr, $2, [`AST_call (rstoken $3 $5, proc, u)],[]) 2246: } 2247: 2248: 2249: | IF expr DO statement_aster else_clause DONE SEMI 2250: { `AST_ifdo (rstoken $1 $6,$2,$4,snd $5) } 2251: 2252: | IF expr DO statement_aster DONE SEMI 2253: { `AST_ifdo (rstoken $1 $5,$2,$4,[]) } 2254: 2255: /* 2256: whilst_stmt: 2257: | WHILST expr DO statement_aster DONE SEMI 2258: { `AST_whilst (rstoken $1 $6, $2, $4) } 2259: 2260: | UNTIL expr DO statement_aster DONE SEMI 2261: { `AST_until (rstoken $1 $6, $2, $4) } 2262: */ 2263: