2017-01-21 3 views
2

SystemVerilogパーサーで作業していますが、多くの競合(shift/reduceとreduce/reduceの両方)が発生しています。PLYでの競合の理解と修正方法

私は現在170以上の競合がありますが、問題はPLYによって生成されたparser.outファイルを実際に理解していないことです。私ができることはほとんどないことを正しく理解していないので、私の目標はプライが報告していることを理解することです。

state 24 

(134) attribute_instance_optional_list -> attribute_instance_list . 
(136) attribute_instance_list -> attribute_instance_list . attribute_instance 
(138) attribute_instance -> . LPAREN ASTERISK attr_spec_list ASTERISK RPAREN 

    ! shift/reduce conflict for LPAREN resolved as shift 
    PLUS   reduce using rule 134 (attribute_instance_optional_list -> attribute_instance_list .) 
    MINUS   reduce using rule 134 (attribute_instance_optional_list -> attribute_instance_list .) 
    EXCLAMATION  reduce using rule 134 (attribute_instance_optional_list -> attribute_instance_list .) 
    NEG    reduce using rule 134 (attribute_instance_optional_list -> attribute_instance_list .) 
    AMPERSAND  reduce using rule 134 (attribute_instance_optional_list -> attribute_instance_list .) 
    NEGAMPERSAND reduce using rule 134 (attribute_instance_optional_list -> attribute_instance_list .) 
    PIPE   reduce using rule 134 (attribute_instance_optional_list -> attribute_instance_list .) 
    NEGPIPE   reduce using rule 134 (attribute_instance_optional_list -> attribute_instance_list .) 
    CARET   reduce using rule 134 (attribute_instance_optional_list -> attribute_instance_list .) 
    NEGCARET  reduce using rule 134 (attribute_instance_optional_list -> attribute_instance_list .) 
    UNBASED_UNSIZED_LITERAL reduce using rule 134 (attribute_instance_optional_list -> attribute_instance_list .) 
    STRING_LITERAL reduce using rule 134 (attribute_instance_optional_list -> attribute_instance_list .) 
    REAL_FLOATINGP_NUMBER reduce using rule 134 (attribute_instance_optional_list -> attribute_instance_list .) 
    REAL_FIXEDP_NUMBER reduce using rule 134 (attribute_instance_optional_list -> attribute_instance_list .) 
    INT_HEX_NUMBER reduce using rule 134 (attribute_instance_optional_list -> attribute_instance_list .) 
    INT_BINARY_NUMBER reduce using rule 134 (attribute_instance_optional_list -> attribute_instance_list .) 
    INT_OCTAL_NUMBER reduce using rule 134 (attribute_instance_optional_list -> attribute_instance_list .) 
    INT_DECIMAL_NUMBER reduce using rule 134 (attribute_instance_optional_list -> attribute_instance_list .) 
    UNSIGNED_NUMBER reduce using rule 134 (attribute_instance_optional_list -> attribute_instance_list .) 
    DOUBLEPLUS  reduce using rule 134 (attribute_instance_optional_list -> attribute_instance_list .) 
    DOUBLEMINUS  reduce using rule 134 (attribute_instance_optional_list -> attribute_instance_list .) 
    AT    reduce using rule 134 (attribute_instance_optional_list -> attribute_instance_list .) 
    TAGGED   reduce using rule 134 (attribute_instance_optional_list -> attribute_instance_list .) 
    INOUT   reduce using rule 134 (attribute_instance_optional_list -> attribute_instance_list .) 
    INPUT   reduce using rule 134 (attribute_instance_optional_list -> attribute_instance_list .) 
    OUTPUT   reduce using rule 134 (attribute_instance_optional_list -> attribute_instance_list .) 
    REF    reduce using rule 134 (attribute_instance_optional_list -> attribute_instance_list .) 
    ID    reduce using rule 134 (attribute_instance_optional_list -> attribute_instance_list .) 
    ESCAPED_ID  reduce using rule 134 (attribute_instance_optional_list -> attribute_instance_list .) 
    MODULE   reduce using rule 134 (attribute_instance_optional_list -> attribute_instance_list .) 
    MACROMODULE  reduce using rule 134 (attribute_instance_optional_list -> attribute_instance_list .) 
    LPAREN   shift and go to state 21 

    ! LPAREN   [ reduce using rule 134 (attribute_instance_optional_list -> attribute_instance_list .) ] 

    attribute_instance    shift and go to state 49 

私の知る限りプライ、文法規則を理解して:すべてのPLYのドキュメントは、あなたが私の状態のいずれか、競合が明らかに発見された場所を最初に持っている...ここで

簡単ではなく非常にexplainatoryです処理され、状態が構築されます。 したがって、私が(状態24)を投稿したこの状態では、PLUSトークンがスタック内でシフトするのを待っていた場合、プライは先に進んで "ルール134を使って減らす "。私が理解できないことの1つは、プライはどうしますか?私はそれが同じ状態(24)にとどまるのでしょうか?プライはactualy状態を移動させ、状態49になると、シフトインされるのを待っている、それはときにのみ「attribute_instance」となっていますか?

もう1つの質問は、状態の先頭に表示されている「スナップショット」を解析するとどういう意味ですか?

(134) attribute_instance_optional_list -> attribute_instance_list . 
(136) attribute_instance_list -> attribute_instance_list . attribute_instance 
(138) attribute_instance -> . LPAREN ASTERISK attr_spec_list ASTERISK RPAREN 

