// // Copyright (C) 1999, 2000 Refal+ Development Group // // Refal+ is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // Refal+ is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Refal+; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // $Id$ $use "rfp_src"; // rfp_src.rfi $use "rfp_err"; // rfp_err.rfi $use "rfp_lex"; // rfp_lex.rfi $use "rfp_parse"; // rfp_parse.rfi $use "rfp_compile"; // rfp_compile.rfi $use "rfp_asail_cpp"; //rfp_asail_cpp.rfi $use "rfp_asail_java"; //rfp_asail_java.rfi $use "rfp_asail_tpp"; //rfp_asail_tpp.rfi $use "rfp_asail_jbc"; $use "rfp_as2as"; $use "rfp_check"; $use "rfp_helper"; $use "rfp_format"; $use "rfp_asail2asail"; $import "java.io.FileOutputStream"; $import "org.refal.plus.comp.CompilerEnvironment"; $use Access Arithm Box Class Compare Convert CppMangle File Java JavaMangle Dos List Table StdIO; $const RevDate = ('$Revision$') ('$Date$'); $func Version = e.version; // information about available compiler options $box Options; // put information about compiler options in the &Options box $func Init_Options = ; // display help screen $func Display_Help = ; $func Parse_Args (e.files) (e.prevarg) s.index = e.files; $func Set_Path = ; // initialize tables $func Get_Ready_For_Compilation e.Items = ; $func CPP_Pretty_Print s.Isinner_call s.channel (e.indent) e.expr = ; // print information about compilation stages when -verbose option is // supplied on command line $func Verbose e.string = ; $func Open_Channel e.name (e.ext) = s.channel s.Isneed_close; $func? Compilation_Failed = ; CompileModule s.env = , > : (s t.ModuleName e.Items), , , :: e.Items, :: t.module, { = t.module; ; } :: t.module, { : e (s.bytecode e.java_module_name) e, s.bytecode>, $fail;; }; Main = , :: e.files, , , : s.dir_separator, e.files : { /*empty*/ = { ; >, 'Usage: rfpc' :: e.start, :: s.st_len, , :: s.len, , { : e (((e.next) e) t e.descr) e, ) (3)>, { e.descr : (e.arg) e = ' [-' e.next ' <' e.arg '>]'; ' [-' e.next ']'; } :: e.next, :: s.n_len, > s.n_len> :: s.new, { = >, , >; ; }, , $fail; ; }, , ; }; e01 (e.file) e02, { e.file : $r e.basename '.' e.ext = e.basename (' .' e.ext); e.file (); } :: e.in_basename (e.ext), { e01 : /*empty*/, ; e.in_basename; } :: e.basename, { = e.in_basename; e.basename; } :: e.headname, { e.headname : $r e.dirname s.dir_separator e.filename = (e.dirname) e.filename; ('.') e.headname; } :: (e.dirname) e.filename, { e.ext : \{ ' .rf'; ' .rfi'; } = , { ; "Compilation-Failed!"; } :: t.as, { : e (e.error) e, e.error : { ERROR ((e.efile) ((s.row s.column) t)) (e.message) = e.efile : s.efiletype e.efilename, " " s.efiletype ": " s.row ", " s.column " --- Error: " e.message>; WARNING ((e.efile) ((s.row s.column) t)) (e.message) = e.efile : s.efiletype e.efilename, " " s.efiletype ": " s.row ", " s.column " --- Warning: " e.message>; }, $fail; t.as : "Compilation-Failed!" = //, ; , "AS-REFAL" t.as; }; e.ext : ' .asr' = :: s.channel, , "AS-REFAL" ; e.ext : ' .ast' = :: s.channel, , "AS-TRANSFORMED" ; e.ext : ' .asi' = :: s.channel, , "AS-AIL" ("AS-AIL" "AS-AIL" ); = ; } : s.type (s.tag t.ModuleName e.Items), { s.type : "AS-AIL"; ; }, s.type e.Items $iter s.type : { "AS-REFAL" = { = :: s.channel s.Isneed_close, , { s.Isneed_close : 1 = ;; };; }, \{ : /*empty*/; ; }, { ; , , = \{ : /*empty*/; ; }; }, , { = e.Items; , :: e.Items, , e.Items; } :: e.Items, "AS-TRANSFORMED" e.Items; "AS-TRANSFORMED" = { = :: s.channel s.Isneed_close, , { s.Isneed_close : 1 = ;; };; }, , , :: t.asail, , "AS-AIL" t.asail; "AS-AIL" = e.Items : t.module, { = t.module; , :: t.module, = t.module; } :: t.module , { = :: s.channel s.Isneed_close, , { s.Isneed_close : 1 = ;; };; }, \{ , , :: e.module, , :: s.channel s.Isneed_close, , { s.Isneed_close : 1 = ;; }, $fail; // , e.asail-module : v, // , // :: e.module, // , // :: s.channel s.need-close?, // , // { s.need-close? : 1 = ;; }, // $fail; , , :: (e.javaModuleName) (e.module), // { // = e.basename; // e.dirname : v = e.dirname s.dir-separator ; // ; // } :: e.javaModuleName, { = ; ('.java')>; } :: s.channel s.Isneed_close, , { s.Isneed_close : 1 = ;; }, , $fail; , , // { // : e (e.dir) e, // e.dirname : \{ // e.dir = (e.dir s.dir-separator) /*empty*/; // e.dir s.dir-separator e.package = (e.dir s.dir-separator) e.package; // }; // () e.dirname; // } :: (e.dir) e.package, { : e (s.bytecode e.javaModuleName) e, ".class">> :: s.stream, , , $fail;; }, , $fail; }; } :: s.type e.Items, $fail; e.all_files_have_gone; }; Init_Options = to the list of directories to be searched" "for .rfi files") ((('B') ('bootpath')) BPATH ("dir") "add to the list of directories to be searched" "for standard library .rfi files") ((('ne') ('no-elaborate')) (BIND "NO-ELABORATE")) ((('nc') ('no-check')) (BIND "NO-CHECK") "don't perform syntax check") ((('nt') ('no-transform')) (BIND "NO-TRANSFORM") "don't perform AS-to-AS transformations") ((('c') ('check')) (BIND CHECK) "check only, causes no file creation in the absence" "of other output control options") ((('no') ('no-optim')) (BIND "NO-OPTIM") "don't perform ASAIL-optimization") ((('ci') ('comp-item')) "COMP-ITEM" ("item") "compile only, not the whole source" "(may be used several times)") ((('e') ('entry')) ENTRY ("func") "use function as an entry to the program") ((('h') ('help')) HELP /*"display this help screen"*/) ((('v') ('verbose')) (BIND VERBOSE) "display information about the stages of compilation") ((('u')) (BIND "CASE-INSENSITIVE") "convert all symbol-words without surrounding quotes" "to upper case") ((('co')) (BIND "IDENT-COMPATIBILITY") "compatibility with new identivication names") ((('o')) NAME ("name| - ") "place outputs for file1 into files .* or send" "them to stdout") ((('p') ('package')) PACKAGE ("pack") "place output in package ") ((('cc')) (BIND CC) "output C++ code") ((('hh')) (BIND HH) "generate header files") ((('j') ('java')) (BIND JAVA) "output Java code") ((('jbc')) (BIND JBC) "output Java byte-code") ((('t') ('t++')) (BIND TPP) "output T++ code") ((('asr') ('as-refal')) (BIND "AS-REFAL") "output Refal Abstract Syntax") ((('ast') ('as-transformed')) (BIND "AS-TRANSFORMED") "output Refal Abstract Syntax after AS-to-AS" "transformations") ((('asi') ('as-ail')) (BIND "AS-AIL") "output Abstract Syntax of Abstract Imperative" "Language") ((('int')) INT ("class_name") "class to use for literal integers") ((('replace-module')) "REPLACE-MODULE" ("m1" "m2") "use module instead of ") ((('d') ('debug')) (BIND DEBUG)) ((('dbg')) (BIND DBG) "generate text for debugger") ((('trace')) TRACE ("fname") "trace function (may be used several times)") ((('traceall')) (BIND TRACEALL) "trace all functions") >; Display_Help = :: s.line, ' ' :: e.start1, 29 :: s.2nd_col, :: e.start2, >, , , , , { : e (((e.op) e.opts) t e.descr) e, , { e.opts : e (e.next) e, , $fail;; }, { e.descr : (e.params) e.rest = { e.params : e s.par e, '>'>, $fail; e.rest; }; e.descr; } : \{ s.phrase e, >> ' '> s.phrase >, $fail; e s s.phrase e, , $fail; };; }; Parse_Args (e.files) (e.prevarg) s.index = { : v.arg, :: s.index = { e.prevarg : v, e.prevarg : { IPATH = (v.arg)>; BPATH = (v.arg)>; "COMP-ITEM" = { ; /*empty*/; } :: e.items, )>; ENTRY = { ; /*empty*/; } :: e.entries, )>; TRACE = ) ()>; NAME = { v.arg : '-' = &StdOut; v.arg; } :: v.arg, ; PACKAGE = ; INT = ; "REPLACE-MODULE" = "REPLACE-MODULE-2" v.arg; "REPLACE-MODULE-2" e.mod1 = ; } :: e.prevarg, ; v.arg : '-' e.opt = { \{ : e ((e (e.opt) e) t.action e) e = t.action; e.opt : '-' e.o, : e ((e (e.o) e) t.action e) e = t.action; } : { (BIND s.option) = ; HELP = , ; s.other = s.other; } :: e.prevarg, ; , ; }; ; }; e.prevarg : v = , ; { ; ; }, e.files; }; Set_Path = ) ( &RFP_Default_Boot_Path)>>, ) ()>>; Get_Ready_For_Compilation e.Items = , , , , { e.Items : e t.Item e, t.Item : \{ (s.Linkage s.ItemType t.Pragma t.ItemName e.ItemBody), s.ItemType : { FUNC = : (e.in) (e.out), &Fun () (); TFUNC = : (e.in) (e.out), &Fun () (); "FUNC?" = : (e.in) (e.out), &IsFun () (); CONST = &Const e.ItemBody; s = &Object e.ItemBody; } :: s.tab e.ItemDef, ; (EXTERN t.Pragma t.FName) = ; }, $fail; { = , ;; }; }; RFP_Pretty_Print s.channel (e.indent) e.expr = e.expr : { e0 (e1) e2 = , { e.indent : v = ;; }, , , { e1 : e (e) e = , ; ; }, { e2 : (e) e = ; e2 : , e.indent : v = ; , ; }, ; v1 = ; =; }; $const Tab = ' '; CPP_Pretty_Print s.Isinner_call s.channel (e.indent) e.expr, e.expr : { e0 (e1) e2 = { s.Isinner_call : 0 = ;; }, { e0 : /*empty*/, { e1 : LABEL e.label = e.indent : e.ind &Tab, ; e1 : /*empty*/ = ; ; }; , ; }, ; v1 = ; /*empty*/ = /*empty*/; }; Verbose e.string, { = ": " e.string>;; }; Open_Channel { symbol (e), = symbol 0; e.name (e.ext) = :: s.channel, { = s.channel 1; , , $fail; }; }; Compilation_Failed = ; Version = { &RevDate : (e ' ' v.rev ' ' e) (e ' ' v.date ' ' e) = '2.0-beta-' v.rev ', ' v.date; '2.0-unknown-beta'; };