Supported C language subset: - Expressions: * binary operators, by decreasing priority order: '*' '/' '%', '+' '-', '>>' '<<', '<' '<=' '>' '>=', '==' '!=', '&', '^', '|', '=', '&&', '||'. * '&&' and '||' have the same semantics as C : left to right evaluation and early exit. * Parenthesis are supported. * Comma operator is supported. * Trinary operator (?:) is not supported. * Unary operators: '&', '*' (pointer indirection), '-' (negation), '+', '!', '~', '++' and '--'. * Pointer indirection ('*') is supported. * Square brackets are supported. * '=' and <op>= are supported. * Function calls are supported with standard Linux calling convention. Function pointers are supported. Functions can be used before being declared. - sizeof() is not supported. - Types: + int, short, char, float, double + pointers + variables can be initialized in declarations. + Only ANSI-style function declarations are supported. - "..." is not supported. - short is supported - const is not supported - signed and unsigned are not supported. - arrays are supported - long doubles are not supported - structs and unions are supported - typedef is supported - explicit storage class specifiers are not supported: register, auto, static, extern - Unknown functions and variables are bound at compile time by calling back to the caller. For the 'acc' command-line tool unknown functions and variables are looked up using dlsym, to allow using many libc functions and variables. - Instructions: blocks ('{' '}') are supported as in C. 'if' and 'else' can be used for tests. The 'while' and 'for' C constructs are supported for loops. 'break' can be used to exit loops. 'return' is used for the return value of a function. - switch / case is not supported. - goto and labels are not supported. - continue is not supported. - Identifiers are parsed the same way as C. Local variables are handled, but there is no local name space (not a problem if different names are used for local and global variables). - Numbers can be entered in decimal, hexadecimal ('0x' or '0X' prefix), or octal ('0' prefix). - Float and double constants are supported. - '#define' is supported without function like arguments. - Macro recursion is allowed. - Self-referential macros are handled as in gcc. - '#pragma' is supported. The pragma text is passed to a callback function, and is used to implement meta-information. - Other preprocessor directives are ignored. - C Strings and C character constants are supported. All ANSI C character escapes are supported. - Both C comments ( /* */ ) and C++ comments ( // ... end-of-line ) are supported. - Some syntax errors are reported, others may cause a crash. - Memory: the code, data, and symbol sizes are limited to 100KB (it can be changed in the source code).