PLYは、状態24に達する可能性のあるすべてのスタック状態を計算しますか?それも可能ですか?

それはあらゆる使用の場合には、ここにあなたが私の文法のルールを見ることができます:LR解析で

Grammar 

Rule 0  S' -> source_text 
Rule 1  source_text -> timeunits_declaration description_list 
Rule 2  timeunits_declaration -> timeunit_and_precision 
Rule 3  timeunits_declaration -> timeunit 
Rule 4  timeunits_declaration -> timeprecision 
Rule 5  timeunits_declaration -> timeunit timeprecision 
Rule 6  timeunits_declaration -> timeprecision timeunit 
Rule 7  timeunits_declaration -> empty 
Rule 8  timeunit_and_precision -> TIMEUNIT time_literal SLASH time_literal SEMICOLON 
Rule 9  timeunit -> TIMEUNIT time_literal SEMICOLON 
Rule 10 timeprecision -> TIMEPRECISION time_literal SEMICOLON 
Rule 11 time_literal -> UNSIGNED_NUMBER time_unit 
Rule 12 time_literal -> REAL_FIXEDP_NUMBER time_unit 
Rule 13 time_unit -> S 
Rule 14 time_unit -> MS 
Rule 15 time_unit -> US 
Rule 16 time_unit -> NS 
Rule 17 time_unit -> PS 
Rule 18 time_unit -> FS 
Rule 19 description_list -> description_list description 
Rule 20 description_list -> description 
Rule 21 description -> module_declaration 
Rule 22 module_declaration -> module_nonansi_header timeunits_declaration module_item_list module_footer 
Rule 23 module_declaration -> module_ansi_header timeunits_declaration non_port_module_item_list module_footer 
Rule 24 module_declaration -> module_implicit_header timeunits_declaration module_item module_footer 
Rule 25 module_declaration -> EXTERN module_nonansi_header 
Rule 26 module_declaration -> EXTERN module_ansi_header 
Rule 27 module_nonansi_header -> attribute_instance_optional_list module_keyword lifetime module_identifier package_import_declaration_list parameter_port_list list_of_ports SEMICOLON 
Rule 28 module_ansi_header -> attribute_instance_optional_list module_keyword lifetime module_identifier package_import_declaration_list parameter_port_list list_of_port_declarations_list SEMICOLON 
Rule 29 module_implicit_header -> attribute_instance_optional_list module_keyword lifetime module_identifier LPAREN DOT ASTERISK RPAREN SEMICOLON 
Rule 30 module_keyword -> MODULE 
Rule 31 module_keyword -> MACROMODULE 
Rule 32 module_footer -> ENDMODULE COLON module_identifier 
Rule 33 module_footer -> ENDMODULE 
Rule 34 module_item -> port_declaration SEMICOLON 
Rule 35 module_item -> non_port_module_item 
Rule 36 port_declaration -> attribute_instance_optional_list inout_declaration 
Rule 37 port_declaration -> attribute_instance_optional_list input_declaration 
Rule 38 port_declaration -> attribute_instance_optional_list output_declaration 
Rule 39 port_declaration -> attribute_instance_optional_list ref_declaration 
Rule 40 port_declaration -> attribute_instance_optional_list interface_port_declaration 
Rule 41 inout_declaration -> INOUT net_port_type list_of_port_identifiers 
Rule 42 input_declaration -> INPUT net_port_type list_of_port_identifiers 
Rule 43 input_declaration -> INPUT variable_port_type list_of_variable_identifiers 
Rule 44 output_declaration -> OUTPUT net_port_type list_of_port_identifiers 
Rule 45 interface_port_declaration -> interface_identifier list_of_interface_identifiers 
Rule 46 interface_port_declaration -> interface_identifier DOT modport_identifier list_of_interface_identifiers 
Rule 47 ref_declaration -> REF variable_port_type list_of_variable_identifiers 
Rule 48 casting_type -> simple_type 
Rule 49 casting_type -> constant_primary 
Rule 50 casting_type -> signing 
Rule 51 casting_type -> STRING 
Rule 52 casting_type -> CONST 
Rule 53 data_type -> integer_vector_type optional_signing optional_packed_dimension 
Rule 54 data_type -> integer_atom_type optional_signing 
Rule 55 data_type -> non_integer_type 
Rule 56 data_type -> struct_union LBRACE struct_union_member_list RBRACE optional_packed_dimension_list 
Rule 57 data_type -> ENUM LBRACE optional_enum_name_declaration_list RBRACE optional_packed_dimension_list 
Rule 58 data_type -> ENUM enum_base_type LBRACE optional_enum_name_declaration_list RBRACE optional_packed_dimension_list 
Rule 59 data_type -> STRING 
Rule 60 data_type -> CHANDLE 
Rule 61 data_type -> VIRTUAL interface_identifier optional_parameter_value_assignment optional_modport_identifier 
Rule 62 data_type -> VIRTUAL INTERFACE interface_identifier optional_parameter_value_assignment optional_modport_identifier 
Rule 63 data_type -> type_identifier optional_packed_dimension_list 
Rule 64 data_type -> class_scope type_identifier optional_packed_dimension_list 
Rule 65 data_type -> package_scope type_identifier optional_packed_dimension_list 
Rule 66 data_type -> class_type 
Rule 67 data_type -> EVENT 
Rule 68 data_type -> ps_covergroup_identifier 
Rule 69 data_type -> type_reference 
Rule 70 data_type_or_implicit -> data_type 
Rule 71 data_type_or_implicit -> implicit_data_type 
Rule 72 implicit_data_type -> optional_signing optional_packed_dimension_list 
Rule 73 enum_base_type -> integer_atom_type optional_signing 
Rule 74 enum_base_type -> integer_vector_type optional_signing optional_packed_dimension 
Rule 75 enum_base_type -> type_identifier optional_packed_dimension 
Rule 76 enum_name_declaration -> enum_identifier optional_enum_identifier_pointer 
Rule 77 enum_name_declaration -> enum_identifier optional_enum_identifier_pointer EQUALS constant_expression 
Rule 78 optional_enum_identifier_pointer -> LBRACKET integral_number RBRACKET 
Rule 79 optional_enum_identifier_pointer -> LBRACKET integral_number COLON integral_number RBRACKET 
Rule 80 optional_enum_identifier_pointer -> empty 
Rule 81 class_scope -> class_type DOUBLECOLON 
Rule 82 class_type -> ps_class_identifier optional_parameter_value_assignment 
Rule 83 class_type -> ps_class_identifier optional_parameter_value_assignment parametrized_class_list 
Rule 84 parametrized_class_list -> parametrized_class_list DOUBLECOLON class_identifier optional_parameter_value_assignment 
Rule 85 parametrized_class_list -> DOUBLECOLON class_identifier optional_parameter_value_assignment 
Rule 86 integer_type -> integer_vector_type 
Rule 87 integer_type -> integer_atom_type 
Rule 88 integer_atom_type -> BYTE 
Rule 89 integer_atom_type -> SHORTINT 
Rule 90 integer_atom_type -> INT 
Rule 91 integer_atom_type -> LONGINT 
Rule 92 integer_atom_type -> INTEGER 
Rule 93 integer_atom_type -> TIME 
Rule 94 integer_vector_type -> BIT 
Rule 95 integer_vector_type -> LOGIC 
Rule 96 integer_vector_type -> REG 
Rule 97 non_integer_type -> SHORTREAL 
Rule 98 non_integer_type -> REAL 
Rule 99 non_integer_type -> REALTIME 
Rule 100 net_type -> SUPPLY0 
Rule 101 net_type -> SUPPLY1 
Rule 102 net_type -> TRI 
Rule 103 net_type -> TRIAND 
Rule 104 net_type -> TRIOR 
Rule 105 net_type -> TRIREG 
Rule 106 net_type -> TRI0 
Rule 107 net_type -> TRI1 
Rule 108 net_type -> UWIRE 
Rule 109 net_type -> WIRE 
Rule 110 net_type -> WAND 
Rule 111 net_type -> WOR 
Rule 112 net_port_type -> data_type_or_implicit 
Rule 113 net_port_type -> net_type data_type_or_implicit 
Rule 114 net_port_type -> net_type_identifier 
Rule 115 net_port_type -> INTERCONNECT implicit_data_type 
Rule 116 variable_port_type -> var_data_type 
Rule 117 var_data_type -> data_type 
Rule 118 var_data_type -> VAR data_type_or_implicit 
Rule 119 signing -> SIGNED 
Rule 120 signing -> UNSIGNED 
Rule 121 simple_type -> integer_type 
Rule 122 simple_type -> non_integer_type 
Rule 123 simple_type -> ps_type_identifier 
Rule 124 simple_type -> ps_parameter_identifier 
Rule 125 struct_union_member -> attribute_instance_optional_list data_type_or_void list_of_variable_decl_assignments 
Rule 126 struct_union_member -> attribute_instance_optional_list random_qualifier data_type_or_void list_of_variable_decl_assignments 
Rule 127 data_type_or_void -> data_type 
Rule 128 data_type_or_void -> VOID 
Rule 129 struct_union -> STRUCT 
Rule 130 struct_union -> UNION 
Rule 131 struct_union -> UNION TAGGED 
Rule 132 type_reference -> TYPE LPAREN expression RPAREN 
Rule 133 type_reference -> TYPE LPAREN data_type RPAREN 
Rule 134 attribute_instance_optional_list -> attribute_instance_list 
Rule 135 attribute_instance_optional_list -> empty 
Rule 136 attribute_instance_list -> attribute_instance_list attribute_instance 
Rule 137 attribute_instance_list -> attribute_instance 
Rule 138 attribute_instance -> LPAREN ASTERISK attr_spec_list ASTERISK RPAREN 
Rule 139 attr_spec_list -> attr_spec_list COMMA attr_spec 
Rule 140 attr_spec_list -> attr_spec 
Rule 141 attr_spec -> attr_name 
Rule 142 attr_spec -> attr_name EQUALS constant_expression 
Rule 143 attr_name -> identifier 
Rule 144 inc_or_dec_expression -> inc_or_dec_operator attribute_instance_optional_list variable_lvalue 
Rule 145 inc_or_dec_expression -> variable_lvalue attribute_instance_optional_list inc_or_dec_operator 
Rule 146 conditional_expression -> cond_predicate INTERROGATION attribute_instance_optional_list expression COLON expression 
Rule 147 constant_expression -> constant_primary 
Rule 148 constant_expression -> unary_operator attribute_instance_optional_list constant_primary 
Rule 149 constant_expression -> constant_expression binary_operator attribute_instance_optional_list constant_expression 
Rule 150 constant_expression -> constant_expression INTERROGATION attribute_instance_optional_list constant_expression COLON constant_expression 
Rule 151 constant_mintypmax_expression -> constant_expression 
Rule 152 constant_mintypmax_expression -> constant_expression COLON constant_expression COLON constant_expression 
Rule 153 constant_param_expression -> constant_mintypmax_expression 
Rule 154 constant_param_expression -> data_type 
Rule 155 constant_param_expression -> DOLLAR 
Rule 156 param_expression -> mintypmax_expression 
Rule 157 param_expression -> data_type 
Rule 158 param_expression -> DOLLAR 
Rule 159 constant_range_expression -> constant_expression 
Rule 160 constant_range_expression -> constant_part_select_range 
Rule 161 constant_part_select_range -> constant_range 
Rule 162 constant_part_select_range -> constant_indexed_range 
Rule 163 constant_range -> constant_expression COLON constant_expression 
Rule 164 constant_indexed_range -> constant_expression PLUSCOLON constant_expression 
Rule 165 constant_indexed_range -> constant_expression MINUSCOLON constant_expression 
Rule 166 expression -> primary 
Rule 167 expression -> unary_operator attribute_instance_optional_list primary 
Rule 168 expression -> inc_or_dec_expression 
Rule 169 expression -> LPAREN operator_assignment RPAREN 
Rule 170 expression -> expression binary_operator attribute_instance_optional_list expression 
Rule 171 expression -> conditional_expression 
Rule 172 expression -> inside_expression 
Rule 173 expression -> tagged_union_expression 
Rule 174 tagged_union_expression -> TAGGED member_identifier 
Rule 175 tagged_union_expression -> TAGGED member_identifier expression 
Rule 176 inside_expression -> expression INSIDE LBRACE open_range_list RBRACE 
Rule 177 value_range -> expression 
Rule 178 value_range -> LBRACKET expression COLON expression RBRACKET 
Rule 179 mintypmax_expression -> expression 
Rule 180 mintypmax_expression -> expression COLON expression COLON expression 
Rule 181 module_path_conditional_expression -> module_path_expression INTERROGATION attribute_instance_optional_list module_path_expression COLON module_path_expression 
Rule 182 module_path_expression -> module_path_primary 
Rule 183 module_path_expression -> unary_module_path_operator attribute_instance_optional_list module_path_primary 
Rule 184 module_path_expression -> module_path_expression binary_module_path_operator attribute_instance_optional_list module_path_expression 
Rule 185 module_path_expression -> module_path_conditional_expression 
Rule 186 module_path_mintypmax_expression -> module_path_expression 
Rule 187 module_path_mintypmax_expression -> module_path_expression COLON module_path_expression COLON module_path_expression 
Rule 188 part_select_range -> constant_range 
Rule 189 part_select_range -> indexed_range 
Rule 190 indexed_range -> expression PLUSCOLON constant_expression 
Rule 191 indexed_range -> expression MINUSCOLON constant_expression 
Rule 192 genvar_expression -> constant_expression 
Rule 193 constant_primary -> primary_literal 
Rule 194 primary_literal -> number 
Rule 195 primary_literal -> time_literal 
Rule 196 primary_literal -> UNBASED_UNSIZED_LITERAL 
Rule 197 primary_literal -> STRING_LITERAL 
Rule 198 number -> REAL_FLOATINGP_NUMBER 
Rule 199 number -> REAL_FIXEDP_NUMBER 
Rule 200 number -> INT_HEX_NUMBER 
Rule 201 number -> INT_BINARY_NUMBER 
Rule 202 number -> INT_OCTAL_NUMBER 
Rule 203 number -> INT_DECIMAL_NUMBER 
Rule 204 number -> UNSIGNED_NUMBER 
Rule 205 unary_operator -> PLUS 
Rule 206 unary_operator -> MINUS 
Rule 207 unary_operator -> EXCLAMATION 
Rule 208 unary_operator -> NEG 
Rule 209 unary_operator -> AMPERSAND 
Rule 210 unary_operator -> NEGAMPERSAND 
Rule 211 unary_operator -> PIPE 
Rule 212 unary_operator -> NEGPIPE 
Rule 213 unary_operator -> CARET 
Rule 214 unary_operator -> NEGCARET 
Rule 215 binary_operator -> PLUS 
Rule 216 binary_operator -> MINUS 
Rule 217 binary_operator -> ASTERISK 
Rule 218 binary_operator -> SLASH 
Rule 219 binary_operator -> PERCENT 
Rule 220 binary_operator -> ISEQUAL 
Rule 221 binary_operator -> NISEQUAL 
Rule 222 binary_operator -> CISEQUAL 
Rule 223 binary_operator -> NCISEQUAL 
Rule 224 binary_operator -> WISEQUAL 
Rule 225 binary_operator -> NWISEQUAL 
Rule 226 binary_operator -> DOUBLEAMPERSAND 
Rule 227 binary_operator -> DOUBLEPIPE 
Rule 228 binary_operator -> DOUBLEASTERISK 
Rule 229 binary_operator -> LT 
Rule 230 binary_operator -> LE 
Rule 231 binary_operator -> GT 
Rule 232 binary_operator -> GE 
Rule 233 binary_operator -> AMPERSAND 
Rule 234 binary_operator -> PIPE 
Rule 235 binary_operator -> CARET 
Rule 236 binary_operator -> NEGCARET 
Rule 237 binary_operator -> RSHIFT 
Rule 238 binary_operator -> LSHIFT 
Rule 239 binary_operator -> ARSHIFT 
Rule 240 binary_operator -> ALSHIFT 
Rule 241 binary_operator -> IMPLICATION 
Rule 242 binary_operator -> EQUIVALENCE 
Rule 243 inc_or_dec_operator -> DOUBLEPLUS 
Rule 244 inc_or_dec_operator -> DOUBLEMINUS 
Rule 245 unary_module_path_operator -> EXCLAMATION 
Rule 246 unary_module_path_operator -> NEG 
Rule 247 unary_module_path_operator -> AMPERSAND 
Rule 248 unary_module_path_operator -> NEGAMPERSAND 
Rule 249 unary_module_path_operator -> PIPE 
Rule 250 unary_module_path_operator -> NEGPIPE 
Rule 251 unary_module_path_operator -> CARET 
Rule 252 unary_module_path_operator -> NEGCARET 
Rule 253 binary_module_path_operator -> ISEQUAL 
Rule 254 binary_module_path_operator -> NISEQUAL 
Rule 255 binary_module_path_operator -> DOUBLEAMPERSAND 
Rule 256 binary_module_path_operator -> DOUBLEPIPE 
Rule 257 binary_module_path_operator -> AMPERSAND 
Rule 258 binary_module_path_operator -> PIPE 
Rule 259 binary_module_path_operator -> CARET 
Rule 260 binary_module_path_operator -> NEGCARET 
Rule 261 array_identifier -> identifier 
Rule 262 block_identifier -> identifier 
Rule 263 bin_identifier -> identifier 
Rule 264 c_identifier -> C_ID 
Rule 265 cell_identifier -> identifier 
Rule 266 checker_identifier -> identifier 
Rule 267 class_identifier -> identifier 
Rule 268 class_variable_identifier -> variable_identifier 
Rule 269 clocking_identifier -> identifier 
Rule 270 config_identifier -> identifier 
Rule 271 const_identifier -> identifier 
Rule 272 constraint_identifier -> identifier 
Rule 273 covergroup_identifier -> identifier 
Rule 274 covergroup_variable_identifier -> variable_identifier 
Rule 275 cover_point_identifier -> identifier 
Rule 276 cross_identifier -> identifier 
Rule 277 dynamic_array_variable_identifier -> variable_identifier 
Rule 278 enum_identifier -> identifier 
Rule 279 escaped_identifier -> ESCAPED_ID 
Rule 280 formal_identifier -> identifier 
Rule 281 formal_port_identifier -> identifier 
Rule 282 function_identifier -> identifier 
Rule 283 generate_block_identifier -> identifier 
Rule 284 genvar_identifier -> identifier 
Rule 285 hierarchical_array_identifier -> hierarchical_identifier 
Rule 286 hierarchical_block_identifier -> hierarchical_identifier 
Rule 287 hierarchical_event_identifier -> hierarchical_identifier 
Rule 288 hierarchical_identifier -> optional_identifier_constant_bit_select_list identifier 
Rule 289 hierarchical_identifier -> DOLLAR ROOT DOT optional_identifier_constant_bit_select_list identifier 
Rule 290 hierarchical_net_identifier -> hierarchical_identifier 
Rule 291 hierarchical_parameter_identifier -> hierarchical_identifier 
Rule 292 hierarchical_property_identifier -> hierarchical_identifier 
Rule 293 hierarchical_sequence_identifier -> hierarchical_identifier 
Rule 294 hierarchical_task_identifier -> hierarchical_identifier 
Rule 295 hierarchical_tf_identifier -> hierarchical_identifier 
Rule 296 hierarchical_variable_identifier -> hierarchical_identifier 
Rule 297 identifier -> simple_identifier 
Rule 298 identifier -> escaped_identifier 
Rule 299 index_variable_identifier -> identifier 
Rule 300 interface_identifier -> identifier 
Rule 301 interface_instance_identifier -> identifier 
Rule 302 inout_port_identifier -> identifier 
Rule 303 input_port_identifier -> identifier 
Rule 304 instance_identifier -> identifier 
Rule 305 library_identifier -> identifier 
Rule 306 member_identifier -> identifier 
Rule 307 method_identifier -> identifier 
Rule 308 modport_identifier -> identifier 
Rule 309 module_identifier -> identifier 
Rule 310 net_identifier -> identifier 
Rule 311 net_type_identifier -> identifier 
Rule 312 output_port_identifier -> identifier 
Rule 313 package_identifier -> identifier 
Rule 314 package_scope -> package_identifier DOUBLECOLON 
Rule 315 package_scope -> DOLLAR UNIT DOUBLECOLON 
Rule 316 optional_package_scope -> package_scope 
Rule 317 optional_package_scope -> empty 
Rule 318 parameter_identifier -> identifier 
Rule 319 port_identifier -> identifier 
Rule 320 production_identifier -> identifier 
Rule 321 program_identifier -> identifier 
Rule 322 property_identifier -> identifier 
Rule 323 ps_class_identifier -> optional_package_scope class_identifier 
Rule 324 ps_covergroup_identifier -> optional_package_scope covergroup_identifier 
Rule 325 ps_checker_identifier -> optional_package_scope checker_identifier 
Rule 326 ps_identifier -> optional_package_scope identifier 
Rule 327 ps_or_hierarchical_array_identifier -> optional_package_scope hierarchical_array_identifier 
Rule 328 ps_or_hierarchical_array_identifier -> implicit_class_handle DOT hierarchical_array_identifier 
Rule 329 ps_or_hierarchical_array_identifier -> class_scope hierarchical_array_identifier 
Rule 330 ps_or_hierarchical_net_identifier -> optional_package_scope net_identifier 
Rule 331 ps_or_hierarchical_net_identifier -> hierarchical_net_identifier 
Rule 332 ps_or_hierarchical_property_identifier -> optionnal_package_scope property_identifier 
Rule 333 ps_or_hierarchical_property_identifier -> hierarchical_property_identifier 
Rule 334 ps_or_hierarchical_sequence_identifier -> optional_package_scope sequence_identifier 
Rule 335 ps_or_hierarchical_sequence_identifier -> hierarchical_sequence_identifier 
Rule 336 ps_or_hierarchical_tf_identifier -> optional_package_scope tf_identifier 
Rule 337 ps_or_hierarchical_tf_identifier -> hierarchical_tf_identifier 
Rule 338 ps_parameter_identifier -> optional_package_scope parameter_identifier 
Rule 339 ps_parameter_identifier -> class_scope parameter_identifier 
Rule 340 ps_parameter_identifier -> ps_parameter_identifier_generate_list parameter_identifier 
Rule 341 ps_parameter_identifier_generate_list -> ps_parameter_identifier_generate_list DOT ps_parameter_identifier_generate 
Rule 342 ps_parameter_identifier_generate_list -> ps_parameter_identifier_generate 
Rule 343 ps_parameter_identifier_generate -> generate_block_identifier LBRACKET constant_expression RBRACKET 
Rule 344 ps_parameter_identifier_generate -> generate_block_identifier 
Rule 345 ps_type_identifier -> type_identifier 
Rule 346 ps_type_identifier -> LOCAL DOUBLECOLON type_identifier 
Rule 347 ps_type_identifier -> package_scope type_identifier 
Rule 348 sequence_identifier -> identifier 
Rule 349 signal_identifier -> identifier 
Rule 350 simple_identifier -> ID 
Rule 351 specparam_identifier -> identifier 
Rule 352 system_tf_identifier -> DOLLAR ID 
Rule 353 task_identifier -> identifier 
Rule 354 tf_identifier -> identifier 
Rule 355 terminal_identifier -> identifier 
Rule 356 topmodule_identifier -> identifier 
Rule 357 type_identifier -> identifier 
Rule 358 udp_identifier -> identifier 
Rule 359 variable_identifier -> identifier 
Rule 360 cond_predicate -> AT 
Rule 361 implicit_class_handle -> AT 
Rule 362 integral_number -> AT 
Rule 363 lifetime -> AT 
Rule 364 list_of_interface_identifiers -> AT 
Rule 365 list_of_port_declarations_list -> AT 
Rule 366 list_of_port_identifiers -> AT 
Rule 367 list_of_ports -> AT 
Rule 368 list_of_variable_decl_assignments -> AT 
Rule 369 list_of_variable_identifiers -> AT 
Rule 370 module_item_list -> AT 
Rule 371 module_path_primary -> AT 
Rule 372 non_port_module_item -> AT 
Rule 373 non_port_module_item_list -> AT 
Rule 374 open_range_list -> AT 
Rule 375 operator_assignment -> AT 
Rule 376 optional_enum_name_declaration_list -> AT 
Rule 377 optional_identifier_constant_bit_select_list -> AT 
Rule 378 optional_modport_identifier -> AT 
Rule 379 optional_packed_dimension -> AT 
Rule 380 optional_packed_dimension_list -> AT 
Rule 381 optional_parameter_value_assignment -> AT 
Rule 382 optional_signing -> AT 
Rule 383 optionnal_package_scope -> AT 
Rule 384 package_import_declaration_list -> AT 
Rule 385 parameter_port_list -> AT 
Rule 386 primary -> AT 
Rule 387 random_qualifier -> AT 
Rule 388 struct_union_member_list -> AT 
Rule 389 variable_lvalue -> AT 
Rule 390 empty -> <empty> 

