script.grammar (1964B)
1 program = 2 | symbol program 3 | $eof 4 ; 5 6 identifier = 7 | $(sequence of alphanumeric chars or '_' not starting with a number) 8 ; 9 10 literal = 11 | int-literal 12 | chr-literal 13 | str-literal 14 ; 15 16 int-literal = 17 | $(optionally prefixed series of numbers) 18 ; 19 20 chr-literal = 21 | '\'' $(optionally escaped ascii codepoint) '\'' 22 ; 23 24 str-literal = 25 | '"' $(sequence of optionally escaped ascii codepoints) '"' 26 ; 27 28 symbol = 29 | type-definition 30 | func-definition 31 | var-definition 32 ; 33 34 type-definition = 35 | identifier-list '::' typename 36 ; 37 38 identifier-list = 39 | identifier 40 | identifier ',' identifier-list 41 ; 42 43 typename = 44 | 'utf8' 45 | 'chr8' 46 | 'u64' 47 | 's64' 48 | identifier 49 | pointer-type 50 | array-type 51 | struct-type 52 ; 53 54 pointer-type = 55 | '*' typename 56 ; 57 58 array-type = 59 | '[' int-literal ']' typename 60 ; 61 62 struct-type = 63 | 'struct' '{' [ struct-member-list ] '}' 64 ; 65 66 struct-member-list = 67 | struct-member 68 | struct-member struct-member-list 69 ; 70 71 struct-member = 72 | identifier-list ':' typename ';' 73 ; 74 75 var-definition = 76 | identifier-list ':' typename [ '=' initialiser ] ';' 77 ; 78 79 initialiser = 80 | literal 81 | expression 82 | '.' identifier '=' initialiser 83 | '{' [ initialiser-list ] '}' 84 ; 85 86 expression = 87 | literal 88 | identifier 89 ; 90 91 initialiser-list = 92 | initialiser 93 | initialiser ',' initialiser-list 94 ; 95 96 fn-definition = 97 | identifier '::' '(' [ fn-parameter-list ] ')' ':' fn-rettype fn-body 98 ; 99 100 fn-parameter-list = 101 | fn-parameter 102 | fn-parameter ',' fn-parameter-list 103 ; 104 105 fn-parameter = 106 | identifier ':' typename 107 ; 108 109 fn-rettype = 110 | 'void' 111 | typename 112 ; 113 114 fn-body = 115 | '{' [ statement-list ] '}' 116 ; 117 118 statement-list = 119 | statement 120 | statement statement-list 121 ; 122 123 statement = 124 | var-definition 125 | block-statement 126 | return-statement 127 | expr-statement 128 ; 129 130 block-statement = 131 | '{' [ statement-list ] '}' 132 ; 133 134 return-statement = 135 | 'return' [ expression ] ';' 136 ; 137 138 expr-statement = 139 | expression ';' 140 ;