Source file preprocessing
Source file character encoding
The Mosel compiler expects source files to be encoded in UTF-8 and will handle properly UTF-16 and UTF-32 encodings when the file begins with a BOM (Byte Order Mark). It is also possible to select an alternative encoding using the encoding annotation (see section Annotations).
For instance to notify the compiler that the the source file is encoded using ISO-8859-1, the following comment has to be copied at the beginning of the fie:
!@encoding:iso-8859-1
Source file inclusion
A Mosel program may be split into several source files by means of file inclusion. The 'include' instruction performs this task:
include filename |
where filename is the name of the file to be included. This file name may contain environment variable references using the notation ${varname} (e.g. '${MOSEL}/examples/mymodel') that are expanded to generate the actual name. The 'include' instruction is replaced at compile time by the contents of the file filename.
Assuming the file a.mos contains:
model "Example for file inclusion" writeln('From the main file') include "b.mos" end-model
And the file b.mos:
writeln('From an included file')
Due to the inclusion of b.mos, the file a.mos is equivalent to:
model "Example for file inclusion" writeln('From the main file') writeln('From an included file') end-model
If the compiler option -ix is used (Section Running Mosel) all file names used in the 'include' instruction will be prefixed as requested. For instance, if the option -ix "incdir/" is used with the compiler, the statement include "myfile.mos" will be replaced by the content of "incdir/myfile.mos".
Note that file inclusion cannot be used inside of blocks of instructions or before the body of the program (as a consequence, a file included cannot contain any of the following statements: uses, options or parameters).
Line control directives
In some cases it may be useful to process a Mosel source through an external preprocessor before compilation. For instance this may enable the use of facilities not supported by the Mosel compiler like macros, unrestricted file inclusion or conditional compilation. In order to generate meaningful error messages, the Mosel compiler supports line control directives: these directives are inserted by preprocessors (e.g. cpp or m4) to indicate the original location (file name and line number) of generated text.
#[line] linenum [filename] |
To be properly interpreted, a line control directive must be the only statement of the line. Malformed directives and text following valid directives are silently ignored.