答えて

2

、私たちはしばしば、「項目」について話:アイテムは、進行マーカーと生産され、通常、 •で書かれたが、時には簡単な.と。状態は単なるアイテムの集合です。実際には、状態は解析が内部にある可能性のある一連のプロダクションを示します。終わりにドットを持つアイテム:アイテムの特に特殊なタイプがある

(134) attribute_instance_optional_list -> attribute_instance_list . 

これは、進行マーカーが端にあるので、終了することができる生産を表します。それは正しい生産である場合、パーサは、次に左側のために右側を置き換える必要があります。これは、アクションが何A」であり、それは「生産」の反対であるので(「還元」と呼ばれ生産」はそうする)。

しかし、削減可能な状態にあるという事実だけでは、削減が可能であるということではありません。また、次のトークンは、縮小の結果と一致する必要があります。次のトークンは、(パーサの状態の文脈で)減少し、非末端に従わなかった場合、その削減を行うことができないので、1が可能な場合、パーサーは、シフトを試みます。

シフトは本当に簡単です。状態の1つ以上の項目が現在の先読み記号の前にドットを持つ場合、シフトが可能です。プライ(多くのLALRパーサジェネレータ等)のみだけでどのような状態で、単一の先読みを持ってLALR(1)パーサを作成するので、私たちが行かなければならない唯一のことは、我々が現在のシンボルであるため、ここでは、追加の先読みについての質問はありませんいくつかの利用可能なアイテムがそのシンボルを次の位置に持つ場合にのみ処理できることは合理的に明らかです。

