/[eiffelstudio]/branches/CAT_mono/Src/framework/parser/parser/eiffel_parser_skeleton.e
ViewVC logotype

Contents of /branches/CAT_mono/Src/framework/parser/parser/eiffel_parser_skeleton.e

Parent Directory Parent Directory | Revision Log Revision Log


Revision 69687 - (show annotations)
Wed Jul 25 18:55:08 2007 UTC (12 years, 4 months ago) by martins
File size: 22784 byte(s)
* monomorph for formals
* covaraince for generics (syntax only)
1 indexing
2
3 description: "Eiffel parser skeletons"
4 legal: "See notice at end of class."
5 status: "See notice at end of class."
6 date: "$Date$"
7 revision: "$Revision$"
8
9 deferred class EIFFEL_PARSER_SKELETON
10
11 inherit
12
13 YY_PARSER_SKELETON
14 rename
15 parse as yyparse,
16 make as make_parser_skeleton
17 redefine
18 report_error, clear_all
19 end
20
21 EIFFEL_SCANNER
22 rename
23 make as make_eiffel_scanner,
24 make_with_factory as make_eiffel_scanner_with_factory
25 redefine
26 reset
27 end
28
29 SHARED_PARSER_FILE_BUFFER
30 export {NONE} all end
31
32 PREDEFINED_NAMES
33 export {NONE} all end
34
35 feature {NONE} -- Initialization
36
37 make is
38 -- Create a new pure Eiffel parser.
39 local
40 l_factory: AST_FACTORY
41 do
42 create l_factory
43 make_with_factory (l_factory)
44 end
45
46 make_with_factory (a_factory: AST_FACTORY) is
47 require
48 a_factory_not_void: a_factory /= Void
49 do
50 make_eiffel_scanner_with_factory (a_factory)
51 make_parser_skeleton
52 create suppliers.make
53 create formal_parameters.make (Initial_formal_parameters_capacity)
54 formal_parameters.compare_objects
55 is_supplier_recorded := True
56 create counters.make (Initial_counters_capacity)
57 create counters2.make (Initial_counters_capacity)
58 create last_rsqure.make (initial_counters_capacity)
59 create feature_stack.make (1)
60 add_feature_frame
61 end
62
63 feature -- Parser type setting
64
65 set_il_parser is
66 -- Create a new IL Eiffel parser.
67 require
68 parsing_type_not_set: not has_parsing_type
69 do
70 il_parser := True
71 ensure
72 il_parser: il_parser
73 parsing_type_set: has_parsing_type
74 end
75
76 set_type_parser is
77 -- Create a new Eiffel type parser.
78 require
79 parsing_type_not_set: not has_parsing_type
80 do
81 type_parser := True
82 ensure
83 type_parser: type_parser
84 parsing_type_set: has_parsing_type
85 end
86
87 set_expression_parser is
88 -- Create a new Eiffel expression parser.
89 require
90 parsing_type_not_set: not has_parsing_type
91 do
92 expression_parser := True
93 ensure
94 expression_parser: expression_parser
95 parsing_type_set: has_parsing_type
96 end
97
98 set_feature_parser is
99 -- Create a new Eiffel feature parser.
100 require
101 parsing_type_not_set: not has_parsing_type
102 do
103 feature_parser := True
104 ensure
105 feature_parser: feature_parser
106 parsing_type_set: has_parsing_type
107 end
108
109 set_indexing_parser is
110 -- Create a new Eiffel indexing clause parser.
111 require
112 parsing_type_not_set: not has_parsing_type
113 do
114 indexing_parser := True
115 ensure
116 indexing_parser: indexing_parser
117 parsing_type_set: has_parsing_type
118 end
119
120 set_invariant_parser is
121 -- Create a new Eiffel invariant clause parser.
122 require
123 parsing_type_not_set: not has_parsing_type
124 do
125 invariant_parser := True
126 ensure
127 invariant_parser: invariant_parser
128 parsing_type_set: has_parsing_type
129 end
130
131 set_entity_declaration_parser is
132 -- Create a new Eiffel entity decalration parser.
133 require
134 parsing_type_not_set: not has_parsing_type
135 do
136 entity_declaration_parser := True
137 ensure
138 entity_declaration_parser: entity_declaration_parser
139 parsing_type_set: has_parsing_type
140 end
141
142 feature -- Status report [hide]
143
144 has_parsing_type: BOOLEAN is
145 -- Has parsing type been specified?
146 do
147 Result := il_parser or type_parser or expression_parser or
148 indexing_parser or entity_declaration_parser or invariant_parser or
149 feature_parser
150 end
151
152 feature -- Initialization
153
154 reset is
155 -- Reset Parser before parsing next input source.
156 -- (This routine can be called in wrap before scanning
157 -- another input buffer.)
158 do
159 Precursor
160 create suppliers.make
161 formal_parameters.wipe_out
162 feature_stack.wipe_out
163 add_feature_frame
164 is_supplier_recorded := True
165 is_constraint_renaming := False
166 once_manifest_string_count := 0
167 counters.wipe_out
168 last_rsqure.wipe_out
169 end
170
171 feature -- Status report
172
173 is_constraint_renaming: BOOLEAN
174 -- Is the parser parsing a constraint renaming?
175
176 is_parsing_class_head: BOOLEAN
177 -- Is the parser parsing a class hed?
178
179 il_parser: BOOLEAN
180 -- Is current Eiffel parser an IL Eiffel parser?
181
182 type_parser: BOOLEAN
183 -- Is current Eiffel parser a type parser?
184
185 expression_parser: BOOLEAN
186 -- Is current Eiffel parser an expression parser ?
187
188 feature_parser: BOOLEAN
189 -- Is `Current' a feature parser?
190
191 indexing_parser: BOOLEAN
192 -- Is current Eiffel parser an indexing clause parser ?
193
194 invariant_parser: BOOLEAN
195 -- Is current Eiffel parser an invariant clause parser ?
196
197 entity_declaration_parser: BOOLEAN
198 -- Is current Eiffel parser a entity declaration parser ?
199
200 feature -- Parsing
201
202 parse (a_file: KL_BINARY_INPUT_FILE) is
203 -- Parse Eiffel class text from `a_file'.
204 -- Make result available in appropriate result node.
205 -- An exception is raised if a syntax error is found.
206 require
207 a_file_not_void: a_file /= Void
208 a_file_open_read: a_file.is_open_read
209 do
210 reset_nodes
211 File_buffer.set_file (a_file)
212 input_buffer := File_buffer
213 yy_load_input_buffer
214 filename := a_file.name
215 ast_factory.create_match_list (initial_match_list_size)
216 yyparse
217 match_list := ast_factory.match_list
218 reset
219 rescue
220 reset
221 end
222
223 parse_from_string (a_string: STRING) is
224 -- Parse Eiffel class text in `a_string'.
225 -- Make result available in appropriate result node.
226 -- An exception is raised if a syntax error is found.
227 require
228 a_string_not_void: a_string /= Void
229 do
230 reset_nodes
231 create input_buffer.make (a_string)
232 yy_load_input_buffer
233 ast_factory.create_match_list (initial_match_list_size)
234 yyparse
235 match_list := ast_factory.match_list
236 reset
237 rescue
238 reset
239 end
240
241 feature -- Access: result nodes
242
243 root_node: CLASS_AS
244 -- Root node of AST
245
246 type_node: TYPE_AS
247 -- Type node of AST
248
249 expression_node: EXPR_AS
250 -- Expression node of AST
251
252 feature_node: FEATURE_AS
253 -- Feature node of AST
254
255 indexing_node: INDEXING_CLAUSE_AS
256 -- Indexing clause node of AST
257
258 invariant_node: INVARIANT_AS
259 -- Invariant node of AST
260
261 entity_declaration_node: EIFFEL_LIST [TYPE_DEC_AS]
262 -- Local clause node of AST
263
264 feature -- Access
265
266 suppliers: SUPPLIERS_AS
267 -- Suppliers of class being parsed
268
269 formal_parameters: ARRAYED_LIST [FORMAL_AS]
270 -- Name of formal generic parameters
271 -- of class being parsed
272
273 formal_generics_end_position: INTEGER
274 -- End of formal generics, if present
275
276 inheritance_end_position: INTEGER
277 -- End of inheritance clause
278
279 features_end_position: INTEGER
280 -- End of feature clauses
281
282 invariant_end_position: INTEGER
283 -- End of invariant
284
285 once_manifest_string_count: INTEGER
286 -- Number of once manifest strings in current feature declaration
287 -- or in an invariant
288
289 feature_clause_end_position: INTEGER
290 -- End of a feature clause
291
292 feature -- Removal
293
294 reset_nodes is
295 -- Clean all top nodes.
296 do
297 root_node := Void
298 type_node := Void
299 expression_node := Void
300 indexing_node := Void
301 entity_declaration_node := Void
302 ensure
303 root_node_void: root_node = Void
304 type_node_void: type_node = Void
305 expression_node_void: expression_node = Void
306 indexing_node_void: indexing_node = Void
307 entity_declaration_node_void: entity_declaration_node = Void
308 end
309
310 wipe_out is
311 -- Release unused objects to garbage collector.
312 do
313 reset_nodes
314 clear_stacks
315 ensure
316 root_node_void: root_node = Void
317 type_node_void: type_node = Void
318 expression_node_void: expression_node = Void
319 indexing_node_void: indexing_node = Void
320 entity_declaration_node_void: entity_declaration_node = Void
321 end
322
323 clear_all is
324 -- Clear temporary objects so that they can be collected
325 -- by the garbage collector. (This routine is called by
326 -- `parse' before exiting.)
327 do
328 end
329
330 feature {NONE} -- Implementation
331
332 set_is_parsing_class_head (a_flag_value: BOOLEAN)
333 -- Set is_parsing_class_head to `a_flag_value'.
334 do
335 is_parsing_class_head := a_flag_value
336 ensure
337 is_parsing_class_head_is_set: is_parsing_class_head = a_flag_value
338 end
339
340 id_level: INTEGER is
341 -- Boolean for controlling the semantic
342 -- action of rule `A_feature'
343 require
344 not feature_stack.is_empty
345 do
346 Result := feature_stack.item.id_level
347 end
348
349 set_id_level (a_id_level: INTEGER) is
350 -- Sets the current id_level to `a_id_level'
351 require
352 not feature_stack.is_empty
353 do
354 feature_stack.item.id_level := a_id_level
355 end
356
357 fbody_pos: INTEGER is
358 -- To memorize the beginning of a feature body
359 require
360 not feature_stack.is_empty
361 do
362 Result := feature_stack.item.fbody_pos
363 end
364
365 set_fbody_pos (a_fbody_pos: INTEGER) is
366 require
367 not feature_stack.is_empty
368 do
369 feature_stack.item.fbody_pos := a_fbody_pos
370 end
371
372 feature_stack: DS_ARRAYED_STACK [TUPLE [id_level, fbody_pos: INTEGER]]
373 -- id_level and fbody_pos are needed per feature body. Since there are inline agents
374 -- we need a stack of them. It may be, that there is no feature at all when its used
375 -- for an invariant. We never remove the first element of the stack.
376
377 add_feature_frame is
378 do
379 feature_stack.force ([Normal_level, 0])
380 end
381
382 remove_feature_frame
383 require
384 feature_stack.count > 1
385 do
386 feature_stack.remove
387 end
388
389 is_deferred: BOOLEAN
390 -- Boolean mark for deferred class
391
392 is_expanded: BOOLEAN
393 -- Boolean mark for expanded class
394
395 is_frozen_class: BOOLEAN
396 -- Boolean mark for sealed/frozen class, ie not
397 -- inheritable by other classes.
398
399 is_external_class: BOOLEAN
400 -- Boolean mark for class that should not be generated
401 -- by Eiffel compiler since they are already generated
402 -- within runtime environment.
403
404 is_partial_class: BOOLEAN
405 -- Boolean mark for class whose definition if spread
406 -- amongst multiple files.
407
408 is_separate: BOOLEAN
409 -- Boolean mark for separate class
410
411 has_convert_mark: BOOLEAN
412 -- Boolean mark for alias names with convert mark
413
414 has_type: BOOLEAN
415 -- Is expression undoubtly typed?
416
417 initial_has_old_verbatim_strings_warning: BOOLEAN
418 -- Value of `has_old_verbatim_strings_warning' when parser was started
419
420 fclause_pos: KEYWORD_AS
421 -- To memorize the beginning of a feature clause
422
423 feature_indexes: INDEXING_CLAUSE_AS
424 -- Indexing clause for an Eiffel feature.
425 -- IL only
426
427 frozen_keyword,
428 expanded_keyword,
429 deferred_keyword,
430 separate_keyword,
431 external_keyword: KEYWORD_AS
432 -- Keywords that may appear in header mark of a class
433
434 ast_location: LOCATION_AS
435 -- Temp location
436
437 constraining_type_list: CONSTRAINT_LIST_AS
438 -- Temp list of constraining types.
439
440 last_class_type: CLASS_TYPE_AS
441 -- Temporary local in semantic actions when
442 -- performing assignment attempts.
443
444 last_identifier_list: IDENTIFIER_LIST
445 -- Temporary locals in semantic actions.
446
447 last_type_list: TYPE_LIST_AS
448 -- Temporary locals in semantic actions.
449
450 last_type: TYPE_AS
451 -- Temporary locals in semantic actions.
452
453 last_symbol: SYMBOL_AS
454 -- Temporary locals in semantic actions.
455
456 last_rsqure: DS_ARRAYED_STACK [SYMBOL_AS]
457 -- Stack of ']'s used for parsing named tuples
458
459 feature {NONE} -- Counters
460
461 counter_value: INTEGER is
462 -- Value of the last counter registered
463 require
464 counters_not_empty: not counters.is_empty
465 do
466 Result := counters.item
467 ensure
468 value_positive: Result >= 0
469 end
470
471 counter2_value: INTEGER is
472 -- Value of the last counter registered
473 require
474 counters2_not_empty: not counters2.is_empty
475 do
476 Result := counters2.item
477 ensure
478 value_positive: Result >= 0
479 end
480
481 add_counter is
482 -- Register a new counter.
483 do
484 counters.force (0)
485 ensure
486 one_more: counters.count = old counters.count + 1
487 value_zero: counter_value = 0
488 end
489
490 add_counter2 is
491 -- Register a new counter.
492 do
493 counters2.force (0)
494 ensure
495 one_more: counters2.count = old counters2.count + 1
496 value_zero: counter2_value = 0
497 end
498
499 remove_counter is
500 -- Unregister last registered counter.
501 require
502 counters_not_empty: not counters.is_empty
503 do
504 counters.remove
505 ensure
506 one_less: counters.count = old counters.count - 1
507 end
508
509 remove_counter2 is
510 -- Unregister last registered counter.
511 require
512 counters2_not_empty: not counters2.is_empty
513 do
514 counters2.remove
515 ensure
516 one_less: counters2.count = old counters2.count - 1
517 end
518
519 increment_counter is
520 -- Increment `counter_value'.
521 require
522 counters_not_empty: not counters.is_empty
523 local
524 a_value: INTEGER
525 do
526 a_value := counters.item
527 counters.replace (a_value + 1)
528 ensure
529 same_counters_count: counters.count = old counters.count
530 one_more: counter_value = old counter_value + 1
531 end
532
533 increment_counter2 is
534 -- Increment `counter_value'.
535 require
536 counters2_not_empty: not counters2.is_empty
537 local
538 a_value: INTEGER
539 do
540 a_value := counters2.item
541 counters2.replace (a_value + 1)
542 ensure
543 same_counters2_count: counters2.count = old counters2.count
544 one_more: counter2_value = old counter2_value + 1
545 end
546
547 counters: DS_ARRAYED_STACK [INTEGER]
548 -- Counters currently in use by the parser
549 -- to build lists of AST nodes with the right size.
550
551 counters2: DS_ARRAYED_STACK [INTEGER]
552 -- Counters used for parsing tuples
553
554 feature {NONE} -- Actions
555
556 new_class_description (n: ID_AS; n2: STRING_AS;
557 is_d, is_e, is_s, is_fc, is_ex, is_par: BOOLEAN;
558 first_ind, last_ind: INDEXING_CLAUSE_AS; g: EIFFEL_LIST [FORMAL_DEC_AS];
559 p: PARENT_LIST_AS; c: EIFFEL_LIST [CREATE_AS]; co: CONVERT_FEAT_LIST_AS;
560 f: EIFFEL_LIST [FEATURE_CLAUSE_AS]; inv: INVARIANT_AS;
561 s: SUPPLIERS_AS; o: STRING_AS; ed: KEYWORD_AS): CLASS_AS is
562 -- New CLASS AST node;
563 -- Update the clickable list.
564 local
565 ext_name: STRING_AS
566 do
567 if n2 /= Void then
568 if not il_parser then
569 -- Trigger a syntax error.
570 raise_error
571 else
572 ext_name := n2
573 end
574 end
575 Result := ast_factory.new_class_as (n, ext_name, is_d, is_e, is_s, is_fc, is_ex, is_par, first_ind,
576 last_ind, g, p, c, co, f, inv, s, o, ed)
577 end
578
579 feature {NONE} -- ID factory
580
581 new_none_id: NONE_ID_AS is
582 -- New ID AST node for "NONE"
583 do
584 Result := ast_factory.new_filled_none_id_as (line, column, position, 4)
585 end
586
587 feature {NONE} -- Type factory
588
589 is_supplier_recorded: BOOLEAN
590 -- Are suppliers recorded in `suppliers'?
591
592 new_class_type (an_id: ID_AS; generics: TYPE_LIST_AS): TYPE_AS is
593 -- New class type (Take care of formal generics);
594 -- Update the clickable list and register the resulting
595 -- type as a supplier of the class being parsed.
596 local
597 class_name: ID_AS
598 formal_type, l_new_formal: FORMAL_AS
599 class_type: CLASS_TYPE_AS
600 do
601 if an_id /= Void then
602 class_name := an_id
603
604 if none_class_name_id = class_name.name_id then
605 if generics /= Void then
606 report_basic_generic_type_error
607 end
608 Result := ast_factory.new_none_type_as (an_id)
609 else
610 if generics = Void then
611 from
612 formal_parameters.start
613 until
614 formal_parameters.after
615 loop
616 formal_type := formal_parameters.item
617 if class_name.is_equal (formal_type.name) then
618 -- Shouldn't we just remove the formal type
619 -- name from the clickable list instead? (ericb)
620 l_new_formal := ast_factory.new_formal_as (an_id, formal_type.is_reference,
621 formal_type.is_expanded, formal_type.is_monomorph, formal_type.monomorph_keyword)
622 l_new_formal.set_position (formal_type.position)
623 Result := l_new_formal
624 -- Jump out of the loop.
625 formal_parameters.finish
626 end
627 formal_parameters.forth
628 end
629 end
630 if Result = Void then
631 -- It is a common class type.
632 class_type := ast_factory.new_class_type_as (class_name, generics)
633 if is_supplier_recorded then
634 -- Put the supplier in `suppliers'.
635 suppliers.insert_supplier_id (class_name)
636 end
637 Result := class_type
638 end
639 end
640 end
641 end
642
643 feature {NONE} -- Instruction factory
644
645 new_call_instruction_from_expression (e: EXPR_AS): INSTR_CALL_AS is
646 -- Check if expression `e' represents a call
647 -- and create a call instruction from it if this is the case.
648 -- Report syntax error otherwise.
649 local
650 expr_call: EXPR_CALL_AS
651 call: CALL_AS
652 leaf: LEAF_AS
653 creation_expr: CREATION_EXPR_AS
654 do
655 expr_call ?= e
656 if expr_call /= Void then
657 -- This is a call. Let's check if it is a normal feature call.
658 call ?= expr_call.call
659 leaf ?= call
660 creation_expr ?= call
661 if leaf /= Void or else creation_expr /= Void then
662 -- This is not a normal feature call.
663 call := Void
664 end
665 end
666 if call = Void then
667 -- Report error.
668 Error_handler.insert_error (create {SYNTAX_ERROR}.make (line, column, filename, "Expression cannot be used as an instruction", False))
669 Error_handler.raise_error
670 else
671 -- Make a call instruction.
672 Result := ast_factory.new_instr_call_as (call)
673 end
674 end
675
676 feature {AST_FACTORY} -- Error handling
677
678 report_basic_generic_type_error is
679 -- Basic types cannot have generic devivation.
680 local
681 an_error: BASIC_GEN_TYPE_ERR
682 do
683 create an_error.make (line, column, filename, "", False)
684 Error_handler.insert_error (an_error)
685 Error_handler.raise_error
686 end
687
688 report_invalid_type_for_real_error (a_type: TYPE_AS; a_real: STRING) is
689 -- Error when an incorrect type `a_type' is specified for a real constant `a_real'.
690 require
691 a_type_not_void: a_type /= Void
692 a_real_not_void: a_real /= Void
693 local
694 an_error: SYNTAX_ERROR
695 do
696 create an_error.make (line, column, filename,
697 "Specified type %"" + a_type.dump +
698 "%" is not a valid type for real constant %"" + a_real + "%"", False)
699 Error_handler.insert_error (an_error)
700 Error_handler.raise_error
701 end
702
703 report_invalid_type_for_integer_error (a_type: TYPE_AS; an_int: STRING) is
704 -- Error when an incorrect type `a_type' is specified for a real constant `a_real'.
705 require
706 a_type_not_void: a_type /= Void
707 an_int_not_void: an_int /= Void
708 local
709 an_error: SYNTAX_ERROR
710 do
711 create an_error.make (line, column, filename,
712 "Specified type %"" + a_type.dump +
713 "%" is not a valid type for integer constant %"" + an_int + "%"", False)
714 Error_handler.insert_error (an_error)
715 Error_handler.raise_error
716 end
717
718 report_integer_too_large_error (a_type: TYPE_AS; an_int: STRING) is
719 -- `an_int', although only made up of digits, doesn't fit
720 -- in an INTEGER (i.e. greater than maximum_integer_value).
721 require
722 an_int_not_void: an_int /= Void
723 local
724 an_error: SYNTAX_ERROR
725 l_message: STRING
726 do
727 fixme ("Change plain syntax error to Integer_too_large error when the corresponding validity rule is available.")
728 if a_type /= Void then
729 l_message := "Integer value " + an_int + " is too large for " + a_type.dump + "."
730 else
731 l_message := "Integer value " + an_int + " is too large for any integer type."
732 end
733 create an_error.make (line, column, filename, l_message, False)
734 Error_handler.insert_error (an_error)
735 Error_handler.raise_error
736 end
737
738 report_integer_too_small_error (a_type: TYPE_AS; an_int: STRING) is
739 -- `an_int', although only made up of digits, doesn't fit
740 -- in an INTEGER (i.e. less than minimum_integer_value).
741 require
742 an_int_not_void: an_int /= Void
743 local
744 an_error: SYNTAX_ERROR
745 l_message: STRING
746 do
747 fixme ("Change plain syntax error to Integer_too_small error when the corresponding validity rule is available.")
748 if a_type /= Void then
749 l_message := "Integer value " + an_int + " is too small for " + a_type.dump + "."
750 else
751 l_message := "Integer value " + an_int + " is too small for any integer type."
752 end
753 create an_error.make (line, column, filename, l_message, False)
754 Error_handler.insert_error (an_error)
755 Error_handler.raise_error
756 end
757
758 report_character_code_too_large_error (a_code: STRING) is
759 -- Integer encoded by `a_code' is too large to fit into a CHARACTER_32
760 require
761 a_code_not_void: a_code /= Void
762 local
763 l_message: STRING
764 an_error: BAD_CHARACTER
765 do
766 l_message := "Character code " + a_code + " is too large for CHARACTER_32."
767 create an_error.make (line, column, filename, l_message, False)
768 Error_handler.insert_error (an_error)
769 Error_handler.raise_error
770 end
771
772 report_error (a_message: STRING) is
773 -- A syntax error has been detected.
774 -- Print error message.
775 local
776 an_error: SYNTAX_ERROR
777 do
778 create an_error.make (line, column, filename, "", False)
779 Error_handler.insert_error (an_error)
780 Error_handler.raise_error
781 end
782
783 feature{NONE} -- Roundtrip
784
785 temp_string_as1: STRING_AS
786 temp_string_as2: STRING_AS
787 temp_keyword_as: KEYWORD_AS
788 temp_class_type_as: CLASS_TYPE_AS
789 temp_operand_as: OPERAND_AS
790 temp_address_current_as: ADDRESS_CURRENT_AS
791 temp_address_result_as: ADDRESS_RESULT_AS
792
793 feature {NONE} -- Constants
794
795 Initial_counters_capacity: INTEGER is 20
796 -- Initial capacity for `counters'
797
798 Initial_formal_parameters_capacity: INTEGER is 8
799 -- Initial capacity for `formal_parameters'
800 -- (See `eif_rtlimits.h')
801
802 Normal_level: INTEGER is 0
803 Assert_level: INTEGER is 1
804 Invariant_level: INTEGER is 2
805
806 invariant
807
808 suppliers_not_void: suppliers /= Void
809 formal_parameters_not_void: formal_parameters /= Void
810 no_void_formal_parameter: not formal_parameters.has (Void)
811 valid_id_level: (id_level = Normal_level) or
812 (id_level = Assert_level) or (id_level = Invariant_level)
813 is_external_class_not_set: not il_parser implies not is_external_class
814 is_partial_class_not_set: not il_parser implies not is_partial_class
815
816 indexing
817 copyright: "Copyright (c) 1984-2006, Eiffel Software"
818 license: "GPL version 2 (see http://www.eiffel.com/licensing/gpl.txt)"
819 licensing_options: "http://www.eiffel.com/licensing"
820 copying: "[
821 This file is part of Eiffel Software's Eiffel Development Environment.
822
823 Eiffel Software's Eiffel Development Environment is free
824 software; you can redistribute it and/or modify it under
825 the terms of the GNU General Public License as published
826 by the Free Software Foundation, version 2 of the License
827 (available at the URL listed under "license" above).
828
829 Eiffel Software's Eiffel Development Environment is
830 distributed in the hope that it will be useful, but
831 WITHOUT ANY WARRANTY; without even the implied warranty
832 of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
833 See the GNU General Public License for more details.
834
835 You should have received a copy of the GNU General Public
836 License along with Eiffel Software's Eiffel Development
837 Environment; if not, write to the Free Software Foundation,
838 Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
839 ]"
840 source: "[
841 Eiffel Software
842 356 Storke Road, Goleta, CA 93117 USA
843 Telephone 805-685-1006, Fax 805-685-6869
844 Website http://www.eiffel.com
845 Customer support http://support.eiffel.com
846 ]"
847
848 end -- class EIFFEL_PARSER_SKELETON
849

Properties

Name Value
svn:eol-style native
svn:keywords Author Date Id Revision

  ViewVC Help
Powered by ViewVC 1.1.23