Program ::= {Statement}
Statement ::= Assignment ";"
| PrintStatement ";"
| LoadStatement ";"
| IfStatement ";"
| LoopStatement ";"
| AssertStatement ";"
| ListDeclaration ";"
| BreakStatement ";"
BreakStatement ::= "break" | "noloop"
ListDeclaration ::= ("sorted" | "unsorted") VariableType "list" Identifier
Assignment ::= ( Identifier | Identifier "[" Expression "]") ( "=" ( Expression | "LINE" | String ) | ListAssignment )
ListAssignment ::= "<<" Expression
PrintStatement ::= ( "print" | "simon says" ) ( Identifier | String | "DAY" )
LoadStatement ::= "load" String
IfStatement ::= "if" Expression ":" {Statement} "else" ":" {Statement} "end"
LoopStatement ::= "loop" ( Expression "times" | Iterator ) ":" {Statement} "loopstop"
Iterator ::= "DAY" "lines" | ( "LINE" | Identifier ) chars
AssertStatement ::= "assert" Expression ":" String
Expression ::= Logic { ("<" | ">" | "==" | "<=" | ">=" ) Logic | "is" ( "DIGIT" | "ALPHA" ) }
Logic ::= Term { ("+" | "-") Term}
Term ::= Factor { ("*" | "/" | "modulo" ) Factor | Cast}
Factor ::= Number
| Identifier
| Identifier "[" Expression "]"
| Identifier "size"
| "(" Expression ")"
| Negate
| String
Cast ::= "as" VariableType
VariableType ::= ( "INTEGER" | "STRING" | "FLOAT" )
Negate ::= "-" Factor
Identifier ::= Letter { Letter | Digit }
Number ::= Digit { Digit }
Letter ::= "a" | ... |"z" | "A" | ... | "Z" // Any alphabetical character, [a-zA-Z]
Digit ::= "0" | ... | "9" // Any numeric digit [0-9]
String ::= \".*\"
[x] Need loading input file
[x] Need string character indexing
[x] Need character matching operators
[ ] Need string manipulations
[x] append
[ ] substring
[ ] split
[ ] Need string matching operators
[ ] Need string lengths
[x] Need a list data-structure : vector<int>.
[ ] Probably need multiline strings.
[ ] Need a map data-structure : map<string, int>.
Code from "tests/aoc_day1.aoc":

load "examples/example1.aoc";
print DAY;
a = 2;
print a;
print "SOME PRINT";
print "SOME FAILED PRINT";
print "SOME SUCCESS PRINT";
print "SOME RED PRINT";
print "SOME YELLOW PRINT";
print "SOME GREEN PRINT";
print "SOME BLUE PRINT";
print "SOME MAGENTA PRINT";
print "SOME CYAN PRINT";
print "SOME WHITE PRINT";
print "Colors are: GREEN CYAN GREEN YELLOW MAGENTA SUCCESS FAILED BLUE RED WHITE.";
size = 10;
i = 0;
loop size times:
simon says i;
if i modulo 2 == 0:
print "EVEN";
else:
print "ODD";
end;
i = i + 1;
loopstop;
print i;
assert i == size : "'i' must be equal to 'size' at this point";
print "SUCCESS!";
Results:
Run code : examples/example5.aoc
Simon Says: i = 0
Simon Says: 'EVEN'
Simon Says: i = 1
Simon Says: 'ODD'
Simon Says: i = 2
Simon Says: 'EVEN'
Simon Says: i = 3
Simon Says: 'ODD'
Simon Says: i = 4
Simon Says: 'EVEN'
Simon Says: i = 5
Simon Says: 'ODD'
Simon Says: i = 6
Simon Says: 'EVEN'
Simon Says: i = 7
Simon Says: 'ODD'
Simon Says: i = 8
Simon Says: 'EVEN'
Simon Says: i = 9
Simon Says: 'ODD'
Simon Says: i = 10
Simon Says: 'SUCCESS!'


