spl.bnf (861B)
1 prog := prog node 2 | node 3 4 node := fdec 5 | assign 6 | ...imports... 7 8 assign := name type '=' value 9 | name type 10 11 reassign:= name '=' value 12 13 fdec := "func" name '(' assigns ')' type '=' '{' body '}' 14 | "func" name '(' assigns ')' type 15 | "symbol" NAME '(' assigns ')' type 16 17 18 assigns := assigns assign 19 | assign 20 21 type := name 22 | '*' type 23 | '[' ']' type 24 | '[' value ']' type 25 | func '(' types ')' 26 27 types := types ',' type 28 | type 29 30 value := name 31 | name '[' value ']' 32 | value ':' type 33 | fcall 34 | lit 35 | expr 36 37 values := values ',' value | value 38 39 fcall := name '(' values ')' 40 41 expr := value '+' value 42 | value '-' value 43 | value '*' value 44 | value '/' value 45 | value '%' value 46 | '&' value 47 | '*' value 48 49 lit := name 50 | int 51 | float 52 | str 53 54 name := NAME 55 | name::NAME 56 57 body := body block ';' 58 | block ';' 59 60 block := assign 61 | fcall 62 | reassign 63 | fdec