1.s1 2program: 3 Cimplement Iidentifier-listC ; Itop-declaration-sequence 4.s2 5.s1 6top-declaration-sequence: 7 top-declaration 8 top-declaration-sequence top-declaration 9.s2 10.s1 11top-declaration: 12 declaration 13 identifier-listC := IexpressionC ;I 14 identifier-listC = IexpressionC ;I 15 C( Iidentifier-listC ) := IexpressionC ;I 16 module-declaration 17 function-definition 18 adt-declaration 19.s2 20.s1 21declaration: 22 identifier-listC : ItypeC ;I 23 identifier-listC : ItypeC = IexpressionC ;I 24 identifier-listC : con IexpressionC ;I 25 Iidentifier-listC : import Iidentifier C;I 26 identifier-listC : typeI typeC ;I 27 identifier-listC : exceptionI tuple-typeO 28 Cinclude Istring-constantC ;I 29.s2 30.s1 31identifier-list: 32 identifier 33 identifier-listC , Iidentifier 34.s2 35.s1 36expression-list: 37 expression 38 expression-listC , Iexpression 39.s2 40.s1 41type: 42 data-type 43 function-type 44.s2 45.s1 46data-type: 47 CbyteI 48 CintI 49 CbigI 50 CrealI 51 CstringI 52 tuple-type 53 Carray of Idata-type 54 Clist of Idata-type 55 Cchan of Idata-type 56 adt-type 57 Cref Iadt-type 58 Cref Ifunction-type 59 module-type 60 module-qualified-type 61 type-name 62.s2 63.s1 64tuple-type: 65 C( Idata-type-listC )I 66.s2 67.s1 68data-type-list: 69 data-type 70 data-type-list C,I data-type 71.s2 72.s1 73adt-type: 74 identifier 75 module-qualified-type 76.s2 77.s1 78module-type: 79 identifier 80.s2 81.s1 82module-qualified-type: 83 identifier C->I identifier 84.s2 85.s1 86type-name: 87 identifier 88.s2 89.s1 90function-type: 91 Cfn Ifunction-arg-ret 92.s2 93.s1 94function-arg-ret: 95 C( Iformal-arg-listOC ) IraisesO 96 C( Iformal-arg-listOC ) : Idata-type raisesO 97.s2 98.s1 99formal-arg-list: 100 formal-arg 101 formal-arg-listC , Iformal-arg 102.s2 103.s1 104formal-arg: 105 nil-or-ID-listC : Itype 106 nil-or-IDC : self refO Iidentifier 107 nil-or-IDC : self Iidentifier 108 C*I 109.s2 110.s1 111nil-or-ID-list: 112 nil-or-ID 113 nil-or-ID-list C, Inil-or-ID 114.s2 115.s1 116nil-or-ID: 117 identifier 118 CnilI 119.s2 120.s1 121raises: 122 Craises ( Inil-or-ID-listC )I 123 CraisesI nil-or-ID 124.s2 125.s1 126module-declaration: 127 IidentifierC : module { Imod-member-listOC } ;I 128.s2 129.s1 130mod-member-list: 131 mod-member 132 mod-member-list mod-member 133.s2 134.s1 135mod-member: 136 identifier-listC : Ifunction-typeC ;I 137 identifier-listC : Idata-typeC ;I 138 adt-declarationC I 139 identifier-listC : con Iexpression C;I 140 identifier-listC : type Itype C;I 141.s2 142.s1 143adt-declaration: 144 IidentifierC : adt { Iadt-member-listOC } ;I 145.s2 146.s1 147adt-member-list: 148 adt-member 149 adt-member-list adt-member 150.s2 151.s1 152adt-member: 153 identifier-listC : cyclicO Idata-typeC ;I 154 identifier-listC : con IexpressionC ;I 155 identifier-listC : Ifunction-typeC ;I 156 Cpick { Ipick-member-listC }I 157.s2 158.s1 159pick-member-list: 160 pick-tag-listC =>I 161 pick-member-list pick-tag-listC =>I 162 pick-member-list identifier-listC : cyclicO Idata-typeC ;I 163.s2 164.s1 165pick-tag-list: 166 identifier 167 pick-tag-listC or Iidentifier 168.s2 169.s1 170function-definition: 171 function-name-part function-arg-retC { IstatementsC }I 172.s2 173.s1 174function-name-part: 175 identifier 176 function-name-partC . Iidentifier 177.s2 178.s1 179statements: 180 (empty) 181 statements declaration 182 statements statement 183.s2 184.s1 185statement: 186 expressionC ;I 187 C;I 188 C{ IstatementsC }I 189 Cif ( IexpressionC ) Istatement 190 Cif ( IexpressionC ) IstatementC else Istatement 191 labelO Cwhile ( IexpressionOC ) Istatement 192 labelO Cdo IstatementC while ( IexpressionOC ) ;I 193 labelO Cfor ( IexpressionOC ; IexpressionOC ; IexpressionOC ) Istatement 194 labelO Ccase IexpressionC { Iqual-statement-sequenceC }I 195 labelO Calt { Iqual-statement-sequenceC }I 196 labelO Cpick IidentifierC := IexpressionC { Ipqual-statement-sequenceC }I 197 Cbreak IidentifierOC ;I 198 Ccontinue IidentifierOC ;I 199 Creturn IexpressionOC ;I 200 Cspawn ItermC ( Iexpression-listOC ) ;I 201 Cexit ;I 202 Craise IexpressionOC ;I 203 C{ IstatementsC } exceptionI identifierOC{ Iqual-statement-sequenceC }I 204.s2 205.s1 206label: 207 identifier C:I 208.s2 209.s1 210qual-statement-sequence: 211 qual-listC =>I 212 qual-statement-sequence qual-listC =>I 213 qual-statement-sequence statement 214 qual-statement-sequence declaration 215.s2 216.s1 217qual-list: 218 qualifier 219 qual-listC or Iqualifier 220.s2 221.s1 222qualifier: 223 expression 224 expressionC to Iexpression 225 C*I 226.s2 227.s1 228pqual-statement-sequence: 229 pqual-listC =>I 230 pqual-statement-sequence pqual-listC =>I 231 pqual-statement-sequence statement 232 pqual-statement-sequence declaration 233.s2 234.s1 235pqual-list: 236 pqualifier 237 pqual-listC or Ipqualifier 238.s2 239.s1 240pqualifier: 241 identifier 242 C*I 243.s2 244.s1 245expression: 246 binary-expression 247 lvalue-expression assignment-operator expression 248 C( Ilvalue-expression-listC ) = Iexpression 249 send-expression 250 declare-expression 251 load-expression 252.s2 253.s1 254binary-expression: 255 monadic-expression 256 binary-expression binary-operator binary-expression 257.s2 258.s1 259binary-operator: one of 260 C** * / % + - << >> < > <= >= == != & ^ | :: && ||I 261.s2 262.s1 263assignment-operator: one of 264 C= &= |= ^= <<= >>= += -= *= /= %=I 265.s2 266.s1 267lvalue-expression: 268 identifier 269 CnilI 270 termC [ IexpressionC ]I 271 termC [ IexpressionC : ]I 272 termC . Iidentifier 273 C( Ilvalue-expression-listC )I 274 C* Imonadic-expression 275.s2 276.s1 277lvalue-expression-list: 278 lvalue-expression 279 lvalue-expression-listC , Ilvalue-expression 280.s2 281.s1 282expression: 283 term 284 monadic-operator monadic-expression 285 Carray [ IexpressionC ] of Idata-type 286 Carray [ IexpressionOC ] of { Iinit-listC }I 287 Clist of { Iexpression-listC }I 288 Cchan of Idata-type 289 Cchan [ IexpressionOC ] of Idata-type 290 data-type monadic-expression 291.s2 292.s1 293term: 294 identifier 295 constant 296 real-constant 297 string-constant 298 CnilI 299 C( Iexpression-listC )I 300 termC . Iidentifier 301 termC -> Iterm 302 termC ( Iexpression-listOC )I 303 termC [ IexpressionC ]I 304 termC [ IexpressionC : IexpressionC ]I 305 termC [ IexpressionC : ]I 306 termC ++I 307 termC --I 308.s2 309.s1 310monadic-operator: one of 311 C+ - ! ~ ref * ++ -- <- hd tl len tagofI 312.s2 313.s1 314init-list: 315 element 316 init-listC , Ielement 317.s2 318.s1 319element: 320 expression 321 expressionC => Iexpression 322 C* => Iexpression 323.s2 324.s1 325send-expression: 326 lvalue-expressionC <- = Iexpression 327.s2 328.s1 329declare-expression: 330 lvalue-expressionC := Iexpression 331.s2 332.s1 333load-expression: 334 Cload Iidentifier expression 335.s2 336