特定の先読みシンボルを持つ特定の状態がシフトとリダクションの両方を行うことができる場合は、shift-reduce競合が発生します。パーサは何をすべきか分からない。 (シフトもリダクションも利用できない場合は、入力に構文エラーがあることを示します)。

LR解析の重要な側面の1つは、もしそれがまったく実行されるならば。つまり、削減可能な状態にあり、アイテムの先読みセットで先読み文字が実行可能であることが示されている場合、は縮小を実行する必要があります。私たちは待つことはできませんし、後で可能になるかどうかは、後で削減する必要がないためです。言い換えれば、項目内の•の左にあるものは、できるだけ多く縮小されています。 (これはLRRであり、すべての削減が「右端」であることを示しています。「右端」の使用が意味をなさない場合は、心配する必要はありません。 )

私が言及しているかもしれない別のことは、LALR解析(「Lookahead LR解析」)では、状態が項目のセットによって正確に定義されることです。各項目には適切な先読みセットがありますが、先読みセットは状態のIDの一部を構成しません。パーサジェネレータが、同じアイテムであるが先読みセットが異なる2つの状態を生成した場合、それらを単一の状態にマージして、各先読みセットの和集合を形成する必要があります。完全なLR解析の場合、この制限は存在しません。与えられた項目のセットに対して複数の状態を持たせることができます。その結果、解析テーブルはと大きく、やや強力です。

