2 Directives

Directive Syntax

The Mozart compiler understands the full syntax of Oz programs. Additionally, it also accepts directives in its input. A directive can start anywhere on a line and is introduced by a backslash; it always extends until the end of the line.

Directives come in two flavors. So-called compiler directives provide a way to change the compiler's switches, whereas macro directives can be used for inserting files or performing compilation conditionally. While macro directives may appear between any two tokens in the input, the use of compiler directives underlies restrictions as described below.

Compilation Units

A single input file is split into a number of compilation units as follows:

Note that this implies that compiler directives can only appear between top-level Oz statements.

All compilation units in a file are processed sequentially.

2.1 Compiler Directives

\switch ( "+" <switchname> | "-" <switchname> )*

Set ("+") resp. reset ("-") the specified switches. The values for <switchname> the compiler understands are described in Appendix A. Case matters.

\pushSwitches

Save the current settings of all switches onto the internal switch state stack.

\popSwitches

Restore all switch settings from the topmost element of the internal switch state stack, provided it is not empty, else do nothing.

\localSwitches

Save the current settings of all switches as well as the internal switch state stack if no \localSwitches has occurred in the current input before, else do nothing. They are automatically restored after the last compilation unit of the current input has been processed.

2.2 Macro Directives

\line <filename>
\line <int> <filename>

sets the internal file name (and the line number of the subsequent line) to the given values. This data will appear in the error messages and debug information generated by the compiler.

\insert <filename>

is substituted by the contents of the referenced file.

Macro Names

Note that although macro names have the same syntax as Oz variables, there is absolutely no connection between macro names and Oz variables.

\define <variable>

adjoins <variable> to the set of macro names.

\undef <variable>

removes <variable> from the set of macro names.

\ifdef <variable>

causes the text until the next balanced \else or \endif only to be compiled if <variable> is a macro name.

\ifndef <variable>

caused the text until the next balanced \else or \endif to be ignored if <variable> is a macro name.

\else

causes the text until the next balanced \else or \endif to be

  • ignored, if the \else occurred after a text region that was being compiled;

  • compiled, if the \else occurred after a text region that was being ignored.

\endif

terminates the active \ifdef or \ifndef. Every \ifdef and every \ifndef must be terminated by a corresponding \endif.


Leif Kornstaedt
Version 1.0.1 (19990218)