Class ExprInstrGenerator

java.lang.Object
org.ek9lang.compiler.phase7.generator.AbstractGenerator
org.ek9lang.compiler.phase7.generator.ExprInstrGenerator
All Implemented Interfaces:
Function<ExprProcessingDetails,List<IRInstr>>

final class ExprInstrGenerator extends AbstractGenerator implements Function<ExprProcessingDetails,List<IRInstr>>
Creates IR instructions for expressions.

This is the real backbone of processing and is very big! It is also recursive calling upon expression (sometimes directly and sometimes indirectly).
The ANTLR grammar follows:

   expression
     : expression op=(INC | DEC | BANG)
     | op=SUB expression
     | expression op=QUESTION
     | op=TOJSON expression
     | op=DOLLAR expression
     | op=PROMOTE expression
     | op=LENGTH OF? expression
     | op=PREFIX expression
     | op=SUFFIX expression
     | op=HASHCODE expression
     | op=ABS OF? expression
     | op=SQRT OF? expression
     | <assoc=right> left=expression coalescing=(CHECK | ELVIS) right=expression
     | primary
     | call
     | objectAccessExpression
     | list
     | dict
     | expression IS? neg=NOT? op=EMPTY
     | op=(NOT | TILDE) expression
     | left=expression op=CARET right=expression
     | left=expression op=(DIV | MUL | MOD | REM ) NL? right=expression
     | left=expression op=(ADD | SUB) NL? right=expression
     | left=expression op=(SHFTL | SHFTR) right=expression
     | left=expression op=(CMP | FUZ) NL? right=expression
     | left=expression op=(LE | GE | GT | LT) NL? right=expression
     | left=expression op=(EQUAL | NOTEQUAL | NOTEQUAL2) NL? right=expression
     | <assoc=right> left=expression coalescing_equality=(COALESCE_LE | COALESCE_GE | COALESCE_GT | COALESCE_LT) right=expression
     | left=expression neg=NOT? op=MATCHES right=expression
     | left=expression neg=NOT? op=CONTAINS right=expression
     | left=expression IS? neg=NOT? IN right=expression
     | left=expression op=(AND | XOR | OR) NL? right=expression
     | expression IS? neg=NOT? IN range
     | <assoc=right> control=expression LEFT_ARROW ternaryPart ternary=(COLON|ELSE) ternaryPart
     ;
 

In time I'll probably need to break this up a bit more.