ここで、シフトアクションが可能な場合は、シフト後にどの状態がアクティブになるかを機械的に把握できます。例えば、

(134) attribute_instance_optional_list -> attribute_instance_list . 
(136) attribute_instance_list -> attribute_instance_list . attribute_instance 
(138) attribute_instance -> . LPAREN ASTERISK attr_spec_list ASTERISK RPAREN 

からLPARENをシフトした後、次の状態はただ一つの項目があります:

(138) attribute_instance -> LPAREN . ASTERISK attr_spec_list ASTERISK RPAREN 

を(ドットが移動したかに注意してください。)

単純なケースであったこと次のシンボルは端末であるため、ASTERISKです。たいていの場合、シフト後の次のシンボルは非終端記号になります。この場合、その非終端記号のすべてのプロダクトをドットの先頭に追加する必要があります。 (それは状態が複数のアイテムで終わる方法です。)例えば、1つのアイテムと入力がASTERISKの新しい状態(この状態には縮小可能性がないため、他のものはエラーになります)の場合、シフトされたアイテムを持つ状態に移行します:

(138) attribute_instance -> LPAREN ASTERISK . attr_spec_list ASTERISK RPAREN 

プラスattr_spec_listのためのすべての制作:

(139) attr_spec_list -> . attr_spec_list COMMA attr_spec 
(140) attr_spec_list -> . attr_spec 

