#! /usr/bin/gawk -f # Last edited on 2009-10-28 23:55:02 by stolfi # Does a first approximation of converting Modula-3 code to C. /MODULE|INTERFACE/ { printf "#ifndef _H\n#define _H\n\n"; next; } //{ $0 = gensub(/END [a-zA-Z0-9_]*[;]/, "END", "g", $0); $0 = gensub(/^( *)VAR +([a-zA-Z][a-zA-Z0-9_, ]*)[:] *([a-zA-Z_ ]+) *[;]/, "\\1\\3 *\\2;", "g", $0); $0 = gensub(/^( *)([a-zA-Z][a-zA-Z0-9_, ]*)[:] *([a-xA-Z_]+) *[;]/, "\\1\\3 \\2;", "g", $0); $0 = gensub(/([^<>:])[=]/, "\\1==", "g", $0); $0 = gensub(/ # /, "!=", "g", $0); $0 = gensub(/[:][=]/, "=", "g", $0); $0 = gensub(/[(][*]/, "/*", "g", $0); $0 = gensub(/[*][)]/, "*/", "g", $0); $0 = gensub(/FOR /, "for (", "g", $0); $0 = gensub(/WHILE /, "while (", "g", $0); $0 = gensub(/RETURN/, "return", "g", $0); $0 = gensub(/LOOP */, "while (1){", "g", $0); $0 = gensub(/ELSIF /, "}else if ((", "g", $0); $0 = gensub(/IF /, "if ((", "g", $0); $0 = gensub(/ DO/, "){", "g", $0); $0 = gensub(/ THEN/, ")){", "g", $0); $0 = gensub(/ELSE/, "}else{", "g", $0); $0 = gensub(/BEGIN/, "{", "g", $0); $0 = gensub(/END/, ";}", "g", $0); $0 = gensub(/WITH */, "with (", "g", $0); $0 = gensub(/[<][*] *ASSERT /, "assert(", "g", $0); $0 = gensub(/[*][>]/, ");", "g", $0); $0 = gensub(/NIL/, "NULL", "g", $0); $0 = gensub(/^ *[}] *[a-zA-Z_]*[.] *$/, "\n#endif\n", "g", $0); $0 = gensub(/ OR /, ") || (", "g", $0); $0 = gensub(/ AND /, ") && (", "g", $0); $0 = gensub(/\bABS\b/, "abs", "g", $0); $0 = gensub(/\bMAX\b/, "max", "g", $0); $0 = gensub(/\bMIN\b/, "min", "g", $0); $0 = gensub(/TEXT */, "char *", "g", $0); $0 = gensub(/CARDINAL/, "unsigned", "g", $0); $0 = gensub(/LONGREAL/, "double", "g", $0); $0 = gensub(/Wr.Close/, "fclose", "g", $0); $0 = gensub(/Wr.Flush/, "fflush", "g", $0); $0 = gensub(/FLOAT[(]([^()]*), double[)]/, "((double)\\1)", "g", $0); print; }