l_check.rig 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. -- check phase
  2. -- file check.rig
  3. -------------------------
  4. #check
  5. (. (* $name :: (. (* #check_stmt *) .) *) .)
  6. ##
  7. --------------------------------------------
  8. #check_stmt
  9. ASSGN::<. op: ':=',
  10. lew: #check_expr,
  11. praw: #check_expr .> ;;
  12. ASSGN::<. op: '!!',
  13. lew: ( #no_list / #err(1)/ ! $E ),
  14. praw: ( #no_list /#err(2)/ ! $E ) .> ;;
  15. ASSGN::<. op: '!.',
  16. lew: ( #no_list /#err(1)/ ! $E ),
  17. praw: #check_expr .> ;;
  18. ASSGN::<. op: '++',
  19. lew: ( #no_tree /#err(3)/ ! $E ),
  20. praw: ( #no_tree /#err(4)/ ! $E ) .> ;;
  21. ASSGN::<. op: '+',
  22. lew: ( #no_num /#err(5)/ ! $E ),
  23. praw: ( #no_num /#err(6)/ ! $E ) .> ;;
  24. 'PUT':: <. arg: (. (*
  25. /IF $$.type.tree -> #err(7 $$ ) FI /
  26. #check_expr *) .) .> ;;
  27. <. FILE_SPEC: ( #no_atom /#err(8)/ ! $E ) .> ;;
  28. <. ['IN': #check_expr
  29. /$X:= $.'IN'.type;
  30. IF $X.num OR $X.id OR $X.sym -> #err(9) FI/],
  31. BODY: (. (* #check_stmt *) .) .> ;;
  32. (. #check_expr .) ;;
  33. 'LOOP':: (. (* #check_stmt *) .) ;;
  34. 'IF':: (. (* <. COND: #check_expr,
  35. BODY: (. (* #check_stmt *) .) .>
  36. *) .) ;;
  37. 'CALL':: <. ARGS: (. (* #check_expr *) .) .> ;;
  38. #check_bltin ;;
  39. #check_patt
  40. ##
  41. ------------------------------------------
  42. #check_patt
  43. ALTERNATIVE:: (. (* (. (* #check_stmt *) .) *) .) ;;
  44. TREE:: <. [BODY: (. (* (. (* #check_stmt *) .) *) .) ],
  45. ['LOOP': (. (* #check_stmt *) .) ] .> ;;
  46. <. pat: #check_expr .> ;;
  47. PATASSGN:: <. PAT: #check_patt .> ;;
  48. $E
  49. ##
  50. ------------------------------------------
  51. #check_expr
  52. VAR::<. NAME: $V .> /$++:=
  53. <. type: LAST #Lint $Tab . LAST #check $name .$V .>/;;
  54. <. op: '!!',
  55. ARG1: (#no_list /#err(10)/ ! $E),
  56. ARG2: (#no_list /#err(11)/ ! $E) .> ;;
  57. <. op: '!.',
  58. ARG1: (#no_list /#err(10)/ ! $E),
  59. ARG2: #check_expr .> ;;
  60. <. op: '++',
  61. ARG1: (#no_tree /#err(12)/ ! $E ),
  62. ARG2: (#no_tree /#err(13)/ ! $E ) .> ;;
  63. <. op: ('+'!'-'!'*'!'DIV'!'MOD'!'>'!'<'!'>='!'<='),
  64. ARG1: (#no_num /#err(14)/ ! $E ),
  65. ARG2: (#no_num /#err(15)/ ! $E ) .> ;;
  66. <. op: 'INDEX',
  67. ARG1: (#no_list /#err(16)/ ! $E ),
  68. ARG2: (#no_num /#err(17)/ ! $E ) .> ;;
  69. <. op: 'SELECTOR',
  70. ARG1: (#no_tree /#err(18)/ ! $E),
  71. ARG2: (#no_id /#err(19) / ! $E) .> ;;
  72. CONLIST:: <. BODY: (. (* #check_expr *) .) .> ;;
  73. CONTREE:: <. BODY: (. (* ( #no_id /#err(20)/ ! $E)
  74. #check_expr *) .) .> ;;
  75. CALL:: <. [ ARGS: (. (* #check_expr *) .) ] .> ;;
  76. <. op: '::',
  77. ARG1: (#no_atom /#err(21)/ ! $E ),
  78. ARG2: (#no_aggregate /#err(22)/ ! $E) .> ;;
  79. <. ARG1: #check_expr,
  80. ARG2: #check_expr .> ;;
  81. un_op:: <. op: ('-' ! '+'),
  82. ARG: (#no_num /#err(23)/ ! $E ) .> ;;
  83. un_op:: <. ARG: #check_expr .> ;;
  84. #check_bltin ;;
  85. $E
  86. ##
  87. ----------------------------------------
  88. #no_list
  89. #check_expr /FAIL/ ;;
  90. <. type: <* [ T: T],
  91. [ list: T],
  92. $S: T /RETURN $S/ *> .> /FAIL/
  93. ##
  94. #no_tree
  95. #check_expr /FAIL/ ;;
  96. <. type: <* [T: T],
  97. [ tree: T],
  98. $S: T /RETURN $S/ *> .> /FAIL/
  99. ##
  100. #no_num
  101. #check_expr /FAIL/ ;;
  102. <. type: <* [T: T],
  103. [ num: T],
  104. $S: T /RETURN $S/ *> .> /FAIL/
  105. ##
  106. #no_sym
  107. #check_expr /FAIL/ ;;
  108. <. type: <* [T: T],
  109. [sym: T],
  110. $S: T /RETURN $S/ *> .> /FAIL/
  111. ##
  112. #no_id
  113. #check_expr /FAIL/;;
  114. <. type: <* [T: T],
  115. [id: T],
  116. $S: T /RETURN $S/ *> .> /FAIL/
  117. ##
  118. #no_atom
  119. #check_expr /IF $.type.list OR $.type.tree -> RETURN $ FI; FAIL /
  120. ##
  121. #no_aggregate
  122. #check_expr /IF $.type.list OR $.type.tree -> FAIL FI; RETURN $/
  123. ##
  124. ------------------------------------------------
  125. #check_bltin
  126. BLTIN :: <. NAME: 'IMPLODE',
  127. ARGS: (. (* $E /#check_expr($E);
  128. IF $E.type.tree -> #err(7 $E) FI/ *) .)
  129. .> ;;
  130. BLTIN:: <. NAME: 'EXPLODE',
  131. ARGS: (. ( #no_atom /#err(24 $.ARGS[1])/ ! $E ) .) .> ;;
  132. BLTIN:: <. NAME: 'CHR',
  133. ARGS: (. (#no_num /#err(23 $.ARGS[1])/ ! $E ) .) .> ;;
  134. BLTIN:: <. NAME: 'ORD',
  135. ARGS: (. $E /#check_expr($E);
  136. $X := $E.type;
  137. IF $X.tree OR $X.list OR $X.num -> #err(25 $E)
  138. FI/ .) .> ;;
  139. BLTIN:: <. ARGS: (. (* #check_expr *) .) .>
  140. ##
  141. --------------------------------------------------
  142. #err
  143. / LAST #Lint $err_count +:= 1;
  144. err<< '---------------------------------------------';
  145. err << '** Warning' $ '** in' @ 'rule #' LAST #check $name ':'/
  146. ( ( 1 /$type:= list/ !
  147. 3 /$type:= tree / !
  148. 5 /$type:= number/ ) /$part:= left/ !
  149. ( 2 /$type:= list/ !
  150. 4 /$type:= tree/ !
  151. 6 /$type:= number/ ) /$part:= right/ )
  152. /err<< $part 'part of assignment may be not' $type ;
  153. err<< 'in stmt';
  154. #print_stmt( LAST #check_stmt $)/ ;;
  155. 7 /err<< expression/ #print_expr
  156. /err<< 'may be of tree type in stmt';
  157. #print_stmt(LAST #check_stmt $)/ ;;
  158. 8 /err<< 'not atomic file specification may occur in stmt';
  159. #print_stmt(LAST #check_stmt $ )/ ;;
  160. 9 /err<< '"in"-expression may be of atomic type in stmt';
  161. #print_stmt(LAST #check_stmt $)/ ;;
  162. ( ((10!16) /$arg:= first/ ! 11 /$arg:= second/) /$type:= list/ !
  163. ((12!18) /$arg:= first/ ! 13 /$arg:= second/ ) /$type:= tree/ !
  164. (14 /$arg:=first/ ! (15!17) /$arg:= second/ )
  165. /$type:= number/ )
  166. /err<< $arg 'argument may be not' $type 'in expr';
  167. #print_expr(LAST #check_expr $); err<< 'in stmt';
  168. #print_stmt(LAST #check_stmt $)/ ;;
  169. (19!20) /err<< 'selector may be not identifier in expr';
  170. #print_expr(LAST #check_expr $); err<< 'in stmt';
  171. #print_stmt(LAST #check_stmt $)/ ;;
  172. (21 /$arg:= first; $type:= atom/ ! 22 /$arg:= second;
  173. $type:= 'list or tree'/)
  174. /err<< $arg 'argument of "::" may be not' $type 'in expr';
  175. #print_expr(LAST #check_expr $); err<< 'in stmt';
  176. #print_stmt(LAST #check_stmt $)/ ;;
  177. ( 23 /$BLT:= 'CHR'/ !
  178. 24 /$BLT:= 'EXPLODE'/ ! 25 /$BLT:= 'ORD'/ ) $E
  179. /err<< 'type of argument of' $BLT 'bltin rule may be not correct';
  180. err<<'in expr'; #print_expr($E);
  181. err<< 'in stmt'; #print_stmt(LAST #check_stmt $)/
  182. ##
  183. ----------------------------------------------
  184. #print_stmt
  185. ASSGN::<. lew: #print_expr,
  186. op: ( ':=' ! $op ) /err<] @ $op ':='/,
  187. praw: #print_expr .>;;
  188. 'RETURN':: (. /err<] 'RETURN'/ #print_expr .) ;;
  189. -- load, save, open
  190. $op:: <. NAME: $S,
  191. FILE_SPEC: / err<] $op; #print_expr( $S)/
  192. #print_expr .> ;;
  193. $op:: <. VAR: $S,
  194. FILE_SPEC: / err<] $op; #print_expr( $S)/
  195. #print_expr .> ;;
  196. PUT::<. NAME: $ID /err<] $ID /,
  197. tip: $op /err<] $op/,
  198. [ arg: (. (* #print_expr *) .) ] .> ;;
  199. 'PRINT':: (. /err<] 'PRINT'/ #print_expr .) ;;
  200. 'FORALL'::<. VAR: $S /err<] 'FORALL';#print_expr($S);err<] ' IN'/,
  201. 'IN': #print_expr /err<] ' DO...'/ .> ;;
  202. 'IF':: (. <. COND: /err<] 'IF'/ #print_expr /err<] '-> ...'/ .>
  203. (* $E *) .) ;;
  204. <. NAME: $S /err<] @ '#' $S '('/,
  205. [ ARGS: (. (* #print_expr *) .) ] .> /err<] ' )'/;;
  206. $pat:: <. pat: /err<] @ #EXPLODE($pat)[1] #CHR(39) '('/
  207. #print_expr
  208. /err<] ')'/ .> ;;
  209. PATASSGN:: <. VAR: #print_expr,
  210. op: (':=' ! $op ) /err<] @ $op ':= ...'/ .> ;;
  211. /err<] '***** not printed ***'/
  212. ##
  213. ----------------------------------------------
  214. #print_expr
  215. CONSTANT:: <. VAL: $A .> /err<] $A/ ;;
  216. 'NULL':: <. mesto: $A .> /err<] 'NULL'/ ;;
  217. VAR::<. NAME: $A .> /err<] @ '$' $A ' '/ ;;
  218. 'LAST':: <. RULE: /err<] 'LAST'/ $A /err<] @ '#' $A /,
  219. VAR: $A /err<] @ ' $' $A ' '/ .> ;;
  220. CONLIST:: <. BODY: (. /err<] '(.'/ (* #print_expr *) .) .> /err<] '.)'/ ;;
  221. CONTREE:: <. BODY: (. /err<] '<.'/ (* #print_expr
  222. /err<] ':'/ #print_expr
  223. /IF $$ -> err<] ',' FI/ *) .) .>
  224. /err<] '.>'/ ;;
  225. <. NAME: $ID /err<] @ '#' $ID '('/,
  226. [ ARGS: (. (* #print_expr *) .) ] .> /err<] ')'/ ;;
  227. bin_op:: <. ARG1: #print_expr,
  228. op: $op /IF $op = INDEX -> err<] '['
  229. ELSIF $op = SELECTOR -> err<] '.'
  230. ELSIF T -> err<] $op FI/,
  231. ARG2: #print_expr
  232. /IF $op = INDEX -> err<] ']' FI/ .> ;;
  233. un_op:: <. op: $op /err<] $op/,
  234. ARG: #print_expr .> ;;
  235. /err<]'*** not printed expr ***'/
  236. ##
  237. -----------------------------------------------