| 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). | |