| In this directory is the source to the bootstrap tool mc. The tool | |
| converts PIM4 Modula-2 into C or C++ and it implements some of the GNU | |
| Modula-2 extensions. It uses the same lexical and grammar as GNU | |
| Modula-2, but restricts some of the features. | |
| Local modules are not supported and constant aggregate types are not | |
| supported (with the exception of SET constant aggregate types). It | |
| has the ability to translate Modula-2 into C/C++, it uses the same | |
| name space convension as GNU Modula-2 and it issues source file | |
| directives in the target language which match the original source. | |
| The tool mc uses multiple passes primarily to keep the implementation | |
| simple. The function of each pass is defined here: | |
| Pass 1 | |
| define module symbols (def, imp, program, local) and find their source | |
| files if appropriate. | |
| parse definition modules and any extended opaque implementation module | |
| and the implementation/program module. | |
| define root decls for all CONST, TYPE, PROCEDURE, VAR, symbols | |
| (the left hand side for all declarations). | |
| push and pop scope symbols as the source is parsed. | |
| populate the export lists for the def modules | |
| Pass 2 | |
| parse definition modules and any extended opaque implementation module | |
| and the implementation/program module. | |
| complete declaration of the right hand side of TYPE: | |
| equivalence: TYPE foo = bar ; | |
| equivalence: TYPE foo = bar.x ; | |
| enumerations: TYPE foo = (a, b, c) ; | |
| completely define enumeration types and place them into | |
| a per module list of enumerations. | |
| Pass 3 | |
| parse definition modules and any extended opaque implementation module | |
| and the implementation/program module. | |
| process the import lists for the def | |
| introducing the symbol from another modules export list. | |
| remembering to populate the enum and all fields if they are imported. | |
| mark any opaque type (in the definition module). | |
| create placeholders for expression and constexpression | |
| and put these into a list. | |
| complete const/type/var/procedure declarations (using | |
| expression placeholders). | |
| Pass 4 | |
| parse definition modules and any extended opaque implementation module | |
| and the implementation/program module. | |
| build expressions and constexpressions | |
| and attach them to their placeholders. | |
| at this point all definition module symbols are completely finished. | |
| at this point const/types should be completely declared for the | |
| implementation/program module | |
| Pass 5 | |
| only parse the implementation or program module | |
| build a tree for all procedure and main init code. | |
| build expressions and constexpressions | |
| and attach them to their placeholders. | |
| for each exported symbol, s | |
| topological sort and define s | |
| topological sort and define init code |