File Coverage

blib/lib/Hardware/Vhdl/Parser.pm
Criterion Covered Total %
statement 1 3 33.3
branch n/a
condition n/a
subroutine 1 1 100.0
pod n/a
total 2 4 50.0


line stmt bran cond sub pod time code
1             ##################################################################
2             # Copyright (C) 2000 Greg London All Rights Reserved.
3             # This program is free software; you can redistribute it and/or
4             # modify it under the same terms as Perl itself.
5             ##################################################################
6              
7              
8             ##################################################################
9             # this module defines a grammar for the VHDL language
10             # that can be used by Parse::RecDescent
11             ##################################################################
12              
13             package Hardware::Vhdl::Parser;
14              
15 1     1   4413 use Parse::RecDescent;
  0            
  0            
16              
17             use strict;
18             use vars qw($VERSION @ISA);
19              
20              
21             @ISA = ( 'Parse::RecDescent' );
22              
23             $VERSION = '0.12';
24             #########################################################################
25              
26              
27             ##################################################################
28             sub new
29             ##################################################################
30             {
31             my ($pkg) = @_;
32              
33             # get the vhdl grammar defined in this file
34             my $vhdl_grammar = $pkg->grammar();
35              
36             # create a parser object, use SUPER:: to find the method via @ISA
37             my $r_hash = $pkg->SUPER::new ($vhdl_grammar);
38              
39             # bless it as a vhdl_parser object
40             bless $r_hash, $pkg;
41             return $r_hash;
42             }
43              
44              
45              
46             ##################################################################
47             sub grammar
48             ##################################################################
49             {
50              
51              
52              
53              
54              
55              
56              
57              
58              
59              
60              
61              
62              
63              
64              
65              
66              
67              
68              
69              
70              
71              
72              
73              
74              
75              
76              
77              
78              
79              
80              
81              
82              
83              
84              
85              
86              
87              
88              
89              
90              
91              
92              
93              
94              
95              
96              
97             # note, q{ statement should be on line 100,
98             # to make it easier to find referenced line numbers
99              
100             return q{
101              
102             #START_OF_GRAMMAR
103              
104             ####################################################
105             # define reserved words. case insensitive
106             ####################################################
107             reserved_word_abs :
108             /abs/i
109              
110             reserved_word_access :
111             /access/i
112              
113             reserved_word_after :
114             /after/i
115              
116             reserved_word_alias :
117             /alias/i
118              
119             reserved_word_all :
120             /all/i
121              
122             reserved_word_and :
123             /and/i
124              
125             reserved_word_architecture :
126             /architecture/i
127              
128             reserved_word_array :
129             /array/i
130              
131             reserved_word_assert :
132             /assert/i
133              
134             reserved_word_attribute :
135             /attribute/i
136              
137             reserved_word_begin :
138             /begin/i
139              
140             reserved_word_block :
141             /block/i
142              
143             reserved_word_body :
144             /body/i
145              
146             reserved_word_buffer :
147             /buffer/i
148              
149             reserved_word_bus :
150             /bus/i
151              
152             reserved_word_case :
153             /case/i
154              
155             reserved_word_component :
156             /component/i
157              
158             reserved_word_configuration :
159             /configuration/i
160              
161             reserved_word_constant :
162             /constant/i
163              
164             reserved_word_disconnect :
165             /disconnect/i
166              
167             reserved_word_downto :
168             /downto/i
169              
170             reserved_word_else :
171             /else/i
172              
173             reserved_word_elsif :
174             /elsif/i
175              
176             reserved_word_end :
177             /end/i
178              
179             reserved_word_entity :
180             /entity/i
181              
182             reserved_word_exit :
183             /exit/i
184              
185             reserved_word_file :
186             /file/i
187              
188             reserved_word_for :
189             /for/i
190              
191             reserved_word_function :
192             /function/i
193              
194             reserved_word_generate :
195             /generate/i
196              
197             reserved_word_generic :
198             /generic/i
199              
200             reserved_word_group :
201             /group/i
202              
203             reserved_word_guarded :
204             /guarded/i
205              
206             reserved_word_if :
207             /if/i
208              
209             reserved_word_impure :
210             /impure/i
211              
212             reserved_word_in :
213             /in/i
214              
215             reserved_word_inertial :
216             /inertial/i
217              
218             reserved_word_inout :
219             /inout/i
220              
221             reserved_word_is :
222             /is/i
223              
224             reserved_word_label :
225             /label/i
226              
227             reserved_word_library :
228             /library/i
229              
230             reserved_word_linkage :
231             /linkage/i
232              
233             reserved_word_literal :
234             /literal/i
235              
236             reserved_word_loop :
237             /loop/i
238              
239             reserved_word_map :
240             /map/i
241              
242             reserved_word_mod :
243             /mod/i
244              
245             reserved_word_nand :
246             /nand/i
247              
248             reserved_word_new :
249             /new/i
250              
251             reserved_word_next :
252             /next/i
253              
254             reserved_word_nor :
255             /nor/i
256              
257             reserved_word_not :
258             /not/i
259              
260             reserved_word_null :
261             /null/i
262              
263             reserved_word_of :
264             /of/i
265              
266             reserved_word_on :
267             /on/i
268              
269             reserved_word_open :
270             /open/i
271              
272             reserved_word_or :
273             /or/i
274              
275             reserved_word_others :
276             /others/i
277              
278             reserved_word_out :
279             /out/i
280              
281             reserved_word_package :
282             /package/i
283              
284             reserved_word_port :
285             /port/i
286              
287             reserved_word_postponed :
288             /postponed/i
289              
290             reserved_word_procedure :
291             /procedure/i
292              
293             reserved_word_process :
294             /process/i
295              
296             reserved_word_pure :
297             /pure/i
298              
299             reserved_word_range :
300             /range/i
301              
302             reserved_word_record :
303             /record/i
304              
305             reserved_word_register :
306             /register/i
307              
308             reserved_word_reject :
309             /reject/i
310              
311             reserved_word_rem :
312             /rem/i
313              
314             reserved_word_report :
315             /report/i
316              
317             reserved_word_return :
318             /return/i
319              
320             reserved_word_rol :
321             /rol/i
322              
323             reserved_word_ror :
324             /ror/i
325              
326             reserved_word_select :
327             /select/i
328              
329             reserved_word_severity :
330             /severity/i
331              
332             reserved_word_signal :
333             /signal/i
334              
335             reserved_word_shared :
336             /shared/i
337              
338             reserved_word_sla :
339             /sla/i
340              
341             reserved_word_sll :
342             /sll/i
343              
344             reserved_word_sra :
345             /sra/i
346              
347             reserved_word_srl :
348             /srl/i
349              
350             reserved_word_subtype :
351             /subtype/i
352              
353             reserved_word_then :
354             /then/i
355              
356             reserved_word_to :
357             /to/i
358              
359             reserved_word_transport :
360             /transport/i
361              
362             reserved_word_type :
363             /type/i
364              
365             reserved_word_unaffected :
366             /unaffected/i
367              
368             reserved_word_units :
369             /units/i
370              
371             reserved_word_until :
372             /until/i
373              
374             reserved_word_use :
375             /use/i
376              
377             reserved_word_variable :
378             /variable/i
379              
380             reserved_word_wait :
381             /wait/i
382              
383             reserved_word_when :
384             /when/i
385              
386             reserved_word_while :
387             /while/i
388              
389             reserved_word_with :
390             /with/i
391              
392             reserved_word_xnor :
393             /xnor/i
394              
395             reserved_word_xor :
396             /xor/i
397              
398              
399              
400             eofile : /^\Z/
401              
402             ####################################################
403             ####################################################
404              
405             design_file :
406             design_unit(s) eofile { $return = $item[1] }
407              
408             design_unit :
409             context_clause(s?) library_unit
410             |
411              
412             context_clause :
413             library_clause
414             | use_clause
415              
416             library_unit :
417             entity_declaration
418             | architecture_body
419             | package_declaration
420             | package_body
421             | configuration_declaration
422              
423             library_clause :
424             reserved_word_library library_name_list ';'
425              
426             library_name_list :
427             identifier_comma_identifier
428              
429             use_clause :
430             reserved_word_use
431             selected_name_comma_selected_name
432             ';'
433              
434             ####################################################
435             ####################################################
436              
437             entity_declaration :
438             reserved_word_entity
439             entity_name
440             reserved_word_is
441             generic_declaration_section(?)
442             port_declaration_section(?)
443             entity_declaritive_item(?)
444             begin_entity_section(?)
445             reserved_word_end
446             reserved_word_entity(?)
447             identifier(?)
448             ';'
449            
450              
451             begin_entity_section :
452             reserved_word_begin
453             ( concurrent_assertion_statement |
454             passive_concurrent_procedure_call_statement |
455             passive_process_statement )
456              
457             passive_concurrent_procedure_call_statement :
458             concurrent_procedure_call_statement
459              
460             passive_process_statement :
461             process_statement
462              
463             entity_declaritive_item :
464             | signal_declaration
465             | constant_declaration
466             | type_declaration
467             | subtype_declaration
468             | shared_variable_declaration
469             | file_declaration
470             | alias_declaration
471             | attribute_declaration
472             | attribute_specification
473             | disconnection_specification
474             | use_clause
475             | group_template_declaration
476             | group_declaration
477             | subprogram_declaration
478             | subprogram_body
479              
480             architecture_body :
481             reserved_word_architecture
482             identifier
483             reserved_word_of
484             entity_name
485             reserved_word_is
486             block_declarative_item(s?)
487             reserved_word_begin
488             concurrent_statement(s?)
489             reserved_word_end
490             reserved_word_architecture(?)
491             identifier(?)
492             ';'
493             |
494              
495             configuration_declaration :
496             reserved_word_configuration
497             identifier
498             reserved_word_of
499             entity_name
500             reserved_word_is
501             use_clause_or_attribute_specification_or_group_declaration(s?)
502             block_configuration
503             reserved_word_end
504             reserved_word_configuration(?)
505             identifier(?)
506             ';'
507              
508             use_clause_or_attribute_specification_or_group_declaration :
509             use_clause
510             | attribute_specification
511             | group_declaration
512              
513              
514             block_configuration :
515             reserved_word_for
516             architecture_name
517             use_clause_or_for_use_clause(s?)
518             reserved_word_end
519             reserved_word_for
520             ';'
521              
522             use_clause_or_for_use_clause :
523             use_clause
524             | for_use_clause
525              
526             for_use_clause :
527             reserved_word_for
528             identifier
529             ':'
530             identifier
531             use_clause(?)
532             reserved_word_end
533             reserved_word_for
534             ';'
535              
536             package_declaration :
537             reserved_word_package
538             identifier
539             reserved_word_is
540             package_declarative_item(s?)
541             reserved_word_end
542             reserved_word_package(?)
543             identifier(?)
544             ';'
545             |
546              
547             package_declarative_item :
548             subprogram_declaration
549             | type_declaration
550             | subtype_declaration
551             | constant_declaration
552             | signal_declaration
553             | shared_variable_declaration
554             | file_declaration
555             | alias_declaration
556             | component_declaration
557             | attribute_declaration
558             | attribute_specification
559             | disconnection_specification
560             | use_clause
561             | group_template_declaration
562             | group_declaration
563              
564             package_body :
565             reserved_word_package
566             reserved_word_body
567             identifier
568             reserved_word_is
569             package_body_declarative_item(s?)
570             reserved_word_end
571             reserved_word_package_and_body(?)
572             identifier(?)
573             ';'
574             |
575              
576             reserved_word_package_and_body :
577             reserved_word_package
578             reserved_word_body
579              
580             package_body_declarative_item :
581             subprogram_body
582             | subprogram_declaration
583             | type_declaration
584             | subtype_declaration
585             | constant_declaration
586             | shared_variable_declaration
587             | file_declaration
588             | alias_declaration
589             | use_clause
590             | group_template_declaration
591             | group_declaration
592              
593             ####################################################
594             ####################################################
595              
596             subprogram_declaration :
597             subprogram_specification
598             ';'
599              
600             subprogram_specification :
601             procedure_specification | function_specification
602              
603             procedure_specification :
604             reserved_word_procedure
605             identifier_or_operator_symbol
606             parameter_interface_list(?)
607              
608             identifier_or_operator_symbol :
609             identifier | operator_symbol
610              
611             function_specification :
612             pure_or_impure(?)
613             reserved_word_function
614             identifier_or_operator_symbol
615             parameter_interface_list(?)
616             reserved_word_return
617             type_mark
618             |
619              
620             ####
621             # parameter interface list
622             # used to declare io for functions or procedure declarations
623             ####
624             parameter_interface_list :
625             '(' interface_list ')'
626             |
627              
628              
629             pure_or_impure :
630             reserved_word_pure | reserved_word_impure
631              
632             subprogram_body :
633             subprogram_specification
634             reserved_word_is
635             subprogram_declarative_part(?)
636             reserved_word_begin
637             sequential_statement(s?)
638             reserved_word_end
639             reserved_word_function_or_procedure(?)
640             identifier_or_operator_symbol(?)
641             ';'
642             |
643              
644             reserved_word_function_or_procedure :
645             reserved_word_function | reserved_word_procedure
646              
647             subprogram_declarative_part :
648             subprogram_declaration
649             | subprogram_body
650             | type_declaration
651             | subtype_declaration
652             | file_declaration
653             | alias_declaration
654             | attribute_declaration
655             | attribute_specification
656             | use_clause
657             | group_template_declaration
658             | group_declaration
659              
660             type_declaration :
661             reserved_word_type
662             identifier
663             is_type_definition(?)
664             ';'
665              
666             is_type_definition :
667             reserved_word_is
668             type_definition
669              
670             type_definition :
671             enumeration_type_definition
672             | integer_type_definition
673             | floating_type_definition
674             | physical_type_definition
675             | array_type_definition
676             | record_type_definition
677             | access_type_definition
678             | file_type_definition
679              
680             constant_declaration :
681             reserved_word_constant
682             identifier_comma_identifier
683             ':'
684             subtype_indication
685             default_value(?)
686             ';'
687              
688             signal_declaration :
689             reserved_word_signal
690             identifier_comma_identifier
691             ':'
692             subtype_indication
693             reserved_word_register_or_bus(?)
694             default_value(?)
695             ';'
696              
697             reserved_word_register_or_bus :
698             reserved_word_register | reserved_word_bus
699              
700             shared_variable_declaration :
701             reserved_word_shared
702             variable_declaration
703              
704             variable_declaration :
705             reserved_word_variable
706             identifier_comma_identifier
707             ':'
708             subtype_indication
709             default_value(?)
710             ';'
711              
712             file_declaration :
713             reserved_word_file
714             identifier_comma_identifier
715             ':'
716             subtype_indication
717             open_file_expression_is_string_expression_option(?)
718             ';'
719            
720              
721             open_file_expression_is_string_expression_option :
722             open_file_expression_option(?)
723             reserved_word_is
724             string_expression
725              
726             open_file_expression_option :
727             reserved_word_open
728             file_open_kind_expression
729              
730             alias_declaration :
731             reserved_word_alias
732             identifier_or_character_literal_or_operator_symbol
733             colon_subtype_indication(?)
734             reserved_word_is
735             name
736             signature(?)
737             ';'
738              
739             identifier_or_character_literal_or_operator_symbol :
740             identifier | character_literal | operator_symbol
741              
742             colon_subtype_indication :
743             ':'
744             subtype_indication
745              
746             component_declaration :
747             reserved_word_component
748             component_name
749             reserved_word_is(?)
750             generic_declaration_section(?)
751             port_declaration_section(?)
752             reserved_word_end
753             reserved_word_component
754             component_name(?)
755             ';'
756             |
757              
758             attribute_declaration :
759             reserved_word_attribute
760             identifier
761             ':'
762             type_mark
763             ';'
764              
765             attribute_specification :
766             reserved_word_attribute
767             identifier
768             reserved_word_of
769             entity_name_list
770             ':'
771             entity_class
772             reserved_word_is
773             expression_rule
774             ';'
775              
776             entity_name_list :
777             ( reserved_word_others
778             | reserved_word_all
779             | id_char_op_comma_id_char_op )
780              
781             id_char_op_comma_id_char_op :
782             id_or_char_or_op_with_optional_signature
783             comma_id_or_char_or_op_with_optional_signature(s?)
784              
785             comma_id_or_char_or_op_with_optional_signature :
786             ','
787             id_or_char_or_op_with_optional_signature
788              
789             id_or_char_or_op_with_optional_signature :
790             identifier_or_character_literal_or_operator_symbol
791             signature(?)
792              
793             entity_class :
794             (
795             reserved_word_entity
796             | reserved_word_architecture
797             | reserved_word_configuration
798             | reserved_word_procedure
799             | reserved_word_function
800             | reserved_word_package
801             | reserved_word_type
802             | reserved_word_subtype
803             | reserved_word_constant
804             | reserved_word_signal
805             | reserved_word_variable
806             | reserved_word_component
807             | reserved_word_label
808             | reserved_word_literal
809             | reserved_word_units
810             | reserved_word_group
811             | reserved_word_file
812             )
813              
814             configuration_specification :
815             reserved_word_for
816             component_specification
817             binding_indication
818             ';'
819              
820             component_specification :
821             reserved_word_others_all_or_one_or_more_instantiation_labels
822             ':'
823             component_name
824              
825             reserved_word_others_all_or_one_or_more_instantiation_labels :
826             reserved_word_others
827             | reserved_word_all
828             | instantiation_label_comma_instantiation_label
829              
830             instantiation_label_comma_instantiation_label :
831             instantiation_label
832             comma_instantiation_label(s?)
833              
834             comma_instantiation_label :
835             ','
836             instantiation_label
837              
838             binding_indication :
839             use_entity_or_configuration_or_open(?)
840             generic_map_section(?)
841             port_map_section(?)
842             ';'
843              
844             use_entity_or_configuration_or_open :
845             reserved_word_use
846             (
847             reserved_word_entity_and_entity_name_arch_name_in_parens |
848             reserved_word_configuration_and_configuration_name |
849             reserved_word_open
850             )
851              
852             disconnection_specification :
853             reserved_word_disconnect
854             (
855             reserved_word_others
856             | reserved_word_all
857             | signal_name_comma_signal_name
858             )
859             ':'
860             type_mark
861             reserved_word_after
862             time_expression
863             ';'
864              
865             group_template_declaration :
866             reserved_word_group
867             identifier
868             reserved_word_is
869             list_of_entity_class_with_optional_box_in_parens
870             ';'
871              
872             list_of_entity_class_with_optional_box_in_parens :
873             '(' entity_class_box_comma_entity_class_box ')'
874              
875             entity_class_box_comma_entity_class_box :
876             entity_class_with_optional_box_operator
877             comma_entity_class_with_optional_box_operator(s?)
878              
879             comma_entity_class_with_optional_box_operator :
880             ','
881             entity_class_with_optional_box_operator
882              
883             entity_class_with_optional_box_operator :
884             entity_class
885             box_operator(?)
886              
887             box_operator :
888             '<>'
889              
890             group_declaration :
891             reserved_word_group
892             identifier
893             ':'
894             group_template_name
895             '(' name_char_literal_comma_name_char_literal ')'
896             ';'
897              
898             name_char_literal_comma_name_char_literal :
899             name_or_char_literal
900             comma_name_char_literal(s?)
901              
902             comma_name_char_literal :
903             ','
904             name_or_char_literal
905              
906             name_or_char_literal :
907             ( name | character_literal )
908              
909             use_clause :
910             reserved_word_use
911             selected_name_comma_selected_name
912             ';'
913              
914             selected_name_comma_selected_name :
915             selected_name
916             comma_selected_name(s?)
917              
918             comma_selected_name :
919             ','
920             selected_name
921              
922             ####################################################
923             ####################################################
924             enumeration_type_definition :
925             '(' id_or_char_comma_id_or_char ')'
926              
927             id_or_char_comma_id_or_char :
928             identifier_or_character_literal
929             comma_id_or_char(s?)
930              
931             comma_id_or_char :
932             ','
933             identifier_or_character_literal
934              
935             identifier_or_character_literal :
936             identifier | character_literal
937              
938             simple_expression_to_downto_simple_expression :
939             simple_expression
940             reserved_word_to_or_downto
941             simple_expression
942              
943             reserved_word_to_or_downto :
944             reserved_word_to | reserved_word_downto
945              
946             range_attribute_name_or_simple_expression_to_downto_simple_expression :
947             range_attribute_name |
948             simple_expression_to_downto_simple_expression
949              
950             integer_type_definition :
951             reserved_word_range
952             range_attribute_name_or_simple_expression_to_downto_simple_expression
953            
954             floating_type_definition :
955             reserved_word_range
956             range_attribute_name_or_simple_expression_to_downto_simple_expression
957              
958             physical_type_definition :
959             reserved_word_range
960             range_attribute_name_or_simple_expression_to_downto_simple_expression
961             reserved_word_units
962             identifier
963             ';'
964             identifier_is_physical_literal(?)
965             reserved_word_end
966             reserved_word_units
967             identifier(?)
968              
969             identifier_is_physical_literal :
970             identifier '=' physical_literal
971              
972             array_type_definition :
973             reserved_word_array
974             '(' array_type_mark_definition_or_array_discrete_range_definition ')'
975             reserved_word_of
976             element_subtype_indication
977              
978             array_type_mark_definition_or_array_discrete_range_definition :
979             type_mark_range_box_comma_type_mark_range_box
980             | array_discrete_range_definition
981              
982             type_mark_range_box_comma_type_mark_range_box :
983             type_mark_range_box
984             comma_type_mark_range_box(s?)
985              
986             comma_type_mark_range_box :
987             ','
988             type_mark_range_box
989              
990             type_mark_range_box :
991             type_mark reserved_word_range box_operator
992              
993             array_discrete_range_definition :
994             discrete_range_comma_discrete_range
995              
996             discrete_range_comma_discrete_range :
997             discrete_range
998             comma_discrete_range(s?)
999              
1000             comma_discrete_range :
1001             ','
1002             discrete_range
1003              
1004             record_type_definition :
1005             reserved_word_record
1006             record_element_definition(s)
1007             reserved_word_end reserved_word_record identifier(?)
1008              
1009             record_element_definition :
1010             identifier_comma_identifier
1011             ':'
1012             subtype_indication
1013             ';'
1014              
1015             access_type_definition :
1016             reserved_word_access
1017             subtype_indication
1018              
1019             file_type_definition :
1020             reserved_word_file
1021             reserved_word_of
1022             type_mark
1023              
1024             subtype_declaration :
1025             reserved_word_subtype
1026             identifier
1027             reserved_word_is
1028             subtype_indication
1029             ';'
1030              
1031             subtype_indication :
1032             # resolution_function_name
1033             type_mark
1034             range_or_simple_or_discrete(?)
1035             |
1036              
1037             range_or_simple_or_discrete :
1038             reserved_word_range_range_attribute_name_or_simple_downto_expression
1039             | discrete_range_in_parens
1040              
1041             discrete_range_in_parens :
1042             '(' discrete_range ')'
1043              
1044             reserved_word_range_range_attribute_name_or_simple_downto_expression :
1045             reserved_word_range
1046             range_attribute_name_or_simple_expression_to_downto_simple_expression
1047            
1048             discrete_range :
1049             range_attribute_name
1050             | simple_expression_to_downto_simple_expression
1051             | discrete_subtype_indication
1052              
1053             discrete_subtype_indication :
1054             subtype_indication
1055              
1056             type_mark :
1057             type_name
1058              
1059             ####################################################
1060             ####################################################
1061             concurrent_statement :
1062             component_instantiation_statement
1063             | block_statement
1064             | process_statement
1065             | concurrent_procedure_call_statement
1066             | concurrent_assertion_statement
1067             | concurrent_signal_assignment_statement
1068             | generate_statement
1069              
1070             block_statement :
1071             block_label
1072             ':'
1073             reserved_word_block
1074             guard_expression_in_parens(?)
1075             reserved_word_is(?)
1076             generic_declaration_section(?)
1077             generic_map_section(?)
1078             port_declaration_section(?)
1079             port_map_section(?)
1080             block_declarative_item(s?)
1081             reserved_word_begin
1082             concurrent_statement(s?)
1083             reserved_word_end
1084             reserved_word_block
1085             block_label(?)
1086             ';'
1087              
1088             guard_expression_in_parens :
1089             '(' guard_expression ')'
1090              
1091             block_declarative_item :
1092             subprogram_declaration
1093             | subprogram_body
1094             | type_declaration
1095             | subtype_declaration
1096             | constant_declaration
1097             | signal_declaration
1098             | shared_variable_declaration
1099             | file_declaration
1100             | alias_declaration
1101             | component_declaration
1102             | attribute_declaration
1103             | attribute_specification
1104             | configuration_specification
1105             | disconnection_specification
1106             | use_clause
1107             | group_template_declaration
1108             | group_declaration
1109              
1110             process_statement :
1111             label_followed_by_colon(?)
1112             reserved_word_postponed(?)
1113             reserved_word_process
1114             sensitivity_list(?)
1115             reserved_word_is(?)
1116             process_declarative_item(s?)
1117             reserved_word_begin
1118             sequential_statement(s?)
1119             reserved_word_end
1120             reserved_word_postponed(?)
1121             reserved_word_process
1122             process_label(?)
1123             ';'
1124             |
1125              
1126             label_followed_by_colon :
1127             label ':'
1128              
1129             sensitivity_list :
1130             '(' signal_name_comma_signal_name ')'
1131              
1132             process_declarative_item :
1133             subprogram_declaration
1134             | subprogram_body
1135             | type_declaration
1136             | subtype_declaration
1137             | constant_declaration
1138             | variable_declaration
1139             | file_declaration
1140             | alias_declaration
1141             | attribute_declaration
1142             | attribute_specification
1143             | use_clause
1144             | group_template_declaration
1145             | group_declaration
1146              
1147             concurrent_procedure_call_statement :
1148             label_followed_by_colon(?)
1149             reserved_word_postponed(?)
1150             procedure_name
1151             subprogram_parameter_section(?)
1152             ';'
1153              
1154             concurrent_assertion_statement :
1155             label_followed_by_colon(?)
1156             reserved_word_postponed(?)
1157             reserved_word_assert
1158             boolean_expression
1159             reserved_word_report_and_expression_rule(?)
1160             reserved_word_severity_and_expression_rule(?)
1161             ';'
1162              
1163             reserved_word_report_and_expression_rule :
1164             reserved_word_report
1165             expression_rule
1166              
1167             reserved_word_severity_and_expression_rule :
1168             reserved_word_severity
1169             expression_rule
1170              
1171             concurrent_signal_assignment_statement :
1172             label_followed_by_colon(?)
1173             reserved_word_postponed(?)
1174             selected_or_conditional_signal_assignment
1175              
1176             selected_or_conditional_signal_assignment :
1177             selected_signal_assignment | conditional_signal_assignment
1178              
1179             selected_signal_assignment :
1180             reserved_word_with
1181             expression_rule
1182             reserved_word_select
1183             name_or_aggregate
1184             '<='
1185             reserved_word_guarded(?)
1186             delay_mechanism(?)
1187             waveform_when_choices_comma_waveform_when_choices
1188             ';'
1189              
1190             waveform_when_choices_comma_waveform_when_choices :
1191             waveform_when_choices
1192             comma_waveform_when_choices(s?)
1193              
1194             comma_waveform_when_choices :
1195             ','
1196             waveform_when_choices
1197              
1198             waveform_when_choices :
1199             waveform_rule reserved_word_when choices_pipe_choices
1200              
1201             conditional_signal_assignment :
1202             name_or_aggregate
1203             '<='
1204             reserved_word_guarded(?)
1205             delay_mechanism(?)
1206             waveform_rule
1207             when_boolean_expression_else_waveform_rule(s?)
1208             ';'
1209              
1210             name_or_aggregate :
1211             name | aggregate
1212              
1213             when_boolean_expression_else_waveform_rule :
1214             reserved_word_when
1215             boolean_expression
1216             reserved_word_else
1217             waveform_rule
1218              
1219             component_instantiation_statement :
1220             instantiation_label
1221             ':'
1222             entity_configuration_component
1223             generic_map_section(?)
1224             port_map_section(?)
1225             ';'
1226             |
1227              
1228            
1229             entity_configuration_component :
1230             reserved_word_entity_and_entity_name_arch_name_in_parens |
1231             reserved_word_configuration_and_configuration_name |
1232             reserved_word_component_and_component_name
1233              
1234              
1235              
1236             reserved_word_entity_and_entity_name_arch_name_in_parens :
1237             reserved_word_entity
1238             entity_name
1239             architecture_identifier_in_parens(?)
1240              
1241             reserved_word_configuration_and_configuration_name :
1242             reserved_word_configuration
1243             configuration_name
1244              
1245             reserved_word_component_and_component_name :
1246             reserved_word_component(?)
1247             component_name
1248              
1249             architecture_identifier_in_parens :
1250             '(' architecture_identifier ')'
1251              
1252             generate_statement :
1253             generate_label ':'
1254             for_identifier_in_range_or_if_boolean_expression
1255             reserved_word_generate
1256             generate_block_declarative_item_and_begin(?)
1257             concurrent_statement(s?)
1258             reserved_word_end
1259             reserved_word_generate
1260             generate_label(?)
1261             ';'
1262              
1263             for_identifier_in_range_or_if_boolean_expression :
1264             for_identifier_in_range | if_boolean_expression
1265              
1266             for_identifier_in_range :
1267             reserved_word_for
1268             identifier
1269             reserved_word_in
1270             discrete_range
1271              
1272             if_boolean_expression :
1273             reserved_word_if
1274             boolean_expression
1275              
1276             generate_block_declarative_item_and_begin :
1277             block_declarative_item(s?)
1278             reserved_word_begin
1279              
1280             ####################################################
1281             ####################################################
1282             sequential_statement :
1283             wait_statement
1284             | assertion_statement
1285             | report_statement
1286             | signal_assignment_statement
1287             | variable_assignment_statement
1288             | procedure_call_statement
1289             | if_statement
1290             | case_statement
1291             | loop_statement
1292             | next_statement
1293             | exit_statement
1294             | return_statement
1295             | null_statement
1296             |
1297              
1298             wait_statement :
1299             label_followed_by_colon(?)
1300             reserved_word_wait
1301             on_list_of_signal(?)
1302             reserved_word_until_and_boolean_expression(?)
1303             reserved_word_for_and_time_expression(?)
1304             ';'
1305              
1306             reserved_word_until_and_boolean_expression :
1307             reserved_word_until
1308             boolean_expression
1309              
1310             reserved_word_for_and_time_expression :
1311             reserved_word_for
1312             time_expression
1313              
1314             on_list_of_signal :
1315             reserved_word_on
1316             signal_name_comma_signal_name
1317              
1318             assertion_statement :
1319             label_followed_by_colon(?)
1320             reserved_word_assert boolean_expression
1321             reserved_word_report_and_expression_rule(?)
1322             reserved_word_severity_and_expression_rule(?)
1323             ';'
1324              
1325             reserved_word_report_and_expression_rule :
1326             reserved_word_report
1327             expression_rule
1328              
1329             reserved_word_severity_and_expression_rule :
1330             reserved_word_severity
1331             expression_rule
1332              
1333             report_statement :
1334             label_followed_by_colon(?)
1335             reserved_word_report_and_expression_rule
1336             reserved_word_severity_and_expression_rule(?)
1337             ';'
1338              
1339             signal_assignment_statement :
1340             label_followed_by_colon(?)
1341             name_or_aggregate
1342             '<='
1343             delay_mechanism(?)
1344             waveform_rule
1345             ';'
1346              
1347             delay_mechanism :
1348             reserved_word_transport | inertial_with_optional_reject_time
1349              
1350             inertial_with_optional_reject_time :
1351             reserved_word_reject_and_time_expression(?)
1352             reserved_word_inertial
1353              
1354             reserved_word_reject_and_time_expression :
1355             reserved_word_reject
1356             time_expression
1357              
1358             waveform_rule :
1359             reserved_word_unaffected
1360             | waveform_item_comma_waveform_item
1361              
1362             waveform_item_comma_waveform_item :
1363             waveform_item
1364             comma_waveform_item(s?)
1365              
1366             comma_waveform_item :
1367             ','
1368             waveform_item
1369              
1370             waveform_item :
1371             null_with_optional_after_time_expression
1372             | value_expression_with_optional_time_expression
1373              
1374             null_with_optional_after_time_expression :
1375             reserved_word_null
1376             reserved_word_after_and_time_expression(?)
1377              
1378             value_expression_with_optional_time_expression :
1379             value_expression
1380             reserved_word_after_and_time_expression(?)
1381              
1382             reserved_word_after_and_time_expression :
1383             reserved_word_after
1384             time_expression
1385              
1386             variable_assignment_statement :
1387             label_followed_by_colon(?)
1388             name_or_aggregate
1389             ':='
1390             expression_rule
1391             ';'
1392              
1393             procedure_call_statement :
1394             label_followed_by_colon(?)
1395             procedure_name
1396             subprogram_parameter_section(?)
1397             ';'
1398             |
1399              
1400             if_statement :
1401             label_followed_by_colon(?)
1402             reserved_word_if
1403             boolean_expression
1404             reserved_word_then
1405             sequential_statement(s)
1406             optional_elsif_section(s?)
1407             optional_else_section(?)
1408             reserved_word_end
1409             reserved_word_if
1410             if_label(?)
1411             ';'
1412             |
1413              
1414             optional_elsif_section :
1415             reserved_word_elsif
1416             boolean_expression
1417             reserved_word_then
1418             sequential_statement(s)
1419              
1420             optional_else_section :
1421             reserved_word_else
1422             sequential_statement(s)
1423              
1424             case_statement :
1425             label_followed_by_colon(?)
1426             reserved_word_case expression_rule reserved_word_is
1427             when_choices_sequential_statement(s)
1428             reserved_word_end reserved_word_case case_label(?) ';'
1429              
1430             when_choices_sequential_statement :
1431             reserved_word_when
1432             choices_pipe_choices
1433             '=>'
1434             sequential_statement(s)
1435              
1436             loop_statement :
1437             label_followed_by_colon(?)
1438             while_boolean_or_for_identifier_in_discrete_range
1439             reserved_word_loop
1440             sequential_statement(s)
1441             reserved_word_end reserved_word_loop loop_label(?) ';'
1442              
1443             while_boolean_or_for_identifier_in_discrete_range :
1444             reserved_word_while_and_boolean_expression
1445             | reserved_word_for_identifier_in_discrete_range
1446              
1447             reserved_word_while_and_boolean_expression :
1448             reserved_word_while
1449             boolean_expression
1450              
1451             reserved_word_for_identifier_in_discrete_range :
1452             reserved_word_for
1453             identifier
1454             reserved_word_in
1455             discrete_range
1456              
1457             next_statement :
1458             label_followed_by_colon(?)
1459             reserved_word_next
1460             loop_label(?)
1461             reserved_word_when_and_boolean_expression(?)
1462             ';'
1463              
1464             exit_statement :
1465             label_followed_by_colon(?)
1466             reserved_word_exit
1467             loop_label(?)
1468             reserved_word_when_and_boolean_expression(?)
1469             ';'
1470              
1471             reserved_word_when_and_boolean_expression :
1472             reserved_word_when
1473             boolean_expression
1474              
1475             return_statement :
1476             label_followed_by_colon(?)
1477             reserved_word_return
1478             expression_rule(?)
1479             ';'
1480              
1481             null_statement :
1482             label_followed_by_colon(?)
1483             reserved_word_null
1484             ';'
1485              
1486              
1487             ####################################################
1488             # E.7 Interfaces and Associations
1489             ####################################################
1490             interface_list :
1491             interface_item_semicolon_interface_item
1492              
1493             interface_item_semicolon_interface_item :
1494             interface_item
1495             semicolon_interface_item(s?)
1496              
1497             semicolon_interface_item :
1498             ';'
1499             interface_item
1500              
1501             interface_item :
1502             constant_interface
1503             | signal_interface
1504             | variable_interface
1505             | file_interface
1506              
1507              
1508             constant_interface :
1509             reserved_word_constant(?)
1510             identifier_comma_identifier
1511             ':'
1512             reserved_word_in(?)
1513             subtype_indication
1514             default_value(?)
1515             |
1516              
1517              
1518             signal_interface :
1519             reserved_word_signal(?)
1520             identifier_comma_identifier
1521             ':'
1522             mode(?)
1523             subtype_indication
1524             reserved_word_bus(?)
1525             default_value(?)
1526             |
1527              
1528             variable_interface :
1529             reserved_word_variable(?)
1530             identifier_comma_identifier
1531             ':'
1532             mode(?)
1533             subtype_indication
1534             default_value(?)
1535             |
1536              
1537             file_interface :
1538             reserved_word_file
1539             identifier_comma_identifier
1540             ':'
1541             subtype_indication
1542             |
1543              
1544             mode :
1545             reserved_word_inout
1546             | reserved_word_out
1547             | reserved_word_in
1548             | reserved_word_buffer
1549             | reserved_word_linkage
1550              
1551             association_list :
1552             actual_formal_comma_actual_formal
1553             |
1554              
1555             actual_formal_comma_actual_formal :
1556             actual_part_with_optional_formal_part
1557             comma_actual_part_with_optional_formal_part(s?)
1558             |
1559              
1560             comma_actual_part_with_optional_formal_part :
1561             ','
1562             actual_part_with_optional_formal_part
1563             |
1564              
1565             actual_part_with_optional_formal_part :
1566             formal_part_and_arrow(?)
1567             actual_part
1568             |
1569              
1570             formal_part_and_arrow :
1571             formal_part '=>'
1572             |
1573              
1574             formal_part :
1575             generic_name
1576             | port_name
1577             | parameter_name
1578             | function_name generic_port_parameter_selection
1579             | type_mark generic_port_parameter_selection
1580             |
1581              
1582             generic_port_parameter_selection :
1583             '(' generic_name_port_name_parameter_name ')'
1584             |
1585              
1586             generic_name_port_name_parameter_name :
1587             generic_name | port_name | parameter_name
1588             |
1589              
1590             actual_part :
1591             expression_rule
1592             | variable_name
1593             | reserved_word_open
1594             | function_name_signal_name_or_variable_name_selection
1595             | type_mark_signal_name_or_variable_name_selection
1596             |
1597              
1598              
1599             function_name_signal_name_or_variable_name_selection :
1600             function_name
1601             signal_name_or_variable_name_in_parens
1602              
1603             type_mark_signal_name_or_variable_name_selection :
1604             type_mark
1605             signal_name_or_variable_name_in_parens
1606              
1607             signal_name_or_variable_name_in_parens :
1608             '(' signal_name_or_variable_name ')'
1609              
1610             signal_name_or_variable_name :
1611             signal_name | variable_name
1612              
1613             ####################################################
1614             # E.8 Expressions
1615             ####################################################
1616             boolean_expression :
1617             expression_rule
1618              
1619             static_expression :
1620             expression_rule
1621              
1622              
1623             expression_rule :
1624             relation
1625             logic_relation(s?)
1626              
1627             logic_relation :
1628             logic_relation_operator
1629             relation
1630              
1631             logic_relation_operator :
1632             reserved_word_nand
1633             | reserved_word_xnor
1634             | reserved_word_and
1635             | reserved_word_nor
1636             | reserved_word_xor
1637             | reserved_word_or
1638              
1639             relation :
1640             shift_expression
1641             relation_shift_expression(?)
1642              
1643             relation_shift_expression :
1644             relation_operator
1645             shift_expression
1646              
1647             relation_operator :
1648             '/='
1649             | '<='
1650             | '>='
1651             | '='
1652             | '>'
1653             | '<'
1654              
1655             shift_expression :
1656             simple_expression
1657             shift_simple_expression(?)
1658              
1659             shift_simple_expression :
1660             shift_operator
1661             simple_expression
1662              
1663             shift_operator :
1664             reserved_word_sll
1665             | reserved_word_srl
1666             | reserved_word_sla
1667             | reserved_word_sra
1668             | reserved_word_rol
1669             | reserved_word_ror
1670              
1671              
1672             simple_expression :
1673             sign(?) term optional_term(s?)
1674              
1675             sign :
1676             '+' | '-'
1677              
1678             optional_term :
1679             add_or_concat_operator term
1680              
1681             add_or_concat_operator :
1682             '+'
1683             | '-'
1684             | '&'
1685              
1686             term :
1687             factor
1688             optional_factor(s?)
1689              
1690             optional_factor :
1691             multiply_operator factor
1692              
1693             multiply_operator :
1694             '*'
1695             | '/'
1696             | reserved_word_mod
1697             | reserved_word_rem
1698              
1699             factor :
1700             reserved_word_abs_and_primary
1701             | reserved_word_not_and_primary
1702             | primary_exp_primary
1703              
1704             reserved_word_abs_and_primary :
1705             reserved_word_abs primary
1706              
1707             reserved_word_not_and_primary :
1708             reserved_word_not primary
1709              
1710             primary_exp_primary :
1711             primary exponent_primary(?)
1712              
1713             exponent_primary :
1714             '**' primary
1715              
1716              
1717             # notes:
1718             #
1719             # the rules for "primary" is not mutually exclusive:
1720             # there are rules that apply such that a given input text
1721             # could be one of two different possible interpretations.
1722             #
1723             # there is no way to distinguish between the two possibilities
1724             # by simply looking at the token being examined.
1725             #
1726             # 1)
1727             #
1728             # aggregate : '(' optional_choice_arrow(?) expression_rule [ ',' repeat ] ')'
1729             # expression in paren : '(' expression_rule ')'
1730             #
1731             # therefore an aggregate with one entry and no choice arrow is
1732             # indistinguishable from an expression in paren.
1733             #
1734             #
1735             # 2)
1736             #
1737             # function_call # token ( param=>(?) value [,repeat])(?)
1738             # literal->identifier # token
1739             #
1740             # therefore a function call with no input parameters is
1741             # indistinguishable from a literal identifier.
1742              
1743              
1744             primary :
1745             new_qualified_expression # 'new' token ' ( yada )
1746             | new_subtype_indication # 'new' token
1747             | qualified_expression # token ' ( yada )
1748             | function_call # token ( param=>(?) value [,repeat])(?)
1749             | literal
1750             | aggregate # '(' choice=>(?) expression [,repeat] ')'
1751             | expression_rule_in_parens
1752             | name
1753              
1754             new_qualified_expression :
1755             reserved_word_new
1756             qualified_expression
1757              
1758             new_subtype_indication :
1759             reserved_word_new
1760             subtype_indication
1761              
1762             qualified_expression :
1763             type_mark_tick_aggregate
1764             | type_mark_tick_expression
1765              
1766             type_mark_tick_expression :
1767             type_mark "'" '(' expression_rule ')'
1768              
1769             type_mark_tick_aggregate :
1770             type_mark "'" aggregate
1771              
1772             #
1773             # temporary patch, don't allow function calls without a parameter list
1774             # in parenthesis. this will prevent identifiers from being mistaken
1775             # for function calls with no parameters.
1776             #
1777             # this means that functions with no parameters will be mistaken
1778             # for identifiers. at least until this is fixed somehow.
1779             #
1780             function_call :
1781             function_name
1782             subprogram_parameter_section #(?)
1783              
1784             expression_rule_in_parens :
1785             '(' expression_rule ')'
1786              
1787             # left recursion here.
1788             # name = ( name | functionname) ... | (name | functioncall)
1789             # need to clean up "name" rule declaration
1790             name :
1791             attribute_name
1792             | operator_symbol
1793             | selected_name
1794             | identifier_paren_one_or_expression_rule_comma_expression_rule
1795             | identifier_paren_discrete_range
1796             | identifier
1797              
1798             identifier_paren_one_or_expression_rule_comma_expression_rule :
1799             identifier '(' expression_rule_comma_expression_rule ')'
1800              
1801             expression_rule_comma_expression_rule :
1802             expression_rule
1803             comma_expression_rule(s?)
1804              
1805             comma_expression_rule :
1806             ','
1807             expression_rule
1808              
1809             identifier_paren_discrete_range :
1810             identifier '(' discrete_range ')'
1811              
1812             selected_name :
1813             identifier '.'
1814             ( identifier '.' )(?)
1815             reserved_word_all_or_identifier_or_character_literal_or_operator_symbol
1816              
1817             reserved_word_all_or_identifier_or_character_literal_or_operator_symbol :
1818             reserved_word_all | identifier_or_character_literal_or_operator_symbol
1819              
1820             operator_symbol :
1821             '"' graphic_character '"'
1822              
1823             attribute_name :
1824             identifier "'" identifier
1825              
1826             signature :
1827             '['
1828             type_mark_comma_type_mark(?)
1829             reserved_word_return_and_type_mark(?)
1830             ']'
1831              
1832             type_mark_comma_type_mark :
1833             type_mark
1834             comma_type_mark(s?)
1835              
1836             comma_type_mark :
1837             ','
1838             type_mark
1839              
1840             reserved_word_return_and_type_mark :
1841             reserved_word_return
1842             type_mark
1843              
1844             literal :
1845             reserved_word_null
1846             | character_literal
1847             | string_literal
1848             | bit_string_literal
1849             | based_literal_unit_name
1850             | decimal_literal_unit_name
1851              
1852             character_literal :
1853             "'" graphic_character "'"
1854              
1855             string_literal :
1856             '"' graphic_character(s) '"'
1857              
1858             bit_string_literal :
1859             b_or_o_or_x '"' based_integer '"'
1860              
1861             b_or_o_or_x :
1862             'B' | 'O' | 'X'
1863              
1864             decimal_literal_unit_name :
1865             integer
1866             optional_fractional_part(?)
1867             optional_sci_notation(?)
1868             unit_name(?)
1869              
1870             based_literal_unit_name :
1871             integer
1872             '#'
1873             based_integer optional_based_fraction_part(?)
1874             '#'
1875             optional_based_sci_notation(?)
1876             unit_name(?)
1877              
1878              
1879             optional_fractional_part :
1880             '.' integer
1881              
1882             optional_sci_notation :
1883             'E' sign(?) integer
1884              
1885             optional_based_fraction_part :
1886             '.' based_integer
1887              
1888             optional_based_sci_notation :
1889             'E' sign(?) integer
1890              
1891             integer :
1892             /\d+/
1893              
1894             based_integer :
1895             /[A-Za-z0-9][A-Za-z0-9_]/
1896              
1897              
1898             aggregate :
1899             '(' choice_expression_comma_choice_expression ')'
1900              
1901             choice_expression_comma_choice_expression :
1902             optional_choice_arrow_with_expression
1903             comma_optional_choice_arrow_with_expression(s?)
1904              
1905             comma_optional_choice_arrow_with_expression :
1906             ','
1907             optional_choice_arrow_with_expression
1908              
1909             optional_choice_arrow_with_expression :
1910             optional_choice_arrow(?)
1911             expression_rule
1912              
1913             optional_choice_arrow :
1914             choices_pipe_choices '=>'
1915              
1916             choices_pipe_choices :
1917             one_of_several_choices
1918             pipe_one_of_several_choices(s?)
1919              
1920             pipe_one_of_several_choices :
1921             '|'
1922             one_of_several_choices
1923              
1924             one_of_several_choices :
1925             reserved_word_others | simple_expression | discrete_range | identifier
1926              
1927             case_label : identifier
1928             loop_label : identifier
1929             if_label : identifier
1930             label : identifier
1931              
1932             identifier : /[A-Za-z][A-Za-z_0-9]*/
1933              
1934              
1935             ####
1936             #### this needs some polish, need to disable whitespace
1937             #### so that can accept a string literal of " " as valid
1938             ####
1939             graphic_character :
1940            
1941             /[ A-Za-z0-9\-~`!@#$%^&*()_+={};:',.<>|]/
1942             ####################################################
1943             # misc
1944             ####################################################
1945             identifier_comma_identifier :
1946             identifier
1947             comma_identifier(s?)
1948              
1949             comma_identifier :
1950             ','
1951             identifier
1952              
1953             entity_name : identifier
1954              
1955             ####
1956             # generics
1957             ####
1958             generic_declaration_section :
1959             reserved_word_generic generic_interface_list(?) ';'
1960             |
1961              
1962             generic_interface_list :
1963             '('
1964             generic_interface_list_entry_semicolon_generic_interface_list_entry
1965             ')'
1966             |
1967              
1968             generic_interface_list_entry_semicolon_generic_interface_list_entry :
1969             generic_interface_list_entry
1970             semicolon_generic_interface_list_entry(s?)
1971             |
1972              
1973             semicolon_generic_interface_list_entry :
1974             ';'
1975             generic_interface_list_entry
1976             |
1977              
1978             generic_interface_list_entry :
1979             identifier_comma_identifier ':'
1980             subtype_indication
1981             default_value(?)
1982             |
1983              
1984             default_value :
1985             ':=' static_expression
1986              
1987             generic_map_section :
1988             reserved_word_generic
1989             reserved_word_map
1990             optional_generic_association_list(?)
1991             |
1992              
1993             optional_generic_association_list :
1994             '(' generic_association_list ')'
1995             |
1996              
1997             generic_association_list :
1998             association_list
1999             |
2000              
2001              
2002             ####
2003             # ports
2004             ####
2005             port_declaration_section :
2006             reserved_word_port
2007             port_interface_list(?) ';'
2008             |
2009              
2010             port_interface_list :
2011             '('
2012             port_interface_list_entry_semicolon_port_interface_list_entry
2013             ')'
2014             |
2015              
2016             port_interface_list_entry_semicolon_port_interface_list_entry :
2017             port_interface_list_entry
2018             semicolon_port_interface_list_entry(s?)
2019             |
2020              
2021             semicolon_port_interface_list_entry :
2022             ';'
2023             port_interface_list_entry
2024             |
2025              
2026             port_interface_list_entry :
2027             port_name_comma_port_name
2028             ':'
2029             mode
2030             subtype_indication
2031             default_value(?)
2032             |
2033              
2034             port_name_comma_port_name :
2035             port_name
2036             comma_port_name(s?)
2037             |
2038              
2039             comma_port_name :
2040             ','
2041             port_name
2042              
2043             port_map_section :
2044             reserved_word_port
2045             reserved_word_map
2046             optional_port_association_list(?)
2047             |
2048              
2049             optional_port_association_list :
2050             '(' port_association_list ')'
2051             |
2052              
2053             port_association_list :
2054             association_list
2055             |
2056              
2057              
2058             ####
2059             # parameters to procedure/function call
2060             ####
2061             subprogram_parameter_section :
2062             '(' parameter_association_list ')'
2063             |
2064              
2065             parameter_association_list :
2066             association_list
2067             |
2068              
2069             ####
2070             # instance labels
2071             ####
2072              
2073             instantiation_label : identifier
2074              
2075             ####
2076             # signals
2077             ####
2078             signal_name_comma_signal_name :
2079             signal_name
2080             comma_signal_name(s?)
2081              
2082             comma_signal_name :
2083             ','
2084             signal_name
2085              
2086             signal_name : identifier
2087              
2088              
2089             digit :
2090             /[0-9]/
2091              
2092              
2093              
2094             ########################################################
2095             # oddball rules, need to confirm correctness
2096             ########################################################
2097             procedure_name : identifier
2098             function_name : identifier
2099             component_name : identifier
2100             architecture_name : identifier
2101             configuration_name : identifier
2102             architecture_identifier : identifier
2103             variable_name : identifier
2104             generic_name : identifier
2105             port_name : identifier
2106             parameter_name : identifier
2107             process_label : identifier
2108             group_template_name : identifier
2109             block_label : identifier
2110             type_name : identifier
2111             subtype_name : identifier
2112             generate_label : identifier
2113             resolution_function_name : identifier
2114             physical_literal : identifier
2115              
2116             range_attribute_name : attribute_name
2117              
2118             guard_expression : expression_rule
2119             value_expression : expression_rule
2120             string_expression : expression_rule
2121             time_expression : expression_rule
2122             file_open_kind_expression : expression_rule
2123              
2124             static_expression : identifier
2125              
2126             element_subtype_indication : subtype_indication
2127              
2128             time_units :
2129             'fs' | 'ps' | 'ns' | 'us' | 'ms' | 'sec' | 'min' | 'hr'
2130              
2131              
2132             # given:
2133             # (1 downto 0)
2134             #
2135             # the '1 downto' gets confused as a decimal_literal_unit_name
2136             # where 'downto' is the unit_name.
2137             #
2138             # unit_name is generally just an identifier, but to keep
2139             # 'to' or 'downto' or similar confusions,
2140             # unit_name will need to know the valid units available.
2141             #
2142             unit_name : time_units
2143              
2144             #END_OF_GRAMMAR
2145              
2146             }; # end of return statement
2147              
2148              
2149             } #end of sub grammar
2150              
2151             #########################################################################
2152             sub decomment_given_text
2153             #########################################################################
2154             {
2155             my ($obj,$text)=@_;
2156              
2157             my $filtered_text='';
2158              
2159             my $state = 'code';
2160              
2161             my ( $string_prior_to_comment, $string_after_comment);
2162             my ( $string_prior_to_quote, $string_after_quote);
2163             my ( $comment_string, $string_after_comment_string);
2164             my ( $quoted_string, $string_after_quoted_string);
2165              
2166             my $index_to_comment=0;
2167             my $index_to_quote =0;
2168              
2169             while (1)
2170             {
2171             if ($state eq 'code')
2172             {
2173              
2174             unless ( ($text =~ /--/) or ($text =~ /\"/) )
2175             {
2176             $filtered_text .= $text ;
2177             last;
2178             }
2179              
2180              
2181             # look for comment or quoted string
2182             ( $string_prior_to_comment, $string_after_comment)
2183             = split( /--/ , $text, 2 );
2184              
2185             ( $string_prior_to_quote, $string_after_quote)
2186             = split( /\"/ , $text, 2 );
2187              
2188             $index_to_comment = length($string_prior_to_comment);
2189             $index_to_quote = length($string_prior_to_quote );
2190              
2191              
2192             if($index_to_quote < $index_to_comment)
2193             {
2194             $state = 'quote';
2195             $filtered_text .= $string_prior_to_quote;
2196             $text = $string_after_quote;
2197             $filtered_text .= '"' ;
2198             }
2199             else
2200             {
2201             $state = 'comment';
2202             $filtered_text .= $string_prior_to_comment;
2203             $text = '--' . $string_after_comment;
2204             }
2205             }
2206              
2207             elsif ($state eq 'comment')
2208             {
2209             # strip out everything from here to the next \n charater
2210             ( $comment_string, $string_after_comment_string)
2211             = split( /\n/ , $text, 2 );
2212              
2213             $text = "\n" . $string_after_comment_string;
2214              
2215             $state = 'code';
2216             }
2217              
2218             elsif ($state eq 'quote')
2219             {
2220             # get the text until the next quote mark and keep it as a string
2221             ( $quoted_string, $string_after_quoted_string)
2222             = split( /"/ , $text, 2 );
2223              
2224             $filtered_text .= $quoted_string . '"' ;
2225             $text = $string_after_quoted_string;
2226              
2227             $state = 'code';
2228             }
2229             }
2230              
2231             ###################
2232             # make everything lower case, VHDL identifiers are case insensitive
2233             ###################
2234             ### $filtered_text = lc($filtered_text);
2235             ## well, maybe this isn't such a good solution after all.
2236              
2237             return $filtered_text;
2238              
2239             }
2240              
2241              
2242             #########################################################################
2243             sub Filename
2244             #########################################################################
2245             {
2246             my $obj = shift;
2247              
2248             while(@_)
2249             {
2250             my $filename = shift;
2251             my $text = $obj->filename_to_text($filename);
2252             $text = $obj->decomment_given_text($text);
2253             $obj->design_file($text);
2254             }
2255             }
2256              
2257             #########################################################################
2258             sub filename_to_text
2259             #########################################################################
2260             {
2261             my ($obj,$filename)=@_;
2262             open (FILE, $filename) or die "Cannot open $filename for read\n";
2263             my $text;
2264             while()
2265             {
2266             $text .= $_;
2267             }
2268             return $text;
2269             }
2270              
2271              
2272             #########################################################################
2273             #########################################################################
2274             #########################################################################
2275             #########################################################################
2276             #########################################################################
2277             1;
2278             __END__