This file describes the current implementation of the source_to_tst parser in
an EBNF like grammar. 

From this grammar one can reason where what is parsed and how the TST-tree
will look like. 



%ReadabilityNode    Nodes to improve the readability of this file.
^NotAnElement       Nodes that are a part of the parser, but not an element of the TST.
RealNode            Nodes that are a part of the parser, and also an element of the TST.
!AddThisNode        Add this node.


Source parser code
==================


Root            	::= Text* (Block Root)? EOF


%Block           	::= '{' ( '*' DocComment | LiteralBlock | ExpressionBlock |  (  ('/')? (ControlStructure | CustomBlock )  |  '}' )  )


DocComment     		::=  Text* '*}'


LiteralBlock  		::= 'literal' '}' Graphic* {/literal}


ExpressionBlock     ::= Expression

Expression          ::= Operand

%Operand			::= ( '(' ExpressionBlock ')' | Type | Variable | FunctionCall ) Operator
                    |   ( '++' !PreIncrementOperator | '--'  !PreDecrementOperator | '-'  !NegateOperator | '!' !LogicalNegateOperator ) Operator

%Operator           ::= ( '.') !PropertyFetch (Operand | Identifier)
                    |   ( '+' !X | '-' !X | '.' !X | '*' !X | '/' !X | '%' !X | '==' !X | '!=' !X | '===' !X | '!==' !X | '<' !X | '>' !X | 
                         '<=' !X | '>=' !X | '&&' !X | '||' !X | '=' !X | '+=' !X | '-=' !X | '*=' !X | '/=' !X | '.=' !X | '%=' !X | '++' !X | 
                         '--' !X | 'instanceof' !X ) Operand
                    |   '[' ArrayFetch Operand
                    |   '?' ConditionOperator Operand
                    |   ':' !ConditionalOperator Operand


ArrayFetch          ::= Expression

ConditionOperator   ::= Expression  TODO

FunctionCall        ::= Identifier '(' Expression ( ',' Expression )* ')' 

CustomBlock         ::= TODO

ControlStructure    ::= (foreach Foreach | for For | while While | do | if | elseif | else !X ..  etc, TODO

Variable            ::= '$' Identifier 



Types
=====

Type                ::= (Float | Integer | String | Bool | Array)

^Float              ::= ('-')? Digit* '.' Digit+ 

^Integer            ::= (-)? Digit+

^String             ::= '"' Text* '"' 
			        |   "'" Text* "'"

^Bool				::=  'true' | 'false'

^Array				::= 'array' '('  ( SubArray  ( ',' SubArray )* ( ',' )? )? ')'

%SubArray           ::= Type  ('=>' Type)?



Lexer
=====

%Identifier          ::= Letter (Letter | Digit | '_')*

%Letter             ::= 'a' ... 'z' | 'A' ... 'Z'  

%Digit              ::= '0' ... '9'
