IMCC - syntax
- 0.1 initial
This document describes the IMCC syntax.
Comments start with # and last until the following newline.
These and empty lines are ignored.
A valid imcc program consists of a sequence of statements.
A statement is terminated by a newline (<NL>).
[label:] [instruction] <NL>
Optional label for the given instruction, can stand on its own line. Global labels start with an underscore, local labels shouldn't. A label must conform to the syntax of identifier described below.
- <identifier>
- Start with a letter or underscore, then may contain additionally digits and ::.
- Example:
a
_a
A42
a::b_c
- <type>
- int, float, string, pmc or a valid parrot PMC type like PerlArray.
- <reg>
- A PASM register I0..I31, S0..S31, N0..N31, P0..P31, or a IMCC temporary register $In, $Sn, $Nn, $Pn, where n consists of digit(s) only. The parrot register P31 is reserved for spilling and should not be used in complex code sections, which might need spilling (see operation.pod).
- <var>
- A local identifier or a reg or a constant (when allowed).
- "string constants"
- Are delimited by ". A " inside a string must be escaped by \". Only 7-bit ASCII is accepted in string constants; to use characters outside thar range, specify an encoding in the way below.
- charset:"string constant"
- Like above with a chracter set attached to the string. Valid character sets are currently:
ascii
(the default), binary
, unicode
(with UTF-8 as the default encoding), and iso-8859-1
.
Inside double-quoted strings the following escape sequences are processed.
\xhh 1..2 hex digits
\ooo 1..3 oct digits
\cX control char X
\x{h..h} 1..8 hex digits
\uhhhh 4 hex digits
\Uhhhhhhhh 8 hex digits
\a, \b, \t, \n, \v, \f, \r, \e, \\
- encoding:charset:"string constant"
- Like above with an extra encoding attached to the string. For eample:
set S0, utf8:unicode:"«"
- The encoding and charset gets attaced to the string, no further processing is done, specifically escape sequences are not honored.
- 'char constant'
- Are delimited by '. They are taken to be
ascii
encoded. No escape sequences are processed.
- numeric constants
- 0x and 0b denote hex and binary constants.
- .pragma n_operators
- Convert arithmethic infix operators to n_infix operations. The unary opcodes
abs
, not
, bnot
, bnots
, and neg
are also changed to use a n_ prefix.
.pragma n_operators 1
.sub foo
...
$P0 = $P1 + $P2 # n_add $P0, $P1, $P2
$P2 = abs $P0 # n_abs $P2, $P0
- .HLL "hll_name", "hll_lib"
- Define the HLL for the current module. If the string
hll_lib
isn't empty this compile time pragma also loads the shared lib for the HLL, so that integer types are working for creatin new PMCs.
- .sub <identifier>
- .end
- Define a compilation unit with the label identifier:.
- .emit
- .eom
- Define a compilation unit containing PASM code.
- .local <type> <identifier>
- .sym <type> <identifier>
- Define a local name identifier for this compilation unit and of the given type. You can define multiple identifiers of the same type by separating them with commas: .sym int i, j
- .const <type> <identifier> = <const>
- Define a named constant of style type and value const.
- .namespace <identifier>
- .endnamespace <identifier>
- Defines the range of a namespace. Local variables inside a namespace are mangled as <namespaceidentifier::varidentifier>.
- .pcc_*
- Directives used for Parrot Calling Conventions.
- .param <type> <identifier>
- Like .local and generates PASM restore identifier.
- .param <reg>
- .result <var>
- restore from stack.
- .arg <var>
- .return <var>
- save on stack.
Instructions may be a valid PASM instruction or anything listed here below:
- goto <identifier>
- branch <identifier>.
- if <var> goto <identifier>
- unless <var> goto <identifier>
- Translate to if x, identifier or unless ...
- if <var> <relop> <var> goto <identifier>
- The relop <, <=, ==, != >= > translate to the PASM opcodes lt, le, eq, ne, ge or gt var, var, identifier.
- unless <var> <relop> <var> goto <identifier>
- Like above, but branch if condition isn't met.
- <var> = <var>
- set var, var
- <var> = <unary> <var>
- The unarys !, - and ~ generate not, neg and bnot ops.
- <var> = <var> <binary> <var>
- The binarys +, -, *, /, % and ** generate add, sub, mul, div, mod and pow arithmetic ops. binary . is concat and valid for string arguments.
- << and >> are arithmetic shifts shl and shr. >>> is the logical shift lsr.
- &&, || and ~~ are logic and, or and xor.
- &, | and ~ are binary band, bor and bxor.
- <var> = <var> [ <var> ]
- This generates either a keyed set operation or substr var, var, var, 1 for string arguments and an integer key.
- <var> [ <var> ] = <var>
- A keyed set operation or the assign substr op with a length of 1.
- <var> = new <type>
- new var, .type
- <var> = new <type>, <var>
- new var, .type, var
- <var> = defined <var>
- defined var, var
- <var> = defined <var> [ <var> ]
- defined var, var[var] the keyed op.
- global "string" = <var>
- store_global "string", var
- <var> = global "string"
- find_global var, "string"
- <var> = clone <var>
- clone var, var
- <var> = addr <var>
- set_addr var, var
parsing.pod, calling_conventions.pod
imcc.l, imcc.y
Leopold Toetsch <lt@toetsch.at>
Hey! The above document had some coding errors, which are explained below:
- Around line 95:
- You forgot a '=back' before '=head2'
- Around line 107:
- '=item' outside of any '=over'