ftn.rig 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385
  1. --(* FTN.RIG *)
  2. #F
  3. -- main rule; place for global variables of whole program.
  4. $B:=#PARM(T);
  5. $S:=#CALL_PAS(35 #IMPLODE($B[1] '.PAS') 'U-P-');
  6. $T:=#CALL_PAS(35 #IMPLODE('TYPES.PAS') 'U-P-');
  7. $FILES:=0;
  8. $SY0:=(.':=' ';' 'end' 'then' 'do' 'to' 'else' 'downto' 'of' .) ;
  9. $SY1:= (. '<' '>' '<=' '>=' '=' '<>' '[' ']'
  10. 'and' 'or' 'not' 'div' '^' 'trunc' 'exit' 'halt'
  11. true false arctan .) ;
  12. $SY2:=(. '.lt.' '.gt.' '.le.' '.ge.' '.eq.' '.ne.' '(' ')'
  13. '.and.' '.or.' '.not.' '/' ' ' 'nint' 'return' 'stop'
  14. '.true.' '.false.' atan.);
  15. OPEN F #IMPLODE($B[1] '.FOR');
  16. OPEN S ' ';
  17. PRINT $S;
  18. #DECLS1($T); -- common type declarations are necessary !
  19. PRINT (. 'TYPE TREE=' $TYPES .);
  20. #PROGRAM($S);
  21. ##
  22. #DECLS1 (. #DECLS .) ##
  23. #PROGRAM (.
  24. [#CM program $XXX ';' #CM]
  25. (* #CM
  26. ( #PROCEDURE
  27. /F<<;
  28. F<<'C ------------------------------';
  29. F<</
  30. !
  31. /F<<'C DD------------------------------';/
  32. (* $C!!:=#DECLS *)
  33. / F<<'C EE------------------------------';/
  34. )
  35. #CM
  36. *) .)
  37. / $C[-1]:=NULL;#COMMON($C) /
  38. ##
  39. #COMMON
  40. / OPEN C #IMPLODE(LAST #F $B[1] '.INC');
  41. C<<#D() @ 'COMMON /' LAST #F $B[1] '/' /
  42. (. (* $E1
  43. [$E2] [$E3] [$E4] [$E5] [$E6]
  44. [$Ea] [$Eb] [$Ec] [$Ed] [$Ee] [$Ef]
  45. / C<<@ ' N '
  46. $E1 $E2 $E3 $E4 $E5 $E6
  47. $Ea $Eb $Ec $Ed $Ee $Ef
  48. /
  49. *) .)
  50. ##
  51. #PROCEDURE
  52. / $lab:=100 /
  53. #HEADER
  54. (* #DECLS *)
  55. #BLOCK
  56. [(';'!'.')]
  57. / F<<#D() 'END'/
  58. ##
  59. #HEADER
  60. #CM
  61. ( (function!Function) / $TXT!.:=function /
  62. ! (procedure!Procedure) / $TXT!.:=subroutine /)
  63. $TXT!.:=$A / $TXT!.:='(' /
  64. [ '('
  65. / $ch:=' ' /
  66. (* [var] $ids:=#IDLIST
  67. / $il!.:=$ids; $TXT!!:=(. $ch $ids .) ; $ch:=',';PRINT($$) /
  68. ':'
  69. $t!.:=#TYPE
  70. * ';' )
  71. ')' ]
  72. / $TXT!.:= ')' /
  73. ( (':' $R:=#TYPE [';']) / F<<#D() $R / ! [';'] / F<<#D() / )
  74. /F<]$TXT/
  75. #CM
  76. / $I:=0;
  77. PRINT (. '******' $t '******' .);
  78. F<<#D() 'INCLUDE ''T0.INC''';
  79. FORALL $E IN $il DO $I+:=1;
  80. PRINT $t[$I];
  81. F<<#D() $t[$I][1] @ $E $t[$I][2] ;OD;
  82. / [ ';' ]
  83. #CM
  84. ##
  85. #FILE $x
  86. /
  87. $Z:=#ORD(#CALL_PAS(87 $x 2));
  88. IF NOT $Z->$Z:=32 FI;
  89. RETURN $Z
  90. /
  91. ##
  92. #DECLS
  93. #CM
  94. / S<]$ /
  95. const #CM (* $cn '=' $a:=#EXPR ';' #CM
  96. / IF #TATOM($a[1])->F<<#D() 'character*4 ' $cn FI;
  97. F<<#D() ' parameter(' $cn '=' $a ')' /
  98. *) ;;
  99. type (* #CM #TYPEDEF #CM ';' *) #CM ;;
  100. label (* #CM #NUMBER #CM * ',' ) ';' ;;
  101. var (* #CM $i:=#IDLIST #CM ':' #CM $T:=#TYPE #CM
  102. / F<<#D() $T[1] ;
  103. $C!!:=$i; $C!.:=',';
  104. FORALL $V IN $i DO
  105. IF #IDENT($V) -> F<]@ $V $T[2]
  106. ELSIF T-> F<]@ $V
  107. FI;
  108. OD/
  109. ';' #CM *)
  110. /RETURN $C/
  111. ##
  112. #TYPEDEF
  113. $A '=' ['^' ] $AR:=#ARDEF
  114. / LAST #F $TYPES++:=<. $A : $AR.>;
  115. PRINT LAST #F $TYPES/
  116. ##
  117. #ARDEF
  118. array '[' $dn '..' $up!.:=$up1
  119. [$up!.:='*' $up!.:=$Id ]
  120. [ ',' $dn2 '..' $up2 ] ']'
  121. of $T:=#TYPE
  122. /RETURN <. up:$up, up2:$up2, typ:$T .>/
  123. ##
  124. #IDLIST
  125. (* #CM $ID #CM / $L !!:=(. $ch $ID .) ; $ch:=',' / * ',' )
  126. / RETURN $L /
  127. ##
  128. #TYPE
  129. ( ( #NUMBER '..' $a) ! integer ! longint )
  130. / RETURN (. INTEGER NULL .) /;;
  131. text / RETURN (. INTEGER NULL .) / ;;
  132. boolean / RETURN (. LOGICAL NULL .)/ ;;
  133. real / RETURN (. REAL NULL .) / ;;
  134. ( $TD:=#ARDEF !
  135. ( ['^'] $M / $TD:=LAST #F $TYPES.$M / ))
  136. / IF $TD ->
  137. IF $TD.up2 ->
  138. RETURN (. $TD.typ (. '(' $TD.up ',' $TD.up2 ')'.) .)
  139. ELSIF T->
  140. RETURN (. $TD.typ (.'(' $TD.up ')'.) .)
  141. FI
  142. ELSIF T->
  143. RETURN (. (.$M '***'.) (.$M '***'.) .)
  144. FI
  145. /
  146. ##
  147. #D / $S:=(.' '.)/
  148. [ $X / $S:=(.' '.)/ ]
  149. /$I:=COPY(LAST #F $LEVEL);
  150. LOOP
  151. IF $I<=0 -> RETURN #IMPLODE($S)
  152. ELSIF T-> $S!.:=' '
  153. FI;
  154. $I+:=-1;
  155. END/##
  156. #CO $N
  157. / F<< $N #D(X) CONTINUE /
  158. ##
  159. #GENLAB
  160. / LAST #PROCEDURE $lab+:=1;
  161. RETURN COPY(LAST #PROCEDURE $lab) / ##
  162. #BLOCK begin (* #CM [#LABEL] #CM #STMT #CM* ';' ) [';'] [#LABEL]#CM end #CM ##
  163. #LABEL
  164. $N #CM ':'
  165. / #CO($N); F<<'CC LABEL ' $N/
  166. ##
  167. #STMT
  168. /LAST #F $LEVEL+:=1; S<]$/
  169. #CM
  170. ( (V'($$=if) #IF) !
  171. (V'($$=for) #FOR) !
  172. (V'($$=goto) #GOTO) !
  173. (V'($$=begin) #BLOCK) !
  174. (V'($$=while) #WHILE) !
  175. (V'($$=repeat) #REPEAT) !
  176. (V'($$=case) #CASE) !
  177. (V' ($$=halt) #HALT) !
  178. (V' ($$=Halt) #HALT) !
  179. #OPEN ! #IO !
  180. (V'($$=close) #CLOSE) !
  181. #ASSIGN ! V'($$=end) ! V'($$=until) ! V'(#NUMBER($$)) ! #CALL !
  182. /S<<'(*****' $$ '******)'/ )
  183. /LAST #F $LEVEL+:=-1/
  184. #CM
  185. ##
  186. #OPEN
  187. ('assign'!'Assign') '(' $f ',' $e:=#EXPR
  188. / $e[-1]:=NULL;
  189. F<< #D() ' OPEN( ' #FILE($f) ',file=' $e ',status='/ ;;
  190. ( 'rewrite'!'Rewrite') '(' $f ')'
  191. / F<<'''unknown''' /;;
  192. ('reset'!'Reset') '(' $f ')'
  193. / F<<'''old''' /
  194. ##
  195. #HALT
  196. ('halt'!'Halt') / F<< #D() 'STOP' /
  197. ##
  198. #CM
  199. (*
  200. /$A:=NULL/
  201. (
  202. ('(' '*') !
  203. ('(' '**')!
  204. '{')
  205. (* $A!.:=S'(($$<>'}')AND($$<>'**')AND($$<>'*')) *)
  206. (
  207. ( '**' ')')!
  208. ( '*' ')')!
  209. '}')
  210. /F<<C;
  211. $L:=0;
  212. FORALL $X IN $A DO
  213. $L:=$L+#LEN($X)+1;
  214. IF $L>70 -> F<<C;$L:=#LEN($X);FI;
  215. F<]$X;
  216. IF $X=';' -> F<<C;$L:=1;FI;
  217. OD
  218. ;S<<C '"' $A '"'/ *)
  219. ##
  220. #CLOSE
  221. (close!Close) '(' $f ')'
  222. / F<<#D() 'close('#FILE( $f) ')'/
  223. ##
  224. #CASE
  225. /$W:='IF'/
  226. case #CM $A:=#EXPR of
  227. (*
  228. #CM
  229. V'(($$<>'end')AND($$<>'else'))
  230. $D ':'
  231. / F<< #D() $W '(' $A '.eq.' $D ') THEN';
  232. $W:='ELSE IF'/
  233. #STMT [';']
  234. #CM
  235. *)
  236. [ #CM 'else' #CM
  237. / F<<#D() 'ELSE' /
  238. #STMT [';'] #CM
  239. ]
  240. #CM
  241. ('end' /F<<#D() 'ENDIF '/ !
  242. $X /S<<'ERROR: case end not found on ' $X /)
  243. ##
  244. #IO
  245. (read!readln) '(' $f V'(#EXPLODE($f)[1]='f') ',' $E:=#EXPR
  246. /
  247. $E[-1]:=NULL;
  248. F<<#D() 'READ(' #FILE($f) ',*)' @ $E / ;;
  249. (read!readln) '(' $E:=#EXPR
  250. / $E[-1]:=NULL;
  251. F<<#D() 'READ(*,*)' @ $E / ;;
  252. (write!writeln) '(' $f V'(#EXPLODE($f)[1]='f') ',' $E:=#EXPR
  253. /
  254. $E[-1]:=NULL;
  255. F<<#D() @ 'WRITE(' #FILE($f) ',*)' $E / ;;
  256. (write!writeln) '(' $E:=#EXPR
  257. / $E[-1]:=NULL;
  258. F<<#D() @ 'WRITE(*,*)' $E / ;;
  259. (new!New) '(' $X ')' ;; -- ignored
  260. (inc!Inc) '(' $E:=#EXPR
  261. /$E[-1]:=NULL;
  262. F<<#D() $E '=' $E '+1' /;;
  263. (dec!Dec) '(' $E:=#EXPR
  264. /$E[-1]:=NULL;
  265. F<<#D() $E '=' $E '-1' /
  266. ##
  267. #WHILE
  268. while $E:=#EXPR do
  269. / $LAB:=#GENLAB();
  270. F<< $LAB #D(X) 'IF (' $E ') THEN ' /
  271. #STMT
  272. / F<< #D() 'GOTO ' $LAB ;
  273. F<< #D() 'ENDIF' / ##
  274. #REPEAT
  275. repeat #CM
  276. / $LAB:=#GENLAB();
  277. F<<'CC repeat ';
  278. #CO($LAB) /
  279. (* #CM [ #LABEL]#CM #STMT #CM * ';' )#CM [';']#CM [#LABEL]#CM
  280. until #CM
  281. $E:=#EXPR #CM
  282. / F<<'CC UNTIL';
  283. F<<#D(X) 'IF (.not.(' $E ')) GOTO' $LAB /
  284. ##
  285. #CALL
  286. (exit!Exit) / F<< #D() 'RETURN' / ;;
  287. $E:=#EXPR V'($E) / F<< #D() CALL @ $E / ##
  288. #ASSIGN
  289. $E:=#EXPR ':=' $E2:=#EXPR
  290. / F<<#D() @ $E '=' $E2 /
  291. ##
  292. #EXPR (* #CM $A !. := #EXPREL #CM *) / RETURN $A / ##
  293. #EXPREL $E
  294. / IF #CALL_PAS(79 LAST #F $SY0 $) -> FAIL;FI;
  295. $N:=#CALL_PAS(79 LAST #F $SY1 $);
  296. IF $N>0 ->
  297. RETURN LAST #F $SY2[$N];
  298. ELSIF T->
  299. RETURN $
  300. FI;
  301. / ##
  302. #BACKEL
  303. / $B:=(. ' .lt. ' ' .gt. ' ' .le. ' ' .ge. ' ' .eq. ' ' .ne. ' '(' ')'
  304. ' .and. ' ' .or. ' ' .not. '.);
  305. $S:=(. ' .ge. ' ' .le. ' ' .gt. ' ' .lt. ' ' .ne. ' ' .eq. ' '(' ')'
  306. ' .or. ' ' .and. ' ' '.);
  307. $N:=#CALL_PAS(79 $B $);
  308. IF $N>0 ->RETURN $S[$N]
  309. ELSIF T-> RETURN $
  310. FI/ ##
  311. #BACK (* $A !.:=#BACKEL *) / RETURN $A / ##
  312. #IF
  313. if $e:=#EXPR then
  314. / F<<#D() @ 'IF (' $e ') THEN' /
  315. #STMT
  316. [ else / F<< #D() 'ELSE' /
  317. #STMT ]
  318. /F<< #D() ENDIF/
  319. ##
  320. #FOR
  321. for
  322. / $LAB:=#GENLAB(T);
  323. $OUT:=#GENLAB(T);
  324. /
  325. $lv ':=' $e1:=#EXPR
  326. (( 'to' $e2:=#EXPR 'do'
  327. / F<<#D()@ 'if (' $e2 '.lt.' $e1 ') goto ' $OUT;
  328. F<<#D()@ 'DO ' $LAB ',' $lv '=' $e1 ',' $e2 ;
  329. /)
  330. !
  331. ('downto' $e2:=#EXPR 'do'
  332. / F<<#D()@ 'if (' $e2 '.gt.' $e1 ') goto ' $OUT;
  333. F<<#D()@ 'DO ' $LAB ',' $lv '=' $e1 ',' $e2 ',-1' ;
  334. /
  335. ))
  336. #STMT
  337. /#CO($LAB);
  338. #CO($OUT)/
  339. ##
  340. #GOTO goto $L / F << #D() GOTO $L / ##