プラス(私達はちょうどattr_spec前にドットで項目を追加したので)attr_specのためのすべての制作:

の生産プラス

(143) attr_name -> . identifier 

など、我々は新たな非ターミナルを見て停止するまで:

(297) identifier -> . simple_identifier 
(298) identifier -> . escaped_identifier 
(350) simple_identifier -> . ID 
(279) escaped_identifier -> . ESCAPED_ID 

OK、今次のトークンはIDまたはESCAPED_IDなければならないだろう。 IDとします。それで?さて、私たちは州に移ります。

(350) simple_identifier -> ID . 

可能な限り縮小します。先読みシンボルが先読みセットと一致すると仮定すると(私は先読みセットが各状態に対してどのように計算されるか説明しません;アルゴリズムはありますがその詳細はここでは関係ありません)、IDsimple_identifier 。ではパーサはどこに行くのですか?論理的には、simple_identifierプロダクションを生成した状態に戻り、simple_identifierをシフトします。偶然にも、状態は我々だけ

(138) attribute_instance -> LPAREN ASTERISK . attr_spec_list ASTERISK RPAREN 
(139) attr_spec_list -> . attr_spec_list COMMA attr_spec 
(140) attr_spec_list -> . attr_spec 
(141) attr_spec -> . attr_name 
(142) attr_spec -> . attr_name EQUALS constant_expression 
(143) attr_name -> . identifier 
(297) identifier -> . simple_identifier 
(298) identifier -> . escaped_identifier 
(350) simple_identifier -> . ID 
(279) escaped_identifier -> . ESCAPED_ID 

