【问题标题】:How to understand and fix conflicts in PLY如何理解和解决 PLY 中的冲突
【发布时间】:2017-06-06 03:35:26
【问题描述】:

我正在研究 SystemVerilog 解析器,并且遇到了许多层冲突(移位/减少和减少/减少)。

我目前有大约 170 多个冲突,我遇到的问题是我并不真正了解 PLY 生成的 parser.out 文件。如果没有正确理解我无能为力,所以我的目标是了解 ply 报告的内容。所有的 PLY 文档都很简短,解释性不是很好......

这里有我的一个州,显然是发现冲突的第一个州:

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 是处理语法规则并建立状态。这些状态中的每一个都根据进入的令牌做出决定。 因此,在我发布的这种状态(状态 24)中,例如,如果 PLUS 令牌等待在堆栈中移动,ply 将继续并“使用规则 134 减少”。我不明白的一件事是,那 ply 做什么?我的意思是它是否保持相同的状态(24)?是否只有在“attribute_instance”等待移入时,ply 才实际移动状态并进入状态 49?

另一个问题,状态开头列出的解析“快照”是什么意思?

(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 的堆栈状态?这可能吗?

如果有什么用,这里可以看看我的语法规则:

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>

【问题讨论】:

    标签: python parsing text-parsing ply


    【解决方案1】:

    在 LR 解析中,我们经常谈论“items”:item 是带有进度标记的产生式,通常用 • 书写,但有时用简单的.。状态只是项目的集合;实际上,状态告诉您解析可能在其中的一组产品。

    有一种特别特殊的物品类型:末尾有一个点的物品:

    (134) attribute_instance_optional_list -> attribute_instance_list .
    

    这表示可以完成的制作,因为进度标记位于末尾。如果这是正确的产生式,那么解析器必须用右手边代替左手边:这就是被称为“减少”的动作(因为它与“产生”相反,这就是“生产”确实)。

    但是,您处于可能减少的状态这一事实并不意味着减少是可能的。还需要下一个token与归约的结果一致。如果下一个标记不能跟随缩减的非终结符(在解析器状态的上下文中),则无法执行缩减,因此如果可能,解析器将尝试移位。

    换班真的很简单。如果状态中的一个或多个项目在当前前瞻符号之前有一个点,则可以进行移位。在这里,没有关于额外前瞻的问题,因为 Ply(像许多 LALR 解析器生成器一样)只创建在任何状态下只有一个前瞻的 LALR(1) 解析器,所以我们唯一需要做的就是我们当前的符号看,很明显,只有当某些可用项目在下一个位置具有该符号时,我们才能处理它。

    如果具有给定前瞻符号的给定状态既可以移位又可以减少,那么您就有移位-减少冲突;解析器不知道该怎么做。 (如果它既没有 shift 也没有 reduce 可用,则表明输入有语法错误。这就是 LR 解析器识别语法错误的方式。)

    LR 解析的一个重要方面是,如果要执行归约,则必须立即执行。也就是说,如果我们处于可能减少的状态,并且项目的前瞻集表明前瞻字符是可行的,我们必须执行减少。我们迫不及待地想看看以后是否有可能,因为没有以后可以减少。换句话说,项目中 • 左侧的任何内容都已尽可能减少。 (这是LR解析中的R,表示每次归约都是“最右”的你想知道。)

    我不妨提到的另一件事是,在 LALR 解析(“前瞻 LR 解析”)中,状态由项目集精确定义。每个项目都有一个适用的前瞻集,但前瞻集不构成状态标识的一部分。如果解析器生成器最终产生两个具有相同项目但不同前瞻集的状态,它必须将它们合并为一个状态,形成每个前瞻集的并集。对于完整的 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。大多数情况下,换档后的下一个符号将是非终结符,在这种情况下,我们需要添加该非终结符的所有产生式,点在开头。 (这就是状态最终有多于一项的方式。)例如,给定具有一项的新状态和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 之前添加了一个带点的项目):

    (141)   attr_spec -> . attr_name
    (142)   attr_spec -> . attr_name EQUALS constant_expression
    

    加上attr_name的制作:

    (143)   attr_name -> . identifier
    

    以此类推,直到我们不再看到新的非终端:

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

    好的,现在下一个令牌必须是 IDESCAPED_ID。假设它是ID。怎么办?好吧,我们将进入一个状态

    (350)   simple_identifier -> ID .
    

    可能会减少;假设前瞻符号与前瞻集匹配(我没有也不打算解释如何为每个状态计算前瞻集;有一个算法,但这里的细节不相关),那么ID 将减少到simple_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之后,我们最终得到了

    (297)   identifier -> simple_identifier .
    

    这是一个需要减少到identifier的状态,所以再次回到我们发现自己所处的相同状态

    (143)   attr_name -> identifier . 
    

    然后

    (141)   attr_spec -> attr_name .
    (142)   attr_spec -> attr_name . EQUALS constant_expression
    

    但是解析器是如何知道每次归约时要返回到哪个状态的呢?答案是解析器将当前状态推送到解析堆栈与每个符号。当它进行归约时,它从右侧弹出符号,丢弃每个关联的状态编号,直到到达右侧的开头,此时堆栈指示右侧的哪个状态来自。然后它会查看该状态,移动减少的非终结符,并将新的移动状态推送到解析堆栈。

    所以我认为这回答了“状态描述开头的行是什么意思?”的问题。和“解析器在归约后会进入什么状态?”其他两个问题很容易回答:“不,它不会计算所有可能的前驱状态”,以及“是的,它可以(尽管它最终可能会添加任何输入实际上不可能的前驱状态)但它不是对解析没有用。”但由于它们与解决 shift-reduce 冲突无关紧要,因此我不会进一步解释答案。

    回到实际的 shift-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 冲突的来源。在所有这些情况下,它后面都会跟一个非终结符,可能是:

    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  
    

    现在,如果这些非终结符中的任何一个可以以 LPAREN 开头,那么我们可能会发生 shift-reduce 冲突。还有几个罪魁祸首:expression 和类似的。

    所以,总而言之,有一个问题:attribute_instance 可以以括号开头,但attribute_instance_list 也可以后跟括号。所以当你在一个attribute_instance_list的中间并且你看到一个(时,你无法知道是移位还是减少。

    【讨论】:

    • 非常感谢 rici 的详细回答,我已经阅读了它,我怀疑我会继续回来看它,因为我不确定我是否得到了所有这些。谢谢!
    • 再问一个问题@rici,我有很多规则,如果你遵循兔子洞,最终以 ID 开头,就像 LPAREN 一样。它们之间的区别通常会在后面(在 ID 之后的令牌/结构上)进一步发现。为了避免这些冲突,有什么方法让 yacc 执行前瞻?我正在取消方法 =“LALR”。谢谢!
    • @user35634:bison 的 lalr 解析器只能做一个标记前瞻。将 LR(k) 语法重写为 LR(1) 总是可能的,但通常很乏味,但我不知道任何自动化工具。但是,您可以使用 bison 生成 GLR 解析器,它可以处理任何明确的语法。
    • 值得补充的是,verilog 解析起来真的很烦人。如果你在 SO 中搜索 verilog,你可能会找到一些语法片段的例子。
    • 对不起@rici,但是“SO for verilog”是什么意思?,SO 代表什么?我正在考虑使用野牛,因为它支持 GLR,而不是我理解它能够解决这些歧义。你怎么看?
    猜你喜欢
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 2011-05-12
    • 2018-05-15
    • 2012-01-09
    • 2016-02-22
    • 2013-11-09
    • 1970-01-01
    相关资源
    最近更新 更多