l_closur.rig 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. -- transitive closure under :=, return
  2. -- file closure.rig
  3. ------------------------------
  4. #transitive_closure
  5. $rule_list
  6. / LOOP
  7. $N1 := #node_num( LAST #Lint $Tab LAST #Lint $Rules);
  8. #Closure( $rule_list);
  9. $N2 := #node_num( LAST #Lint $Tab LAST #Lint $Rules);
  10. IF $N2 <= $N1 -> BREAK FI
  11. END /
  12. ##
  13. #node_num
  14. <* $R : <* $V : $S +:= #LEN *> *>
  15. <* $R : $S +:= #LEN *>
  16. / RETURN $S /
  17. ##
  18. #Closure
  19. (. (* $name :: (. (* #ch_stmt *) .) *) .)
  20. ##
  21. #ch_stmt
  22. ASSGN :: <. op: $op ,
  23. praw: $rtype := ( #Vartype ! #call_copy_name ),
  24. lew: $ltype := #Vartype .>
  25. /IF $op=':=' -> $ltype ++:= $rtype FI/ ;;
  26. 'RETURN' :: (. $rtype := ( #Vartype ! #call_copy_name ) .)
  27. / LAST #Lint $Rules . LAST #Closure $name ++:= $rtype / ;;
  28. 'FORALL' :: <. VAR : $V,
  29. BODY: (. (* #ch_stmt *) .),
  30. 'IN' : $E:= (#Vartype ! #call_copy_name ! $E) .>
  31. / IF $E .type.tree -> LAST #Lint $Tab . LAST #Closure $name .
  32. ( $V . NAME) ++:= <. id: T .> FI / ;;
  33. 'LOOP':: (. (* #ch_stmt *) .) ;;
  34. 'IF':: (. (* <. BODY: (. (* #ch_stmt *) .) .> *) .) ;;
  35. 'TREE':: <. [ BODY: (. (* (. (* #ch_stmt *) .) *) .) ],
  36. [ 'LOOP': (. (* #ch_stmt *) .) ] .> ;;
  37. <. BODY: (. (* #ch_stmt *) .) .> ;;
  38. PATASSGN :: <. op: $op ,
  39. VAR: $ltype:= #Vartype,
  40. PAT: #ch_stmt,
  41. PAT: ( CALL:: <. NAME: $rule .>
  42. /$type:= LAST #Lint $Rules . $rule;
  43. $.PAT.type++:= $type/ !
  44. $E /$type:= $E. type/) .>
  45. / IF $op=':=' -> $ltype ++:= $type FI/ ;;
  46. $E
  47. ##
  48. #Vartype
  49. ( VAR:: <. NAME: $var .>
  50. /$type := LAST #Lint $Tab . LAST #Closure $name . $var / !
  51. 'LAST' :: <. RULE: $rule,
  52. VAR: $var .>
  53. /$type := LAST #Lint $Tab . $rule . $var / )
  54. / $.type ++:= $type; RETURN $type /
  55. ##
  56. #call_copy_name
  57. ( CALL:: <. NAME: $rule .>
  58. /$type := LAST #Lint $Rules . $rule/ !
  59. un_op :: <. op: 'COPY',
  60. ARG: $E .>
  61. /$type := $E . type / !
  62. bin_op :: <. op: '::',
  63. ARG2: $E .>
  64. /$type := $E . type/ )
  65. / $.type ++:= $type; RETURN $type/
  66. ##