Language Specification
In this chapter we will learn about
- Scanner Commands 
- Language keywords 
- Language Functions 
- Compiler Errors 
- Runtime Errors 
- Environment Errors 
- Language Grammar 
- Virtual Machine (VM) Instructions 
Scanner Commands
Commands Count: 5
- ChangeRingKeyword 
- ChangeRingOperator 
- DisableHashComments 
- EnableHashComments 
- LoadSyntax 
Language Keywords
Keywords Count: 55
- again 
- and 
- but 
- bye 
- call 
- case 
- catch 
- class 
- def 
- do 
- done 
- else 
- elseif 
- end 
- exit 
- for 
- from 
- func 
- get 
- give 
- if 
- import 
- in 
- load 
- loop 
- new 
- next 
- not 
- off 
- ok 
- on 
- or 
- other 
- package 
- private 
- put 
- return 
- see 
- step 
- switch 
- to 
- try 
- while 
- endfunc 
- endclass 
- endpackage 
- endif 
- endfor 
- endwhile 
- endswitch 
- endtry 
- function 
- endfunction 
- break 
- continue 
Language Functions
Functions Count: 255
Note
Some functions could be used with different parameters type/count
acos(x) ---> The principal value of the arc cosine of x, expressed in radians
add(List,Item)
addattribute(Object,cAttributeName|aAttributesList)
adddays(cDate,nDays) ---> Date from cDate and after nDays
addmethod(Object,cNewMethodName,cMethodName|AnonymousFunction)
ascii(character) ---> ASCII Code
asin(x) ---> The principal value of the arc sine of x, expressed in radians
assert(condition)
atan(x) ---> The principal value of the arc tangent of x, expressed in radians
atan2(y,x) ---> The principal arc tangent of y/x, in the interval [-pi,+pi] radians
attributes(object) ---> Returns a list contains the object attributes
binarysearch(List,ItemValue) ---> Item Index
binarysearch(List,ItemValue,nColumn) ---> Search in nColumn, returns the Item Index
bytes2double(cBytes) ---> nNumber
bytes2float(cBytes) ---> nNumber
bytes2int(cBytes) ---> nNumber
callgarbagecollector()
callgc()
ceil(x) ---> The smallest integer value greater than or equal to x
cfunctions() ---> a list contains functions names
char(ASCII Code) ---> character
chdir(cNewPath)
checkoverflow(lFlag)
classes() ---> a list contains classes names
classname(object) ---> Returns the object class name
clearerr(FileHandle)
clock() ---> The number of clock ticks from program start
clockspersecond() ---> Number of clocks in one second
closelib(pDLL)
copy(string,nCount) ---> string replicated nCount times
cos(x) ---> The cosine of an angle of x radians
cosh(x) ---> The hyperbolic cosine of x radians
currentdir() ---> String contains the path of the current directory
date() ---> String represent the date "dd/mm/yyyy"
dec(hexadecimal) ---> decimal
decimals(n) ---> Determine the decimals digits after the point in float/double numbers
del(list,index)
diffdays(cDate1,cDate2) ---> number of days (Date1 - Date2)
dir(cFolderPath) ---> List contains files & sub folders.
direxists(cDirPath) ---> returns 1 if the directory exists
double2bytes(nNumber) ---> cBytes
eval(cCode)
exefilename() ---> String contains the Ring executable file name
exefolder() ---> String contains the Ring executable path
exp(x) ---> The value of e raised to the xth power
fabs(x) ---> The absolute value of x
fclose(FileHandle)
feof(FileHandle) ---> returns 1 if EOF and 0 if not
ferror(FileHandle) ---> returns 1 if error and 0 if not
fexists(cFileName) ---> returns 1 if the file exists
fflush(FileHandle)
fgetc(FileHandle) ---> returns character or EOF
fgetpos(FileHandle) ---> position handle
fgets(FileHandle,nSize) ---> string
filename() ---> String contains the active source file name
find(List,ItemValue) ---> Item Index
find(List,ItemValue,nColumn) ---> Search in nColumn, returns the Item Index
find(List,ItemValue,nColumn,cAttribute) ---> Item Index
float2bytes(nNumber) ---> cBytes
floor(x) ---> The largest integer value less than or equal to x
fopen(cFileName,cMode) ---> FileHandle
fputc(FileHandle,cChar)
fputs(FileHandle,cString)
fread(FileHandle,nSize)
freopen(cFileName,cMode,file handle) ---> FileHandle
fseek(FileHandle,nOffset,nWhence) ---> zero if successful
fsetpos(FileHandle,PositionHandle)
ftell(FileHandle) ---> file position as number
functions() ---> a list contains functions names
fwrite(FileHandle,cString)
getarch() ---> cString (The name of the architecture of the Ring executable)
getattribute(oObject,cAttributeName) ---> Attribute Value
getchar() ---> Character
getfilesize(cFilePath) ---> nSize
getnumber() ---> Number
getpathtype(cPath) ---> nStatus
getpointer(pointer) ---> nAddress
getptr(pointer) ---> nAddress
getstring() ---> String
globals() ---> a list contains variables names in the global scope
hex(decimal) ---> hexadecimal
hex2str(Hexadecimal string) ---> string
importpackage(cPackageName)
input(nCount) ---> string
insert(List,Index,Item)
int2bytes(nNumber) ---> cBytes
intvalue(cVariableName)
isalnum(value) ---> 1 if the value is digit/letter or 0 if not
isalpha(value) ---> 1 if the value is a letter or 0 if not
isandroid() ---> Returns 1 if the operating system is Android, Returns 0 if it's not
isattribute(object,cAttributeName) ---> Bool
iscfunction(cFunctionName) ---> returns 1 if the C function is defined
isclass(cClassName) ---> returns 1 if the Class is defined
iscntrl(value) ---> 1 if the value is a control character or 0 if not
isdigit(value) ---> 1 if the value is a digit or 0 if not
isfreebsd() ---> Returns 1 if the operating system is FreeBSD, Returns 0 if it's not
isfunction(cFunctionName) ---> returns 1 if the Ring function is defined
isglobal(cVariableName) ---> returns 1 if the variable is defined in the global scope
isgraph(value) ---> 1 if the value can be printed (Except space) or 0 if not
islinux() ---> Returns 1 if the operating system is Linux, Returns 0 if it's not
islist(value) ---> 1 if the value is a list or 0 if not
islocal(cVariableName) ---> returns 1 if the variable is defined in the local scope
islower(value) ---> 1 if the value is lowercase letter or 0 if not
ismacosx() ---> Returns 1 if the operating system is Mac OS X, Returns 0 if it's not
ismethod(object,cMethodName) ---> Returns True if the object class contains the method
ismsdos() ---> Returns 1 if the operating system is MS-DOS, Returns 0 if it's not
isnull(value) ---> 1 if the value is NULL or 0 if not
isnumber(value) ---> 1 if the value is a number or 0 if not
isobject(variable) ---> Returns True if it's an object, False if it's not
ispackage(cPackageName) ---> returns 1 if the Package is defined
ispackageclass(cPackageName,cClassName) ---> returns 1 if the Class is defined
ispointer(vPara) ---> True|False
isprint(value) ---> 1 if the value occupies a printing position or 0 if not
isprivateattribute(object,cAttributeName) ---> lResult
isprivatemethod(object,cMethodName) ---> lResult
ispunct(value) ---> 1 if the value is a punctuation character or 0 if not
isspace(value) ---> 1 if the value is a white-space or 0 if not
isstring(value) ---> 1 if the value is a string or 0 if not
isunix() ---> Returns 1 if the operating system is Unix, Returns 0 if it's not
isupper(value) ---> 1 if the value is an uppercase alphabetic letter or 0 if not
iswindows() ---> Returns 1 if the operating system is Windows
iswindows64() ---> Returns 1 if the operating system is Windows64
isxdigit(value) ---> 1 if the value is a hexadecimal digit character or 0 if not
left(string,count) ---> Get characters starting from the left
len(string) ---> String length
len(List) ---> The list size
lines(string) ---> Number of lines inside the string
list(nSize) ---> aList
list(nRows,nCols) ---> aList
list2str(list) ---> string contains the list items
loadlib(cDLLFileName) ---> pDLL
locals() ---> a list contains the variables names in the current scope
log(x) ---> The natural logarithm of x (the base of e)
log(x,b) ---> The logarithm of x to the base of b
log10(x) ---> The common logarithm (base-10 logarithm) of x
lower(string) ---> convert string letters to lower c
max(nNumber1,nNumber) ---> Maximum number
max(aList) ---> Maximum number inside the list
memcpy(pDestinationPointer,cSourceString,nSize)
memorycopy(pDestinationPointer,cSourceString,nSize)
mergemethods(cClassNameDestination,cClassNameSource)
methods(object) ---> Returns a list contains the object methods
min(nNumber,nNumber2) ---> Minimum number
min(aList) ---> Minimum number inside the list
murmur3hash(cString,nNumber) ---> nNumber
newlist(nSize) ---> aList
newlist(nRows,nCols) ---> aList
nofprocessors() ---> nProcessors
nothing(Any number/type of parameters) ---> Zero (0)
nullpointer() ---> pPointer
nullptr() ---> pPointer
number(string) ---> Number
obj2ptr(List|Object) --> Low Level Object ( C Pointer )
object2pointer(List|Object) --> Low Level Object ( C Pointer )
objectid(object) ---> Returns the object id
optionalfunc(cFuncName)
packageclasses() cPackageName) ---> a list contains classes names inside the package
packagename() ---> Returns the package name of the latest successful import
packages() ---> a list contains packages names
parentclassname(object) ---> Returns the parent class name of the object class
perror(cErrorMessage)
pointer2object(Low Level Object) ---> List|Object
pointer2string(pointer,nStart,nCount) ---> cString
pointercompare(oObject1,oObject2) ---> lResult
pow(x,y) ---> x raised to the power of y
prevfilename() ---> String contains the previous source file name.
print(cString)
print2str(cString) ---> String
ptr2obj(Low Level Object) ---> List|Object
ptr2str(pointer,nStart,nCount) ---> cString
ptrcmp(oObject1,oObject2) ---> lResult
puts(cString)
raise(cErrorMessage)
random(x) ---> A random number in the range [0,x]
randomize(nNumber) ---> nNumber
read(cFileName) ---> String contains the file content
ref(aList|oObject) ---> List/Object reference
reference(aList|oObject) ---> List/Object reference
refcount(aList|oObject) ---> References Count
remove(cFileName)
rename(cOldFileName,cNewFileName) ---> Zero for Success or -1 for Error
reverse(List|String) ---> Reversed List|String
rewind(FileHandle)
right(string,count) ---> get characters starting from the right
ring_give(cVariable)
ring_see(cMessage)
ring_state_delete(oState)
ring_state_filetokens(oState,cRingFileName) ---> aTokens
ring_state_findvar(oState,cVariableName) ---> aVariableList
ring_state_init() ---> oState
ring_state_main(cRingFileName)
ring_state_mainfile(oState,cRingFileName|cRingoFileName)
ring_state_new() ---> oState
ring_state_newvar(oState,cVariableName) ---> aVariableList
ring_state_resume(oState,[cPara|nPara],[lUseReturn])
ring_state_runcode(oState,cCode)
ring_state_runcodeatins(oState,nPC)
ring_state_runfile(oState,cRingFileName)
ring_state_runobjectfile(oState,cRingObjectFileName)
ring_state_scannererror(oState) ---> nStatus
ring_state_setvar(oState,cVariableName,Value)
ring_state_stringtokens(oState,cRingFileName)
ring_state_stringtokens(oState,cRingFileName,lCaseSensitive)
ringvm_callfunc(cFuncName)
ringvm_calllist() ---> List
ringvm_cfunctionslist() ---> List
ringvm_classeslist() ---> List
ringvm_codelist() ---> List
ringvm_evalinscope(nScope,cCode)
ringvm_fileslist() ---> List
ringvm_functionslist() ---> List
ringvm_genarray(aList)
ringvm_give(cVariableName)
ringvm_hideerrormsg(lStatus)
ringvm_info() ---> List of information about the VM structure
ringvm_ismempool() ---> lStatus (Can provide memory or not)
ringvm_memorylist() ---> List
ringvm_packageslist() ---> List
ringvm_passerror()
ringvm_runcode(cCode)
ringvm_scopescount() ---> nScopes
ringvm_see(cMessage)
ringvm_settrace(cCode)
ringvm_tracedata() ---> aDataList
ringvm_traceevent() ---> nTraceEvent
ringvm_tracefunc() ---> cCode
setattribute(oObject,cAttributeName,Value)
setpointer(pointer,nNewAddress)
setptr(pointer,nNewAddress)
shutdown(nStatus)
sin(x) ---> The sine of an angle of x radians
sinh(x) ---> The hyperbolic sine of x radians
sort(List) ---> Sorted List
sort(List,nColumn) ---> Sorted List based on nColumn
sort(List,nColumn,cAttribute) ---> Sorted List based on Object Attribute
space(nBytesCount) ---> String
sqrt(x) ---> The square root of x
srandom(x) ---> Initialize random number generator
str2hex(string) ---> hexadecimal string
str2hexcstyle(string) ---> hexadecimal string
str2list(string) ---> list contains the string lines
strcmp(cString1,cString2) ---> value = 0 if cString1 = cString2
string(number) ---> String
substr(string,substring) ---> the starting position of substring in string
substr(string,position)  ---> Get substring starting from position to end
substr(string,position,count)  ---> Get characters starting from position
substr(string,substring,newsubstring)  ---> Transformed string (Match case)
substr(string,substring,newsubstring,1) ---> Transformed string (Ignore case)
swap(aList,nItem1,nItem2)
sysget(cVariable)
sysset(cVariable,cValue) ---> Returns 1 for success and return 0 for failure
syssleep(nMilliSecs) ---> Returns 1 for success and return 0 for failure
system(cCommand)
sysunset(cVariable) ---> Returns 1 for success and return 0 for failure
tan(x) ---> Tangent of an angle of x radians
tanh(x) ---> The hyperbolic tangent of x radians
tempfile() ---> FileHandle
tempname() ---> generated file name as string
time() ---> The system time as String
timelist() ---> List contains the time and date information.
trim(string) ---> Remove spaces from right and left
type(value) ---> The Type as String
ungetc(FileHandle,character)
unsigned(nNum1,nNum2,cOperator) ---> Perform operation using unsigned numbers
upper(string) ---> convert string letters to UPPER case
uptime() ---> nTime
variablepointer(cVariableName,cPointerType) ---> Low Level Object (C Pointer)
varptr(cVariableName,cPointerType) ---> Low Level Object (C Pointer)
version() ---> String contains the Ring version
windowsnl() ---> Returns a string contains CR+LF = CHAR(13) + CHAR(10)
write(cFileName,cString)
Compiler Errors
- Error (C1) : Error in parameters list, expected identifier 
- Error (C2) : Error in class name 
- Error (C3) : Unclosed control structure, ‘ok’ is missing 
- Error (C4) : Unclosed control structure, ‘end’ is missing 
- Error (C5) : Unclosed control structure, next is missing 
- Error (C6) : Error in function name 
- Error (C7) : Error in list items 
- Error (C8) : Parentheses ‘)’ is missing 
- Error (C9) : Brackets ‘]’ is missing 
- Error (C10) : Error in parent class name 
- Error (C11) : Error in expression operator 
- Error (C12) : No class definition 
- Error (C13) : Error in variable name 
- Error (C14) : Try/Catch miss the Catch keyword! 
- Error (C15) : Try/Catch miss the Done keyword! 
- Error (C16) : Error in Switch statement expression! 
- Error (C17) : Switch statement without OFF 
- Error (C18) : Missing closing brace for the block opened! 
- Error (C19) : Numeric Overflow! 
- Error (C20) : Error in package name 
- Error (C21) : Unclosed control structure, ‘again’ is missing 
- Error (C22) : Function redefinition, function is already defined! 
- Error (C23) : Using ‘(’ after number! 
- Error (C24) : The parent class name is identical to the subclass name 
- Error (C25) : Trying to access the self reference after the object name 
- Error (C26) : Class redefinition, class is already defined! 
- Error (C27) : Syntax Error! 
- Error (C28) : Expression is expected! 
- Error (C29) : Braces are missing to define anonymous function! 
- Error (S1) : Literal not closed! 
- Warning (W1) : Unrecognized option 
- Warning (W2) : Duplication in file name 
- Warning (W3) : The Compiler command ChangeRingKeyword requires two words as parameters 
- Warning (W4) : Compiler command ChangeRingKeyword - Keyword not found! 
- Warning (W5) : The Compiler command ChangeRingOperator requires two words as parameters 
- Warning (W6) : Compiler command ChangeRingOperator - Operator not found! 
- Warning (W7) : Using the EXIT command outside loop! 
- Warning (W8) : Using the LOOP command outside loop! 
Runtime Errors
- Error (R1) : Can’t divide by zero 
- Error (R2) : Array Access (Index out of range) 
- Error (R3) : Calling Function without definition 
- Error (R4) : Stack Overflow 
- Error (R5) : Can’t access the list item, Object is not list 
- Error (R6) : Variable is required 
- Error (R7) : Can’t assign to a string letter more than one character 
- Error (R8) : Variable is not a string 
- Error (R9) : Using exit command outside loops 
- Error (R10) : Using exit command with number outside the range 
- Error (R11) : Error in class name, class not found 
- Error (R12) : Error in property name, property not found 
- Error (R13) : Object is required 
- Error (R14) : Calling Method without definition 
- Error (R15) : Error in parent class name, class not found 
- Error (R16) : Using braces to access unknown object 
- Error (R17) : Error, using ‘Super’ without parent class 
- Error (R18) : Numeric Overflow 
- Error (R19) : Calling function with less number of parameters 
- Error (R20) : Calling function with extra number of parameters 
- Error (R21) : Using operator with values of incorrect type 
- Error (R22) : Using loop command outside loops 
- Error (R23) : Using loop command with number outside the range 
- Error (R24) : Using uninitialized variable 
- Error (R25) : Error in package name, Package not found 
- Error (R26) : Calling private method from outside the class 
- Error (R27) : Using private attribute from outside the class 
- Error (R28) : Using bad data type as step value 
- Error (R29) : Using bad data type in for loop 
- Error (R30) : Parent class name is identical to child class name 
- Error (R31) : Trying to destroy the object using the self reference 
- Error (R32) : The CALL command expect a variable contains string 
- Error (R33) : Bad decimals number (correct range >= 0 and <= 90) 
- Error (R34) : Variable is required for the assignment operation 
- Error (R35) : Can’t create/open the file 
- Error (R36) : The column number is not correct! It’s greater than the number of columns in the list 
- Error (R37) : Sorry, The command is not supported in this context 
- Error (R38) : Runtime Error in loading the dynamic library 
- Error (R39) : Error occurred creating unique filename 
- Error (R40) : Numeric underflow 
- Error (R41) : Invalid numeric string 
- Error (R42) : Error in eval() function 
- Error (R43) : The variable contains a protected value 
- Error (R44) : Maximum nested Eval() 
- Error (R45) : Variable is not a list 
- Error (R46) : The dynamic library doesn’t contain the ringlib_init() function! 
- Error (R47) : The function is not supported in this platform 
- Error (R48) : Assertion Failed! 
- Error (R49) : The Ring VM is not created/ready 
Environment Errors
- Error (E1) : Caught SegFault 
- Error (E2) : Out of Memory 
- Error (E3) : Deleting scope while no scope! 
- Error (E4) : Long VM Instruction! 
- Error (E5) : The file type is not correct - the VM expect a ring object file 
- Error (E6) : The Ring Object File version is not correct! 
- Error (E7) : Internal error in using sscanf() function! 
- Error (E8) : Internal error in using fscanf() function! 
- Error (E9) : Can’t open file 
Language Grammar
Program —> {statement}
Statement —> ‘package’ <Identifier> { ‘.’ <Identifier> } [‘{’ {statement} ‘}’] [‘end’|’endpackage’]
Statement —> ‘class’ <Identifier> [ ‘from’|’:’|’<’ <Identifier> ] [‘{’ {statement} ‘}’][‘end’|’endclass’]
Statement —> ‘func’|’def’|’function’ <Identifier> [ParaList] [‘{’ {statement} ‘}’][‘end’|’endfunc’|’endfunction’]
Statement —> ‘import’ <Identifier> { ‘.’ <Identifier> }
Statement —> ‘private’
Statement —> ‘load’ [‘package’|’again’] <Literal>
Statement —> ‘loadsyntax’ <Literal>
Statement —> ‘changeringkeyword’ <OldKeyword> <NewKeyword>
Statement —> ‘changeringoperator’ <OldOperator> <NewOperator>
Statement —> ‘see’|’put’ <Expr>
Statement —> ‘give’|’get’ <Identifier>
Statement —> ‘if’ <Expr> [‘{’] {statement} [ {‘but’|’elseif’ <Expr> {Statement} } ] [‘else’ {Statement} ] ‘ok’|’end’|’}’|’endif’
Statement —> ‘Switch’ <Expr> [‘{’] { ‘on’|’case’ <Expr> {statement} } [‘other’ {Statement} ] ‘off’|’end’|’}’|’endswitch’
Statement —> ‘for’ <Identifier> ‘=’ <Expr> ‘to’ <Expr> [ ‘step’ <Expr> ] [‘{’] {Statement} ‘next’|’end’|’}’|’endfor’
Statement —> ‘for’ <Identifier> ‘in’ <Expr> [ ‘step’ <Expr> ] [‘{’] {statement} ‘next’|’end’|’}’|’endfor’
Statement —> ‘while’ <Expr> [‘{’] {statement} ‘end’|’}’|’endwhile’
Statement —> ‘do’ {statement} ‘again’ <Expr>
Statement —> ‘try’ {statement} [‘{’] ‘catch’ {statement} ‘done’|’end’|’}’|’endtry’
Statement —> ‘return’ <Expr>
Statement —> ‘bye’
Statement —> ‘exit’|’break’
Statement —> ‘loop’|’continue’
Statement —> <Expr>
Statement —> epsilon
ParaList —> epsilon
ParaList —> [‘(’] <Identifier> [{ ‘,’ <Identifier> }] [‘)’]
Expr —> <LogicNot> [{ ‘and’|’or’ <LogicNot> }]
LogicNot –> [‘not’] <EqualOrNot>
EqualOrNot –> [ ‘=’|’!=’ ] <Compare>
Compare —> <BitOrXor> [ { ‘<’ | ‘>’ | ‘<=’ | ‘>=’ <BitOrXor> } ]
BitOrXor —> <BitAnd> [ { ‘|’ | ‘^’ <BitAnd> } ]
BitAnd —> <BitShift> [ { ‘&’ <BitShift> } ]
BitShift —> <Arithmetic> [ { ‘<<’ | ‘>>’ <Arithmetic> } ]
Arithmetic —> <Term> [ { ‘+’ | ‘-’ <Term> } ]
Term —> <Range> [ { ‘*’ | ‘/’ | ‘%’ | ‘**’ | ‘^^’ <Range> } ]
Range —> <Factor> [ ‘:’ <Factor> ]
Factor —> <Identifier> [ {Mixer} ] [ ‘=’ <Expr> ]
Factor —> <Number>
Factor —> <Literal>
Factor —> ‘:’ <Identifier>
Factor —> ‘-’ <Factor>
Factor —> ‘(’ <Expr> ‘)’
Factor —> <List>
Factor —> ‘new’ [‘from’] <Identifier>
Factor —> <AnonymousFunction>
Factor —> ‘call’ <identifier> { ‘.’ <Identifier> } ‘(’ <Parameters> ‘)’
List —> ‘[’ [ <Expr> { ‘,’ <Expr> } ] ‘]’
Mixer —> { ‘.’ <Identifier> }
Mixer —> ‘[’ <Expr> ‘]’
Mixer —> ‘(’ [ <Expr> [ { ‘,’ <Expr> }] ] ‘)’
Mixer —> ‘{’ {Statement} ‘}’
AnonymousFunction —> ‘func’|’def’|’function’ [<ParaList>] ‘{’ {Statement} ‘}’
Virtual Machine (VM) Instructions
Definitions :-
- VM : Virtual Machine 
- Stack : VM Stack 
- IR : Instruction Register 
- PC : Program Counter 
- VP : Variable Pointer 
- Stack[nSize] : Last Item in the Stack (Last In - First Out) 
- VV : Variable Value (We have a Pointer to a variable, And we access this variable value) 
(Stack and Variables)
| Operation | Description | 
|---|---|
| ICO_PUSHC | Add string from the IR to the stack | 
| ICO_PUSHN | Add number from the IR to the stack | 
| ICO_PUSH2N | Add two numbers from the IR to the stack | 
| ICO_PUSH3N | Add three numbers from the IR to the stack | 
| ICO_PUSH4N | Add four numbers from the IR to the stack | 
| ICO_PUSHV | Replace VP in the stack[nSize] with the variable value | 
| ICO_LOADADDRESS | Read variable name from the IR, push VP to the stack | 
| ICO_ASSIGNMENT | Stack[nSize-1] VV = Stack[nSize] VV , POP Stack[nSize] | 
| ICO_INC | Increment Number in Stack[nSize] by 1 | 
| ICO_LOADAPUSHV | The same as ICO_LOADADDRESS then ICO_PUSHV | 
| ICO_NEWLINE | Store new line number (debug info) | 
| ICO_FREESTACK | Remove all items from the stack , nSize = 0 | 
| ICO_FILENAME | Store the source code file name (debug info) | 
| ICO_FREELOADASCOPE | Free the Scope List of the current Expression | 
(Jump)
| Operation | Description | 
|---|---|
| ICO_JUMP | Set the PC to a new value from the IR | 
| ICO_JUMPZERO | If Stack[nSize] is a number = 0 then Set PC to new value from the IR | 
| ICO_JUMPFOR | End of for loop | 
| ICO_JUMPONE | If Stack[nSize] is a number = 1 then Set PC to new value from the IR | 
| ICO_JUMPZERO2 | As ICO_JUMPZERO but add 1 to the stack (required for many ‘AND’ conditions) | 
| ICO_JUMPONE2 | As ICO_JUMPONE but add 1 to the stack (required for many ‘OR’ conditions) | 
| ICO_PUSHNULLTHENJUMP | Add NULL string to the Stack then set the PC to a new value from the IR | 
(Compare)
| Operation | Description | 
|---|---|
| ICO_LESSEQUAL | If stack[nSize-1] <= stack[nSize] , POP stack[nSize], set Stack[nSize-1] = 1 else set Stack[nSize-1] = 0 | 
| ICO_EQUAL | If stack[nSize-1] = stack[nSize] , POP stack[nSize], set Stack[nSize-1] = 1 else set Stack[nSize-1] = 0 | 
| ICO_LESS | If stack[nSize-1] < stack[nSize] , POP stack[nSize], set Stack[nSize-1] = 1 else set Stack[nSize-1] = 0 | 
| ICO_GREATER | If stack[nSize-1] > stack[nSize] , POP stack[nSize], set Stack[nSize-1] = 1 else set Stack[nSize-1] = 0 | 
| ICO_GREATEREQUAL | If stack[nSize-1] >= stack[nSize] , POP stack[nSize], set Stack[nSize-1] = 1 else set Stack[nSize-1] = 0 | 
| ICO_NOTEQUAL | If stack[nSize-1] != stack[nSize] , POP stack[nSize], set Stack[nSize-1] = 1 else set Stack[nSize-1] = 0 | 
(Math)
| Operation | Description | 
|---|---|
| ICO_SUM | Stack[nSize-1] = Stack[nSize-1] + Stack[nSize] , POP stack[nSize] | 
| ICO_SUB | Stack[nSize-1] = Stack[nSize-1] - Stack[nSize] , POP stack[nSize] | 
| ICO_MUL | Stack[nSize-1] = Stack[nSize-1] * Stack[nSize] , POP stack[nSize] | 
| ICO_DIV | Stack[nSize-1] = Stack[nSize-1] / Stack[nSize] , POP stack[nSize] | 
| ICO_MOD | Stack[nSize-1] = Stack[nSize-1] % Stack[nSize] , POP stack[nSize] | 
| ICO_POW | Stack[nSize-1] = Stack[nSize-1] ^ Stack[nSize] , POP stack[nSize] | 
| ICO_NEG | Stack[nSize] = - Stack[nSize-1] | 
| ICO_PLUSPLUS | Stack[nSize] = Stack[nSize] + 1 | 
| ICO_MINUSMINUS | Stack[nSize] = Stack[nSize] - 1 | 
(Logic)
| Operation | Description | 
|---|---|
| ICO_AND | Stack[nSize-1] = Stack[nSize-1] && Stack[nSize] , POP stack[nSize] | 
| ICO_OR | Stack[nSize-1] = Stack[nSize-1] || Stack[nSize] , POP stack[nSize] | 
| ICO_NOT | Stack[nSize] = ! Stack[nSize] | 
(Lists)
| Operation | Description | 
|---|---|
| ICO_LISTSTART | Start New List in Temp. Memory | 
| ICO_LISTITEM | Add List Item | 
| ICO_LISTEND | End List | 
| ICO_LOADINDEXADDRESS | Stack[nSize-1] = Stack[nSize-1] VV [ Stack[nSize] ] , POP stack[nSize] | 
(Functions)
| Operation | Description | 
|---|---|
| ICO_LOADFUNC | Find function | 
| ICO_CALL | Call function | 
| ICO_RETURN | Return from function | 
| ICO_RETNULL | Return NULL from function | 
| ICO_RETFROMEVAL | Return after eval() | 
| ICO_RETITEMREF | Return the list item reference - not the value | 
| ICO_NEWFUNC | Start new function | 
| ICO_BLOCKFLAG | Flag to determine where to jump later (after ICO_RETURN) | 
| ICO_FUNCEXE | Start executing function | 
| ICO_ENDFUNCEXE | End function execution | 
| ICO_ANONYMOUS | Anonymous function | 
| ICO_FREETEMPLISTS | Delete temp. lists | 
(User Interface)
| Operation | Description | 
|---|---|
| ICO_PRINT | Print value to the standard output | 
| ICO_GIVE | Get input from the keyboard | 
(End Program/Loop)
| Operation | Description | 
|---|---|
| ICO_BYE | End execution of VM | 
| ICO_EXITMARK | Place to exit to from a loop | 
| ICO_POPEXITMARK | Remove exit mark | 
| ICO_EXIT | Break from one loop or more | 
| ICO_LOOP | Continue to next loop | 
| ICO_OPTIONALLOOP | Check if we have optional loop then push 1 to the Stack and call Loop | 
(For Better Performance)
| Operation | Description | 
|---|---|
| ICO_PUSHP | Push pointer to the stack | 
| ICO_INCP | Increment variable value using pointer | 
| ICO_PUSHPV | Push value of variable using variable pointer | 
| ICO_INCJUMP | Increment then jump | 
| ICO_INCPJUMP | Increment using pointer then jump | 
| ICO_LOADFUNCP | Push function pointer | 
| ICO_PUSHPLOCAL | Push pointer to local variable | 
| ICO_INCLPJUMP | Increment value using pointer to local variable then jump | 
| ICO_INCPJUMPSTEP1 | Increment value using variable pointer then jump (for loop step = 1) | 
| ICO_INCLPJUMPSTEP1 | Increment value using local variable pointer then jump (for loop step = 1) | 
| ICO_LEN | Remove list from the stack and push the list size | 
(Try-Catch-Done)
| Operation | Description | 
|---|---|
| ICO_TRY | Start try region | 
| ICO_DONE | End try region | 
(Duplicate and Range)
| Operation | Description | 
|---|---|
| ICO_DUPLICATE | Duplicate stack value | 
| ICO_RANGE | Create list from value to value | 
(OOP)
| Operation | Description | 
|---|---|
| ICO_NEWOBJ | Create new object, get class name from the IR, push object pointer to the stack. | 
| ICO_SETSCOPE | Called after creating new object, set the active scope to be the object scope. | 
| ICO_LOADSUBADDRESS | Get object attribute, push the pointer to the stack. | 
| ICO_LOADMETHOD | Find object method | 
| ICO_AFTERCALLMETHOD | Used after calling a method - normal case | 
| ICO_AFTERCALLMETHOD2 | Used after calling a method - second case | 
| ICO_PACKAGE | Start new package | 
| ICO_NEWCLASS | Start new class region | 
| ICO_BRACESTART | Open brace | 
| ICO_BRACEEND | End brace | 
| ICO_IMPORT | Import package | 
| ICO_NEWLABEL | Start a new section of byte code (Just for organization) | 
| ICO_PRIVATE | Start private attributes region | 
| ICO_SETPROPERTY | Set attribute value - check for setter | 
| ICO_CALLCLASSINIT | Call class init() method | 
| ICO_CHECKBRACEMETHOD | Check if a method exist using braces | 
(Other)
| Operation | Description | 
|---|---|
| ICO_SETREFERENCE | Copy by reference | 
| ICO_KILLREFERENCE | Remove reference | 
| ICO_ASSIGNMENTPOINTER | Determine the left side variable | 
| ICO_BEFOREEQUAL | Determine operators like += , -= , … etc | 
(Bitwise Operators)
| Operation | Description | 
|---|---|
| ICO_BITAND | Stack[nSize-1] = Stack[nSize-1] & Stack[nSize] , POP stack[nSize] | 
| ICO_BITOR | Stack[nSize-1] = Stack[nSize-1] | Stack[nSize] , POP stack[nSize] | 
| ICO_BITXOR | Stack[nSize-1] = Stack[nSize-1] ^ Stack[nSize] , POP stack[nSize] | 
| ICO_BITNOT | Stack[nSize] = ! Stack[nSize] | 
| ICO_BITSHL | Stack[nSize-1] = Stack[nSize-1] << Stack[nSize] , POP stack[nSize] | 
| ICO_BITSHR | Stack[nSize-1] = Stack[nSize-1] >> Stack[nSize] , POP stack[nSize] | 
(For Step)
| Operation | Description | 
|---|---|
| ICO_STEPNUMBER | Determine step number in for loop | 
| ICO_POPSTEP | POP step number from steps stack | 
| ICO_LOADAFIRST | Load the first address of variable name | 
(Custom Global Scope)
| Operation | Description | 
|---|---|
| ICO_NEWGLOBALSCOPE | Start new custom global scope - used by ‘load package’ command | 
| ICO_ENDGLOBALSCOPE | End of custom global scope - used by ‘load package’ command | 
| ICO_SETGLOBALSCOPE | Set the current global scope | 
(More Instructions)
| Operation | Description | 
|---|---|
| ICO_NOOP | No operation | 
| ICO_SETOPCODE | Change the operation code of a specific instruction |