![]() |
![]() |
![]() |
The Alan language is defined formally below using a BNF-form. This is a set of rules defining exactly what constructs are legal in an Alan source. The rules are numbered for easy reference.
The BNF form divides the structure of the input source into smaller parts (rules) which in turn are defined by other rules. For example rule 1 says that an ADVENTURE (in this case an Alan program) consists of options, units and a start section. In rule 1 we can see that an adventure is defined to contain a optional_options section, some units , and the start section. Each is in turn defined further down in the rules.
The equal sign (=) may thus be read as "consists of" or "is defined as". The exclamation mark indicates a choice between the two different constructs, for example in rule 6 through 8 one can see that an option may either be a single identifier ( ID ), an identifier followed by another identifier or an identifier followed by an integer . The semicolon indicates the end of the complete definition of the symbol on the left hand side of the equal sign.
1. <adventure> = <optional_options> <units> <start> ; 2. <optional_options> = 3. ! 'OPTIONS' <options> ; 4. <options> = <option> 5. ! <options> <option> ; 6. <option> = ID '.' 7. ! ID ID '.' 8. ! ID Integer '.' ; 9. <units> = <unit> 10. ! <units> <unit> ; 11. <unit> = <default> 12. ! <object_default> 13. ! <location_default> 14. ! <actor_default> 15. ! <messages> 16. ! <rule> 17. ! <synonyms> 18. ! <syntax> 19. ! <verb> 20. ! <location> 21. ! <object> 22. ! <container> 23. ! <actor> 24. ! <event> ; 25. <default> = 'DEFAULT' 'ATTRIBUTES' <attributes> ; 26. <location_default> = 'LOCATION' 'ATTRIBUTES' <attributes> ; 27. <object_default> = 'OBJECT' 'ATTRIBUTES' <attributes> ; 28. <actor_default> = 'ACTOR' 'ATTRIBUTES' <attributes> ; 29. <attributes> = <attribute> '.' 30. ! <attributes> <attribute> '.' ; 31. <attribute> = ID 32. ! 'NOT' ID 33. ! ID <optional_minus> Integer 34. ! ID STRING ; 35. <synonyms> = 'SYNONYMS' <synonym_list> ; 36. <synonym_list> = <synonym> 37. ! <synonym_list> <synonym> ; 38. <synonym> = <id_list> '=' ID '.' ; 39. <messages> = 'MESSAGE' <message_list> ; 40. <message_list> = <message> 41. ! <message_list> <message> ; 42. <message> = ID ':' <statements> ; 43. <syntax> = 'SYNTAX' <syntax_list> ; 44. <syntax_list> = <syntax_item> 45. ! <syntax_list> <syntax_item> ; 46. <syntax_item> = ID '=' <syntax_elements> <optional_class_restrictions> ; 47. <syntax_elements> = <syntax_element> 48. ! <syntax_elements> <syntax_element> ; 49. <syntax_element> = ID 50. ! '(' ID ')' <optional_indicators> ; 51. <optional_indicators> = 52. ! <optional_indicators> <indicator> ; 53. <indicator> = '*' 54. ! '!' ; 55. <optional_class_restrictions> = '.' 56. ! 'WHERE' <class_restrictions> ; 57. <class_restrictions> = <class_restriction> 58. ! <class_restrictions> 'AND' <class_restriction> ; 59. <class_restriction> = ID 'ISA' <classes> 'ELSE' <statements> ; 60. <classes> = <class_identifier> 61. ! <classes> 'OR' <class_identifier> ; 62. <class_identifier> = 'OBJECT' 63. ! 'ACTOR' 64. ! 'CONTAINER' 65. ! 'INTEGER' 66. ! 'STRING' 67. ! 'CONTAINER' 'OBJECT' 68. ! 'CONTAINER' 'ACTOR' ; 69. <optional_verbs> = 70. ! <optional_verbs> <verb> ; 71. <verb> = <verb_header> <verb_body> <verb_tail> ; 72. <verb_header> = 'VERB' <id_list> ; 73. <verb_body> = <simple_verb_body> 74. ! <verb_alternatives> ; 75. <verb_alternatives> = <verb_alternative> 76. ! <verb_alternatives> <verb_alternative> ; 77. <verb_alternative> = 'WHEN' ID <simple_verb_body> ; 78. <simple_verb_body> = <optional_checks> <optional_does> ; 79. <verb_tail> = 'END' 'VERB' <optional_id> '.' ; 80. <optional_checks> = 81. ! 'CHECK' <statements> 82. ! 'CHECK' <check_list> ; 83. <check_list> = <check> 84. ! <check_list> 'AND' <check> ; 85. <check> = <expression> 'ELSE' <statements> ; 86. <optional_does> = 87. ! <does> ; 88. <does> = 'DOES' <optional_qual> <statements> ; 89. <location> = <location_header> <location_body> <location_tail> ; 90. <location_header> = 'LOCATION' ID <optional_name> ; 91. <location_body> = 92. ! <location_body> <location_body_part> ; 93. <location_body_part> = <description> 94. ! <does> 95. ! <is> <attributes> 96. ! <exit> 97. ! <verb> ; 98. <location_tail> = 'END' 'LOCATION' <optional_id> '.' ; 99. <optional_exits> = 100. ! <optional_exits> <exit> ; 101. <exit> = 'EXIT' <id_list> 'TO' ID <optional_exit_body> '.' ; 102. <optional_exit_body> = 103. ! <optional_checks> <optional_does> 'END' 'EXIT' <optional_id> ; 104. <object> = <object_header> <object_body> <object_tail> ; 105. <object_header> = 'OBJECT' ID <optional_where> <optional_names> <optional_where> ; 106. <object_body> = 107. ! <object_body> <object_body_part> ; 108. <object_body_part> = <properties> 109. ! <description> 110. ! <article> 111. ! <mentioned> 112. ! <is> <attributes> 113. ! <verb> ; 114. <object_tail> = 'END' 'OBJECT' <optional_id> '.' ; 115. <optional_attributes> = 116. ! <optional_attributes> <is> <attributes> ; 117. <is> = 'IS' 118. ! 'ARE' 119. ! 'HAS' ; 120. <optional_description> = 121. ! <description> ; 122. <description> = 'DESCRIPTION' 123. ! 'DESCRIPTION' <statements> ; 124. <article> = 'ARTICLE' 125. ! 'ARTICLE' <statements> ; 126. <mentioned> = 'MENTIONED' <statements> ; 127. <optional_name> = 128. ! <name> ; 129. <optional_names> = 130. ! <optional_names> <name> ; 131. <name> = 'NAME' <ids> ; 132. <properties> = 'CONTAINER' <container_body> ; 133. <container> = <container_header> <container_body> <container_tail> ; 134. <container_header> = 'CONTAINER' ID ; 135. <container_body> = <optional_limits> <optional_header> <optional_empty> ; 136. <container_tail> = 'END' 'CONTAINER' <optional_id> '.' ; 137. <optional_limits> = 138. ! 'LIMITS' <limits> ; 139. <limits> = <limit> 140. ! <limits> <limit> ; 141. <limit> = <limit_attribute> 'THEN' <statements> ; 142. <limit_attribute> = <attribute> 143. ! 'COUNT' Integer ; 144. <optional_header> = 145. ! 'HEADER' <statements> ; 146. <optional_empty> = 147. ! 'ELSE' <statements> ; 148. <event> = <event_header> <statements> <event_tail> ; 149. <event_header> = 'EVENT' ID ; 150. <event_tail> = 'END' 'EVENT' <optional_id> '.' ; 151. <actor> = <actor_header> <actor_body> <actor_tail> ; 152. <actor_header> = 'ACTOR' ID <optional_where> <optional_names> <optional_where> ; 153. <actor_body> = 154. ! <actor_body> <actor_body_part> ; 155. <actor_body_part> = <properties> 156. ! <description> 157. ! <is> <attributes> 158. ! <verb> 159. ! <script> ; 160. <actor_tail> = 'END' 'ACTOR' <optional_id> '.' ; 161. <optional_actor_script> = 162. ! <optional_actor_script> <script> ; 163. <script> = 'SCRIPT' <integer_or_id> '.' <optional_description> <step_list> ; 164. <step_list> = <step> 165. ! <step_list> <step> ; 166. <step> = 'STEP' <statements> 167. ! 'STEP' 'AFTER' Integer <statements> 168. ! 'STEP' 'WAIT' 'UNTIL' <expression> <statements> ; 169. <rule> = 'WHEN' <expression> '=>' <statements> ; 170. <start> = 'START' <where> '.' <optional_statements> ; 171. <optional_statements> = 172. ! <statements> ; 173. <statements> = <statement> 174. ! <statements> <statement> ; 175. <statement> = <output_statement> 176. ! <special_statement> 177. ! <manipulation_statement> 178. ! <event_statement> 179. ! <assignment_statement> 180. ! <actor_statement> 181. ! <comparison_statement> ; 182. <output_statement> = STRING 183. ! 'DESCRIBE' <what> '.' 184. ! 'SAY' <expression> '.' 185. ! 'LIST' <what> '.' ; 186. <special_statement> = 'QUIT' '.' 187. ! 'LOOK' '.' 188. ! 'SAVE' '.' 189. ! 'RESTORE' '.' 190. ! 'RESTART' '.' 191. ! 'SCORE' <optional_integer> '.' 192. ! 'VISITS' Integer '.' 193. ! 'SYSTEM' STRING '.' ; 194. <manipulation_statement> = 'EMPTY' <what> <optional_where> '.' 195. ! 'LOCATE' <what> <where> '.' ; 196. <event_statement> = 'CANCEL' ID '.' 197. ! 'SCHEDULE' ID <optional_where> 'AFTER' <expression> '.' ; 198. <assignment_statement> = 'MAKE' <what> <something> '.' 199. ! 'INCREASE' <attribute_reference> <optional_by_clause> '.' 200. ! 'DECREASE' <attribute_reference> <optional_by_clause> '.' 201. ! 'SET' <attribute_reference> 'TO' <expression> '.' ; 202. <optional_by_clause> = 203. ! 'BY' <expression> ; 204. <comparison_statement> = <if_statement> 205. ! <depending_statement> ; 206. <if_statement> = 'IF' <expression> 'THEN' <statements> <optional_elsif_list> <optional_else_part> 'END' 'IF' '.' ; 207. <optional_elsif_list> = 208. ! <elsif_list> ; 209. <elsif_list> = 'ELSIF' <expression> 'THEN' <statements> 210. ! <elsif_list> 'ELSIF' <expression> 'THEN' <statements> ; 211. <optional_else_part> = 212. ! 'ELSE' <statements> ; 213. <depending_statement> = 'DEPENDING' 'ON' <primary> <depend_cases> 'END' 'DEPEND' '.' ; 214. <depend_cases> = <depend_case> 215. ! <depend_cases> <depend_case> ; 216. <depend_case> = 'ELSE' <statements> 217. ! <right_hand_side> ':' <statements> ; 218. <actor_statement> = 'USE' 'SCRIPT' <integer_or_id> <optional_for_actor> '.' ; 219. <optional_for_actor> = 220. ! 'FOR' ID ; 221. <expression> = <term> 222. ! <expression> 'OR' <term> ; 223. <term> = <factor> 224. ! <term> 'AND' <factor> ; 225. <factor> = <primary> 226. ! <primary> <right_hand_side> ; 227. <right_hand_side> = <optional_not> <where> 228. ! <binop> <primary> 229. ! <optional_not> <relop> <primary> 230. ! <is> <something> 231. ! <optional_not> 'CONTAINS' <factor> 232. ! <optional_not> 'BETWEEN' <factor> 'AND' <factor> ; 233. <primary> = <optional_minus> Integer 234. ! STRING 235. ! <what> 236. ! 'SCORE' 237. ! <aggregate> <where> 238. ! '(' <expression> ')' 239. ! <attribute_reference> 240. ! 'RANDOM' <primary> 'TO' <primary> ; 241. <aggregate> = 'COUNT' 242. ! 'SUM' 'OF' ID 243. ! 'MAX' 'OF' ID ; 244. <something> = <optional_not> ID ; 245. <what> = 'OBJECT' 246. ! 'LOCATION' 247. ! 'ACTOR' 248. ! ID ; 249. <optional_where> = 250. ! <where> ; 251. <where> = 'HERE' 252. ! 'NEARBY' 253. ! 'AT' <what> 254. ! 'IN' <what> ; 255. <binop> = '+' 256. ! '-' 257. ! '*' 258. ! '/' ; 259. <relop> = '<>' 260. ! '=' 261. ! '==' 262. ! '>=' 263. ! '<=' 264. ! '>' 265. ! '<' ; 266. <optional_qual> = 267. ! 'BEFORE' 268. ! 'AFTER' 269. ! 'ONLY' ; 270. <optional_not> = 271. ! 'NOT' ; 272. <optional_id> = 273. ! ID ; 274. <ids> = ID 275. ! <ids> ID ; 276. <id_list> = ID 277. ! <id_list> ',' ID ; 278. <optional_integer> = 279. ! Integer ; 280. <optional_minus> = 281. ! '-' ; 282. <attribute_reference> = ID 'OF' <what> ; 283. <integer_or_id> = Integer 284. ! ID ; 285. ID = IDENT 286. ! 'DEFAULT' 287. ! 'ARTICLE' 288. ! 'MESSAGE' 289. ! 'QUIT' 290. ! 'SAVE' 291. ! 'RESTORE' 292. ! 'RESTART' 293. ! 'WAIT' 294. ! 'BETWEEN' 295. ! 'CONTAINS' 296. ! 'ON' 297. ! 'IN' ;
![]() |
![]() |
![]() |