// $Id$ $use Access Arithm Box Class Compare Convert Dir Dos File List StdIO Table; $use "rfpc" "rfp_src" "rfp_lex" "rfp_parse" "rfp_helper"; // information about available options $box Options; // put information about 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 Build_Substs e.items = ; $func Find_Defs e.items = ; $func Find_Dupls = e.dupls; $func Convert e.name = e.name; $func ConvertSym s.sym = e; $func? Is_IdentReally e.expr = ; $func? IsIdentSymbol s.sym = ; $table Renamings; $table Def_Pos; $table QNames; $table Uses; $table Dupls; $box Parse; $box Substs; $const Std_Renamings = ((Arithm "-") (Arithm Sub)) ((Arithm "Div-Rem") (Arithm DivRem)) ((Box "?") (Box Get)) ((Compare ">=") (Compare Ge)) ((Compare ">") (Compare Gt)) ((Compare "<=") (Compare Le)) ((Compare "<") (Compare Lt)) ((Compare "/=") (Compare Ne)) ((Compare "=") (Compare Eq)) ((Convert "To-Lower") (Convert ToLower)) ((Convert "To-Upper") (Convert ToUpper)) ((Convert "Chars-To-Bytes") (Convert CharsToBytes)) ((Convert "Bytes-To-Chars") (Convert BytesToChars)) ((Convert "To-Chars") (Convert ToChars)) ((Convert "To-Word") (Convert ToWord)) ((Convert "To-Int") (Convert ToInt)) ((StdIO "Open-File") (StdIO OpenFile)) ((StdIO "Close-Channel") (StdIO CloseChannel)) ((StdIO "Erase-File") (StdIO EraseFile)) ((StdIO "Parse-File-Name") (StdIO ParseFileName)) ((StdIO "EOF?") (StdIO IsEof)) ((StdIO "Read-Char") (StdIO ReadChar)) ((StdIO "Read-Line") (StdIO ReadLine)) ((StdIO "Read!") (StdIO ReadCh)) ((StdIO "Read-Char!") (StdIO ReadCharCh)) ((StdIO "Read-Line!") (StdIO ReadLineCh)) ((StdIO WriteLN) (StdIO WriteLn)) ((StdIO "Write!") (StdIO WriteCh)) ((StdIO "WriteLN!") (StdIO WriteLnCh)) ((StdIO PrintLN) (StdIO PrintLn)) ((StdIO "Print!") (StdIO PrintCh)) ((StdIO "PrintLN!") (StdIO PrintLnCh)) ((StdIO "Flush!") (StdIO Flush)) ((StdIO "Prim-Open-File") (StdIO PrimOpenFile)) ((StdIO "Prim-Close-Channel") (StdIO PrimCloseChannel)) ((StdIO "Prim-Read") (StdIO PrimRead)) ((StdIO "Read-Chunk-Size") (StdIO ReadChunkSize)) ((String "String-Init") (String StringInit)) ((String "String-Fill") (String StringFill)) ((String "String-Length") (String StringLength)) ((String "String-Ref") (String StringRef)) ((String "String-Set") (String StringSet)) ((String "String-Replace") (String StringReplace)) ((String "Substring-Fill") (String SubstringFill)) ((Table "Table-Copy") (Table TableCopy)) ((Table "Replace-Table") (Table ReplaceTable)) ((Table "Clear-Table") (Table ClearTable)) ((Table "In-Table?") (Table IsInTable)) ((Table "Table-Size") (Table TableSize)) ((Vector "Vector-To-Exp") (Vector VectorToExp)) ((Vector "Vector-Init") (Vector VectorInit)) ((Vector "Vector-Fill") (Vector VectorFill)) ((Vector "Vector-Length") (Vector VectorLength)) ((Vector "Vector-Ref") (Vector VectorRef)) ((Vector "Vector-Set") (Vector VectorSet)) ((Vector "Vector-Replace") (Vector VectorReplace)) ((Vector "Subvector-Fill") (Vector SubvectorFill)) ((Dir "Open-Dir") (Dir OpenDir)) ((Dir "Close-Dir") (Dir CloseDir)) ((Dir "Read-Dir") (Dir ReadDir)) ((File "Path-Separator") (File PathSeparator)) ((File "Dir-Separator") (File DirSeparator)) ((File "Exists?") (File Exists)) ((File "Can-Read?") (File CanRead)) ((File "Can-Write?") (File CanWrite)) ((File "Can-Exec?") (File CanExec)) ((File "Is-Directory?") (File IsDirectory)) ((File "Is-File?") (File IsFile)) ((File "Last-Modified") (File LastModified)) ((List "Map!") (List MapIn)) ((Bit "Bit-Or") (Bit BitOr)) ((Bit "Bit-And") (Bit BitAnd)) ((Bit "Bit-Xor") (Bit BitXor)) ((Bit "Bit-Not") (Bit BitNot)) ((Bit "Bit-Left") (Bit BitLeft)) ((Bit "Bit-Right") (Bit BitRight)) ((Bit "Bit-Test") (Bit BitTest)) ((Bit "Bit-Set") (Bit BitSet)) ((Bit "Bit-Clear") (Bit BitClear)) ((Bit "Bit-Print") (Bit BitPrint)) ((Bit "Bit-Length") (Bit BitLength)) /* End of Std-Renamings */; $channel In Out; Main = // <"rfpc.Main">; , :: e.files, , { # = , ;; }, { &Std_Renamings : e1 ((e s.old) (e.mod s.new)) e2, { = >) (e.mod s.new)>; ) (e.mod s.new)>; }, $fail;; }, : s.dir_separator, { e.files : e (e.file) e \? e.file : { $r e.dir s.dir_separator e.name '.' e.ext = e.name (); $r e.name '.' e.ext = e.name (); } :: e.name (e.ext), :: s.name, e.ext : { 'rf' = :: (e.qname) (e.interf_reader) (e.implem_reader), { e.interf_reader : /*empty*/; :: (e.interf_tokens) e, >, ; }, :: (e.tokens) e, e.tokens; 'rfi' = > :: (e.tokens) e = e.tokens; } :: e.tokens, , >, , :: e.dupls, , , s.dir_separator s.name '.' e.ext W>, 1 $iter :: s.line # \{ :: e.line, 1 e.line $iter { e.line : s.ch e.rest_line, { : (s.tag s.line s.col s.len e.subst) e.rest_subst = , { s.tag : \{ Ref = ; ; }>; Def = >; } :: e.subst, { = e.subst; '"' e.subst '"'; }; e.subst; } :: e.subst, , ; , e.rest_line; }; } :: s.col e.line, e.line : /*empty*/ = ; }, , \! $fail;; }; Convert e.name = { : 'is' e = e.name; e.name : e.n '?' = 'Is' e.n; e.name; } :: e.name, ; ConvertSym { '-' = '_'; '+' = 'Add'; '*' = 'Mult'; '/' = 'Div'; '%' = 'Rem'; '@' = 'At'; ' ' = '_'; '.' = '_'; '?' = 'Really'; '!' = 'Yeah'; s1 = s1; }; Is_IdentReally s.first e.rest = \{ , ) (s.first)>; '_' : s.first; }, ; IsIdentSymbol s.sym = \{ ; ; '_.' : e s.sym e; }; Build_Substs e.tokens = e.tokens $iter { e.tokens : t.first e.rest = t.first : { (((s.line s.col) t) (s.tag e.val)), s.tag : \{ WORD = 0; QWORD = 2; } :: s.extra = { : \{ Ref = , Ref; "Object-Decl" = Def; "Func-Decl" = , Def; "Const-Decl" = , Def; } :: s.is_def = { = ; e.val; } :: e.val, { ; : e.mod (e.name), :: e.new_name, e.mod :: e.new_name, , e.new_name; $error "Can't find qualified name for " e.val; } :: e.new_name, s.extra> e.new_name)>; = { = ; e.val; } :: e.val, { s.extra> )>; : 'main' = s.extra> Main)>; }; s.tag : QWORD; = :: e.val, { : Use = { ; $error "Can't find module " e.val; }; e.val; } :: e.val, { = e.val; '"' e.val '"'; } :: e.val, e.val)>; ; '"' e.val '"')>; }; (((s.line s.col) (s.e_line s.e_col)) (s.type e.name)), s.type : \{ SVAR; TVAR; VVAR; EVAR; }, # \{ # ; e.name : '$' e; } = :: s.len, { 1> : s.len = s.len; '.' ; } :: e.new_name s.len, s.len e.new_name)>; (t (SEMICOLON)) = ; (((s.line s.col) t) (s.keyword)), s.keyword : \{ USE = ; \{ BOX; CHANNEL; STRING; TABLE; VECTOR; } = ; CONST = ; \{ FUNC; "FUNC?"; } = ; \{ ERROR; FAIL; EXTERN; ITER; L; R; MODULE; TRACE; TRACEALL; TRAP; USE; IMPORT; WITH; }; } = '$' > :: e.keyw, e.keyw)>; (t (COMMA)) = { : "Const-Processing" = ;; }; \{ (t (REF)); (t (LBRACKET)); } = ; (((s.line s.col) (s.e_line s.e_col)) (COMMENT e.comment)), # \{ e.comment : e (e) e; } = '//' e.comment)>; t = ; }, e.rest; } :: e.tokens, e.tokens : /*empty*/; Find_Defs { e t.item e, t.item : \{ (s.linkage s.type t.pragma (e.mod s.name) t.in t.out (BRANCH (PRAGMA t.file (LINE s.line s.col)) e)), s.linkage : \{ LOCAL; EXPORT; }, , $fail; (s.linkage s.type t.pragma (e.mod s.name) e), :: e.name, { = ; e.name; } :: e.key, , > :: e.mod, ) (e.mod)>; }, $fail; e = ; }; Find_Dupls = () $iter { e.renamings : e ((e.n1) (e.m1 v.s)) e1 ((e.n2) (e.m2 v.s)) e2 = { e.m1 e.m2 : e.m2 e.m1 = $error "Names '"e.n1"' and '"e.n2"' are both converted to '"e.m1 v.s"'";; }, v.s)>, v.s)>, e1 e2 (e.dupls ((e.n1 (e.m1)) (e.n2 (e.m2)) v.s)); (e.dupls); } :: e.renamings (e.dupls), e.renamings : /*empty*/ = e.dupls; 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") ((('ci') ('case-insensitive')) (BIND "CASE-INSENSITIVE") "convert words without surrounding quotes to upper case") ((('h') ('help')) HELP /*"display this help screen"*/) ((('o')) OUT ("dir") "place output in the directory ") ((('p') ('package')) PACKAGE ("pack") "place output in the package ") ((('d') ('debug')) (BIND DEBUG)) >; 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 )>; OUT = ; PACKAGE = ; } :: 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; };