NAME

IMCC - parsing

VERSION

0.1 initial
0.2 lexicals
0.3 pod markers
0.4 deprecate nested subs and code outside compilation units

OVERVIEW

This document describes the basic parsing functionality of IMCC.

DESCRIPTION

IMCC parses and generates code in terms of compilation units. These are self-contained blocks of code very similar to subroutines.

Code for a compilation unit is created as soon (or not earlier) as the end of the unit is reached.

General imcc syntax

program: subs

subs: statements ...

Comments

Comments start with #, which may appear at any point on a line, and end at the end of the line.

POD sections

Everything enclosed in POD markers is ignored.

=some_pod_marker in col 1
...
=cut

A POD section starts with a = in column 1 and ends with a =cut on a line on its own.

Compilation units

Subroutines: .sub ... .end

This code:

.sub name
	statements
	...
.end

defines a subroutine with the entry point _name. Subroutine entry points have to start with an underscore (as do all other global labels). The statements in the subroutine must be valid PIR or PASM.

Subroutines: .pcc_sub ... .end

.sub name
	statements
	...
.end

As above, but using the Parrot calling conventions. See docs/calling_conventions.pod for more details.

Assembly blocks .emit ... .eom

This code:

.emit
_sub1:
	pasm_statements
	...
	ret
...
.eom

defines a compilation unit containing PASM statements only. Typical usage is for language initialization and builtins code.

Code outside compilation units

Any code appearing outside of a compilation unit will be ignored (if not now, then in the near future).

Nested subs

Nested subroutines are deprecated and will be removed in the near future.

Symbols, constants and labels

Compilation units maintain their own symbol table containing local labels and variable symbols. This symbol table, hash, is not visible to code in different units.

If you need global variables, please use the global opcode.

Global labels and constants are kept in the global symbol table ghash. This allows for global constant folding beyond the scope of individual subroutines.

Local labels in different compilation units with the same name are allowed, though assembling the generated PASM doesn't work. However, running this code inside imcc is ok. This will probably change in the future so that local labels are mangled to be unique.

SEE ALSO

docs/calling_conventions.pod

FILES

imcc.y, instructions.c, t/syn/sub.t, t/imcpasm/sub.t, t/syn/scope.t

AUTHOR

Leopold Toetsch <lt@toetsch.at>