Run-Time Messages Table of Contents Compiler Error Messages

B ALAN LANGUAGE GRAMMAR

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'  
        ; 
 
Run-Time Messages Table of Contents Compiler Error Messages