5.16.7.21. Conditional Statements

Start data section to src/flx_parse.mly[29 /35 ] Next Prev First Last
  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: 
End data section to src/flx_parse.mly[29]