Language Reference¶
In this chapter we will learn about
- Language keywords
- Language Functions
- Compiler Errors
- Runtime Errors
- Environment Errors
- Language Grammar
- Virtual Machine (VM) Instructions
Language Keywords¶
Keywords Count : 49
- again
- and
- but
- bye
- call
- case
- catch
- changeringkeyword
- changeringoperator
- class
- def
- do
- done
- else
- elseif
- end
- exit
- for
- from
- func
- get
- give
- if
- import
- in
- load
- loadsyntax
- loop
- new
- next
- not
- off
- ok
- on
- or
- other
- package
- private
- put
- return
- see
- step
- switch
- to
- try
- while
- endfunc
- endclass
- endpackage
Language Functions¶
Functions Count : 208
acos() add() addattribute() adddays()
addmethod() ascii() asin() assert()
atan() atan2() attributes() binarysearch()
bytes2double() bytes2float() bytes2int() callgc()
ceil() cfunctions() char() chdir()
classes() classname() clearerr() clock()
clockspersecond() closelib() copy() cos()
cosh() currentdir() date() dec()
decimals() del() diffdays() dir()
double2bytes() eval() exefilename() exefolder()
exp() fabs() fclose() feof()
ferror() fexists() fflush() fgetc()
fgetpos() fgets() filename() find()
float2bytes() floor() fopen() fputc()
fputs() fread() freopen() fseek()
fsetpos() ftell() functions() fwrite()
getattribute() getchar() globals() hex()
hex2str() input() insert() int2bytes()
intvalue() isalnum() isalpha() isandroid()
isattribute() iscfunction() isclass() iscntrl()
isdigit() isfreebsd() isfunction() isglobal()
isgraph() islinux() islist() islocal()
islower() ismacosx() ismethod() ismsdos()
isnull() isnumber() isobject() ispackage()
ispackageclass() ispointer() isprint() isprivateattribute()
isprivatemethod() ispunct() isspace() isstring()
isunix() isupper() iswindows() iswindows64()
isxdigit() left() len() lines()
list() list2str() loadlib() locals()
log() log10() lower() max()
mergemethods() methods() min() murmur3hash()
nullpointer() number() object2pointer() objectid()
packageclasses() packagename() packages() perror()
pointer2object() pow() prevfilename() ptrcmp()
raise() random() read() remove()
rename() reverse() rewind() right()
ring_give() ring_see() ring_state_delete() ring_state_findvar()
ring_state_init() ring_state_main() ring_state_mainfile() ring_state_new()
ring_state_newvar() ring_state_runcode() ring_state_runfile() ring_state_runobjectfile()
ring_state_setvar() ringvm_callfunc() ringvm_calllist() ringvm_cfunctionslist()
ringvm_classeslist() ringvm_evalinscope() ringvm_fileslist() ringvm_functionslist()
ringvm_give() ringvm_hideerrormsg() ringvm_info() ringvm_memorylist()
ringvm_packageslist() ringvm_passerror() ringvm_scopescount() ringvm_see()
ringvm_settrace() ringvm_tracedata() ringvm_traceevent() ringvm_tracefunc()
setattribute() shutdown() sin() sinh()
sort() space() sqrt() srandom()
str2hex() str2hexcstyle() str2list() strcmp()
string() substr() swap() sysget()
system() tan() tanh() tempfile()
tempname() time() timelist() trim()
type() ungetc() unsigned() upper()
varptr() version() windowsnl() write()
Compiler Errors¶
- Error (C1) : Error in parameters list, expected identifier
- Error (C2) : Error in class name
- Error (C3) : Unclosed control strucutre, ‘ok’ is missing
- Error (C4) : Unclosed control strucutre, ‘end’ is missing
- Error (C5) : Unclosed control strucutre, 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 strucutre, ‘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!
- Warning (W1) : Duplication in file name
- Warning (W2) : The Compiler command ChangeRingKeyword requires two words as parameters
- Warning (W3) : Compiler command ChangeRingKeyword - Keyword not found !
- Warning (W4) : The Compiler command ChangeRingOperator requires two words as parameters
- Warning (W5) : Compiler command ChangeRingOperator - Operator not found !
- Warning (W6) : Using the EXIT command outside loop!”
- Warning (W7) : Using the LOOP command outside loop!”
Runtime Errors¶
- Error (R1) : Cann’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 destory 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 <=14) !
- 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
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!
Language Grammar¶
Program —> {statement}
Statement —> ‘package’ <Identifier> { ‘.’ <Identifier> } [‘{‘ {statement} ‘}’] [‘end’|’endpackage’]
Statement —> ‘class’ <Identifier> [ ‘from’|’:’|’<’ <Identifier> ] [‘{‘ {statement} ‘}’][‘end’|’endclass’]
Statement —> ‘func’|’def’ <Identifier> [ParaList] [‘{‘ {statement} ‘}’][‘end’|’endfunc’]
Statement —> ‘import’ <Identifier> { ‘.’ <Identifier> }
Statement —> ‘private’
Statement —> ‘load’ [‘package’] <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’|’}’
Statement —> ‘Switch’ <Expr> [‘{‘] { ‘on’|’case’ <Expr> {statement} } [‘other’ {Statement} ] ‘off’|’end’|’}’
Statement —> ‘for’ <Identifier> ‘=’ <Expr> ‘to’ <Expr> [ ‘step’ <Expr> ] [‘{‘] {Statement} ‘next’|’end’|’}’
Statement —> ‘for’ <Identifier> ‘in’ <Expr> [ ‘step’ <Expr> ] [‘{‘] {statement} ‘next’|’end’|’}’
Statement —> ‘while’ <Expr> [‘{‘] {statement} ‘end’|’}’
Statement —> ‘do’ {statement} ‘again’ <Expr>
Statement —> ‘try’ {statement} [‘{‘] ‘catch’ {statement} ‘done’|’end’|’}’
Statement —> ‘return’ <Expr>
Statement —> ‘bye’
Statement —> ‘exit’
Statement —> ‘loop’
Statement —> <Expr>
Statement —> epslion
ParaList —> epslion
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’ <Identifier>
Factor —> <AnonymousFunction>
Factor —> ‘call’ <identifier> { ‘.’ <Identifier> } ‘(‘ <Parameters> ‘)’
List —> ‘[‘ [ <Expr> { ‘,’ <Expr> } ] ‘]’
Mixer —> { ‘.’ <Identifier> }
Mixer —> ‘[‘ <Expr> ‘]’
Mixer —> ‘(‘ [ <Expr> [ { ‘,’ <Expr> }] ] ‘)’
Mixer —> ‘{‘ {Statement} ‘}’
AnonymousFunction —> ‘func’|’def’| [<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 |
---|---|
|
Add string from the IR to the stack |
|
Add number from the IR to the stack |
|
Replace VP in the stack[nSize] with the variable value |
|
Read variable name from the IR, push VP to the stack |
|
Stack[nSize-1] VV = Stack[nSize] VV , POP Stack[nSize] |
|
Increment Number in Stack[nSize] by 1 |
|
The same as ICO_LOADADDRESS then ICO_PUSHV |
|
Store new line number (debug info) |
|
Remove all items from the stack , nSize = 0 |
|
Store the source code file name (debug info) |
|
Free the Scope List of the current Expression |
(Jump)
Operation | Description |
---|---|
|
Set PC to new value from the IR |
|
If Stack[nSize] is a number = 0 then Set PC to new value from the IR |
|
End of for loop |
|
If Stack[nSize] is a number = 1 then Set PC to new value from the IR |
|
As ICO_JUMPZERO but add 1 to the stack (required for many ‘AND’ conditions) |
|
As ICO_JUMPONE but add 1 to the stack (required for many ‘OR’ conditions) |
(Compare)
Operation | Description |
---|---|
|
If stack[nSize-1] <= stack[nSize] , POP stack[nSize], set Stack[nSize-1] = 1 else set Stack[nSize-1] = 0 |
|
If stack[nSize-1] = stack[nSize] , POP stack[nSize], set Stack[nSize-1] = 1 else set Stack[nSize-1] = 0 |
|
If stack[nSize-1] < stack[nSize] , POP stack[nSize], set Stack[nSize-1] = 1 else set Stack[nSize-1] = 0 |
|
If stack[nSize-1] > stack[nSize] , POP stack[nSize], set Stack[nSize-1] = 1 else set Stack[nSize-1] = 0 |
|
If stack[nSize-1] >= stack[nSize] , POP stack[nSize], set Stack[nSize-1] = 1 else set Stack[nSize-1] = 0 |
|
If stack[nSize-1] != stack[nSize] , POP stack[nSize], set Stack[nSize-1] = 1 else set Stack[nSize-1] = 0 |
(Math)
Operation | Description |
---|---|
|
Stack[nSize-1] = Stack[nSize-1] + Stack[nSize] , POP stack[nSize] |
|
Stack[nSize-1] = Stack[nSize-1] - Stack[nSize] , POP stack[nSize] |
|
Stack[nSize-1] = Stack[nSize-1] * Stack[nSize] , POP stack[nSize] |
|
Stack[nSize-1] = Stack[nSize-1] / Stack[nSize] , POP stack[nSize] |
|
Stack[nSize-1] = Stack[nSize-1] % Stack[nSize] , POP stack[nSize] |
|
Stack[nSize] = - Stack[nSize-1] |
|
Stack[nSize] = Stack[nSize] + 1 |
|
Stack[nSize] = Stack[nSize] - 1 |
(Logic)
Operation | Description |
---|---|
|
Stack[nSize-1] = Stack[nSize-1] && Stack[nSize] , POP stack[nSize] |
|
Stack[nSize-1] = Stack[nSize-1] || Stack[nSize] , POP stack[nSize] |
|
Stack[nSize] = ! Stack[nSize] |
(Lists)
Operation | Description |
---|---|
|
Start New List in Temp. Memory |
|
Add List Item |
|
End List |
|
Stack[nSize-1] = Stack[nSize-1] VV [ Stack[nSize] ] , POP stack[nSize] |
(Functions)
Operation | Description |
---|---|
|
Find function |
|
Call function |
|
Return from function |
|
Return NULl from function |
|
Return after eval() |
|
Return the list item reference - not the value |
|
Start new function |
|
Flag to determine where to jump later (after ICO_RETURN) |
|
Start executing function |
|
End function execution |
|
Anonymous function |
(User Interface)
Operation | Description |
---|---|
|
Print value to the standard output |
|
Get input from the keyboard |
(End Program/Loop)
Operation | Description |
---|---|
|
End execution of VM |
|
Place to exit to from a loop |
|
Remove exit mark |
|
Break from one loop or more |
|
Continue to next loop |
(For Better Performance)
Operation | Description |
---|---|
|
Push pointer to the stack |
|
Increment variable value using pointer |
|
Push value of variable using variable pointer |
|
Increment then jump |
|
Increment using pointer then jump |
|
Jump if variable value is <= numeric value |
|
Jump if variable value (using pointer) <= numeric value |
|
Push function pointer |
|
Push pointer to local variable |
|
Increment value using pointer to local variable then jump |
|
Jump if the variable value (using pointer) <= numeric value |
|
Increment value using variable pointer then jump (for loop step = 1) |
|
Increment value using variable pointer then jump (for loop step = 1) |
(Try-Catch-Done)
Operation | Description |
---|---|
|
Start try region |
|
End try region |
(Duplicate and Range)
Operation | Description |
---|---|
|
Duplicate stack value |
|
Create list from value to value |
(OOP)
Operation | Description |
---|---|
|
Create new object, get class name from the IR, push object pointer to the stack. |
|
Called after creating new object, set the active scope to be the object scope. |
|
Get object attribute, push the pointer to the stack. |
|
Find object method |
|
Used after calling a method - normal case |
|
Used after calling a method - second case |
|
Start new class region |
|
Open brace |
|
End brace |
|
Import package |
|
start private attributes region |
|
set attribute value - check for setter. |
|
call class init() method. |
(Other)
Operation | Description |
---|---|
|
Copy by reference |
|
Remove reference |
|
Determine the left side variable |
|
Determine operators like += , -= , ... etc |
(Bitwise Operators)
Operation | Description |
---|---|
|
Stack[nSize-1] = Stack[nSize-1] & Stack[nSize] , POP stack[nSize] |
|
Stack[nSize-1] = Stack[nSize-1] | Stack[nSize] , POP stack[nSize] |
|
Stack[nSize-1] = Stack[nSize-1] ^ Stack[nSize] , POP stack[nSize] |
|
Stack[nSize] = ! Stack[nSize] |
|
Stack[nSize-1] = Stack[nSize-1] << Stack[nSize] , POP stack[nSize] |
|
Stack[nSize-1] = Stack[nSize-1] >> Stack[nSize] , POP stack[nSize] |
(For Step)
Operation | Description |
---|---|
|
Determine step number in for loop |
|
POP step number from steps stack |
|
Load the first address of variable name |
(Custom Global Scope)
Operation | Description |
---|---|
|
Start new custom global scope - used by ‘load package’ command |
|
End of custom global scope - used by ‘load package’ command |
|
Set the current global scope |