を作成したものであり、我々はsimple_identifierをシフトした後、我々は

ので、一度、 identifierへの削減を必要な状態である
(297) identifier -> simple_identifier . 

で終わります再び同じ状態にされた後、私たちはその後、

(143) attr_name -> identifier . 

で自分自身を見つけます
(141) attr_spec -> attr_name . 
(142) attr_spec -> attr_name . EQUALS constant_expression 

しかしパーサーは、これらの削減のそれぞれについてどのような状態に戻るべきかをどのように知っていましたか?答えはパーサーが現在の状態をすべてのシンボルを持つパッキングスタックにプッシュすることです。リダクションを実行すると、右側のシンボルがポップされ、関連する各ステート番号が破棄され、右側の先頭に移動します。この時点で、スタックはその右側の状態を示しますから来た。次に、その状態を調べ、縮小された非終端記号をシフトし、新しいシフトされた状態を解析スタックにプッシュします。

私は質問に答えていると思います。「州の説明の冒頭にある行はどういう意味ですか?」 「パーサーは削減後にどのような状態になるのですか?」他の2つの質問は簡単に答えることができます: "いいえ、それはすべての可能な先行国を計算しません"と "はい、それは可能です(実際には入力できない先行者を追加することになるかもしれませんが)解析には役に立ちません。しかし、彼らはシフト・リダクションの葛藤を解決することにひどくは関係していないので、私は答えをさらに説明しません。実際のシフト-reduce衝突に戻って

