1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
|
delimiter = Whitespace;
void Whitespace();
Whitespace : "[ \n\r\t]*";
// Test some priority. This example is from a variable declaration with reserved keywords.
Str Name();
Name => n : "[A-Za-z]+" n;
Buffer Prio();
Prio[10] => Buffer() : "async", Name -> add;
Prio[20] => Buffer() : Name -> add, Name -> add;
Prio[30] => Buffer() : "var", Name -> add;
// Try something similar to 'unless' in BS.
Buffer Unless();
Unless => Buffer() : (Stmt -> add, )*;
Buffer Stmt();
Stmt[10] => Buffer() : "unless", Name -> add - (, Stmt -> add)*;
Stmt => Buffer() : Name -> add;
// Unless[10] => Buffer() : "unless", Unless -> add - (, Unless -> add)*;
// Unless => Buffer() : Name -> add;
// a.b.c should match like this: (a.b).c
// a,b,c should match like this: a,(b,c)
Buffer Rec();
Rec[0] => Buffer() : Name -> add;
Rec[+1] => Buffer() : Rec -> add, "\.", Rec -> add;
Rec[-1] => Buffer() : Rec -> add, "\,", Rec -> add;
// Try parsing groups of 3 as well (not as common, but tests robustness).
Buffer Rec3();
Rec3[0] => Buffer() : Name -> add;
Rec3[+1] => Buffer() : Rec3 -> add, "\.", Rec3 -> add, "\.", Rec3 -> add;
Rec3[-1] => Buffer() : Rec3 -> add, ",", Rec3 -> add, ",", Rec3 -> add;
// Try parsing statements similar to "spawn" in Basic Storm.
Buffer SpawnExpr();
SpawnExpr[10] => Buffer() : "var", Name -> add, "=", SpawnExpr -> add;
SpawnExpr[00] => Buffer() : Name -> addSpace, Name -> add, "=", SpawnExpr -> add;
SpawnExpr[00] => Buffer() : Name -> addSpace, Name -> add;
SpawnExpr[10] => e : SpawnAtom e;
Buffer SpawnAtom();
SpawnAtom[10] => Buffer() : "spawn" -> add, Name -> add;
SpawnAtom[00] => Buffer() : Name -> add;
|