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 : 199

len() add() del() sysget() clock() lower()
upper() input() ascii() char() date() time()
filename() getchar() system() random() timelist() adddays()
diffdays() version() clockspersecond() prevfilename() swap() shutdown()
isstring() isnumber() islist() type() isnull() isobject()
hex() dec() number() string() str2hex() hex2str()
str2list() list2str() str2hexcstyle() left() right() trim()
copy() substr() lines() strcmp() eval() raise()
assert() isalnum() isalpha() iscntrl() isdigit() isgraph()
islower() isprint() ispunct() isspace() isupper() isxdigit()
locals() globals() functions() cfunctions() islocal() isglobal()
isfunction() iscfunction() packages() ispackage() classes() isclass()
packageclasses() ispackageclass() classname()
objectid() attributes() methods()
isattribute() ismethod() isprivateattribute()
isprivatemethod() addattribute() addmethod()
getattribute() setattribute() mergemethods()
packagename() ringvm_fileslist() ringvm_calllist()
ringvm_memorylist() ringvm_functionslist()
ringvm_classeslist() ringvm_packageslist()
ringvm_cfunctionslist() ringvm_settrace()
ringvm_tracedata() ringvm_traceevent() ringvm_tracefunc()
ringvm_scopescount() ringvm_evalinscope() ringvm_passerror()
ringvm_hideerrormsg() ringvm_callfunc()
list() find() min() max()
insert() sort() reverse() binarysearch() sin() cos()
tan() asin() acos() atan() atan2() sinh()
cosh() tanh() exp() log() log10() ceil()
floor() fabs() pow() sqrt() unsigned() decimals()
murmur3hash() fopen() fclose() fflush() freopen() tempfile()
tempname() fseek() ftell() rewind() fgetpos() fsetpos()
clearerr() feof() ferror() perror() rename() remove()
fgetc() fgets() fputc() fputs() ungetc() fread()
fwrite() dir() read() write() fexists() int2bytes()
float2bytes() double2bytes() bytes2int()
bytes2float() bytes2double() ismsdos()
iswindows() iswindows64() isunix()
ismacosx() islinux() isfreebsd()
isandroid() windowsnl() currentdir()
exefilename() chdir() exefolder()
loadlib() closelib() callgc() varptr()
intvalue() object2pointer()
pointer2object() nullpointer() space()
ptrcmp() ring_state_init() ring_state_runcode()
ring_state_delete() ring_state_runfile() ring_state_findvar()
ring_state_newvar() ring_state_runobjectfile() ring_state_main()
ring_state_setvar()

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!

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!

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 —> ‘-‘ <Expr>

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
  • ICO_PUSHC
Add string from the IR to the stack
  • ICO_PUSHN
Add number 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 PC to 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)

(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_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

(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

(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_JUMPVARLENUM
Jump if variable value is <= numeric value
  • ICO_JUMPVARPLENUM
Jump if variable value (using pointer) <= numeric value
  • ICO_LOADFUNCP
Push function pointer
  • ICO_PUSHPLOCAL
Push pointer to local variable
  • ICO_INCLPJUMP
Increment value using pointer to local variable then jump
  • ICO_JUMPVARLPLENUM
Jump if the variable value (using pointer) <= numeric value
  • ICO_INCPJUMPSTEP1
Increment value using variable pointer then jump (for loop step = 1)
  • ICO_JUMPVARPLENUMSTEP1
Increment value using variable pointer then jump (for loop step = 1)

(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_NEWCLASS
Start new class region
  • ICO_BRACESTART
Open brace
  • ICO_BRACEEND
End brace
  • ICO_IMPORT
Import package
  • ICO_PRIVATE
start private attributes region
  • ICO_SETPROPERTY
set attribute value - check for setter.
  • ICO_CALLCLASSINIT
call call init() method.

(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