、状況は我々は状態の可能な削減を持って

(134) attribute_instance_optional_list -> attribute_instance_list . 
(136) attribute_instance_list -> attribute_instance_list . attribute_instance 
(138) attribute_instance -> . LPAREN ASTERISK attr_spec_list ASTERISK RPAREN 

にあることであり、我々はのために私たちがLPARENを参照する場合に、検討しています可能性のあるシフトがあり、最初の項目の先読みセットにはLPARENも含まれていることがわかります。先読みセットはPLY出力には表示されませんが、どこから来たのかを見るために文法を掘り下げることができます。即時のソースはもちろん、attribute_instance_optional_listで、かなりの数の可能性がありますが、私たちは、文法でそれを見つけることができます:

(27) module_nonansi_header -> attribute_instance_optional_list module_keyword lifetime module_identifier package_import_declaration_list parameter_port_list list_of_ports SEMICOLON 
(28) module_ansi_header -> attribute_instance_optional_list module_keyword lifetime module_identifier package_import_declaration_list parameter_port_list list_of_port_declarations_list SEMICOLON 
(29) module_implicit_header -> attribute_instance_optional_list module_keyword lifetime module_identifier LPAREN DOT ASTERISK RPAREN SEMICOLON 
(36) port_declaration -> attribute_instance_optional_list inout_declaration 
(37) port_declaration -> attribute_instance_optional_list input_declaration 
(38) port_declaration -> attribute_instance_optional_list output_declaration 
(39) port_declaration -> attribute_instance_optional_list ref_declaration 
(40) port_declaration -> attribute_instance_optional_list interface_port_declaration 
(125) struct_union_member -> attribute_instance_optional_list data_type_or_void list_of_variable_decl_assignments 
(126) struct_union_member -> attribute_instance_optional_list random_qualifier data_type_or_void list_of_variable_decl_assignments 
(144) inc_or_dec_expression -> inc_or_dec_operator attribute_instance_optional_list variable_lvalue 
(145) inc_or_dec_expression -> variable_lvalue attribute_instance_optional_list inc_or_dec_operator 
(146) conditional_expression -> cond_predicate INTERROGATION attribute_instance_optional_list expression COLON expression 
(148) constant_expression -> unary_operator attribute_instance_optional_list constant_primary 
(149) constant_expression -> constant_expression binary_operator attribute_instance_optional_list constant_expression 
(150) constant_expression -> constant_expression INTERROGATION attribute_instance_optional_list constant_expression COLON constant_expression 
(167) expression -> unary_operator attribute_instance_optional_list primary 
(170) expression -> expression binary_operator attribute_instance_optional_list expression 
(181) module_path_conditional_expression -> module_path_expression INTERROGATION attribute_instance_optional_list module_path_expression COLON module_path_expression 
(183) module_path_expression -> unary_module_path_operator attribute_instance_optional_list module_path_primary 
(184) module_path_expression -> module_path_expression binary_module_path_operator attribute_instance_optional_list module_path_expression 

は、私の知る限り見ることができるように、attribute_instance_optional_listのいずれかの最後に表示されません。これらのプロダクションは、LPARENの競合が発生する場所を簡単にします。これらの非端末のいずれかがLPARENで始めることができれば

module_keyword 
inout_declaration 
input_declaration 
output_declaration 
ref_declaration 
interface_port_declaration 
data_type_or_void 
random_qualifier 
variable_lvalue 
inc_or_dec_operator 
constant_primary 
constant_expression 
primary 
expression 
module_path_primary 
module_path_expression 

は今、私たちは可能なシフト-reduce衝突を持っています。これらすべてのケースでは、それは可能性があること、非ターミナルが続いています。そして、いくつかの犯人がリストから飛び出します:expressionと同様です。

したがって、要約すれば、attribute_instanceは括弧で始めることができますが、attribute_instance_listの後に括弧を付けることもできます。あなたがattribute_instance_listの真ん中にいるときに、)と表示されている場合は、移動するか縮小するかを知る方法がありません。

+0

精巧な答えriciありがとう、私はそれを読んで – viterbi

+0

もう1つの質問@rici、私はウサギの穴をたどった場合、最終的にはIDで始まることが多くのルールを持っていますが、 LPARENの場合と同じように、これらの間の違いは(IDの後ろにあるトークン/構造体上で)通常見つけられます。これらの競合を避けるためにyaccに先読みをさせることに賛成する人はいませんか?おかげで! – viterbi

+0

@ user35634:バイソンのlalrパーサーは、先読みトークンを1つしか実行できませんが、いつも可能ですが、通常は面倒です。 LR(k)文法をLR(1)に書き直しましたが、私はどの自動ツールも知らないです。ただし、明白な文法を扱うことができるbisonを使用してGLRパーサを生成することはできます。 – rici

関連する問題