如何理解和解决 PLY 中的冲突
How to understand and fix conflicts in PLY
我正在研究 SystemVerilog 解析器,我 运行 陷入许多层冲突(shift/reduce 和 reduce/reduce)。
我目前有 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 将继续 "reduce using rule 134"。我不明白的一件事是,那 ply 做了什么?我的意思是它是否保持相同的状态(24)?是否仅当 "attribute_instance" 正在等待移入时,当 ply 实际移动状态并进入状态 49 时?
另外一个问题,状态开头列出的解析"snapshots"是什么意思?
(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>
在LR解析中,我们经常说到"items":一个项目是一个带有进度标记的作品,通常用•写,但有时也用简单的.
。状态只是项目的集合;实际上,状态会告诉您解析可能位于其中的一组产生式。
有一种特别特殊的项目:末尾有一个点的项目:
(134) attribute_instance_optional_list -> attribute_instance_list .
这代表一个可以完成的作品,因为进度标记在最后。如果这是正确的产生式,那么解析器必须用 right-hand 端替换 left-hand 端:这就是被称为 "reducing" 的动作(因为它与 "producing",这就是 "production" 的作用)。
但是,仅仅处于可能减量的状态并不意味着减量是可能的。还需要下一个token与归约的结果一致。如果下一个标记不能跟在缩减后的 non-terminal 之后(在解析器状态的上下文中),则无法执行缩减,因此解析器将尝试移位(如果可能的话)。
轮班真的很简单。如果状态中的一个或多个项目在当前先行符号之前有点,则可以进行移位。在这里,没有关于额外前瞻的问题,因为 Ply(像许多 LALR 解析器生成器一样)只创建 LALR(1) 解析器,它在任何状态下都只有一个前瞻,所以我们唯一需要继续的就是我们当前的符号看着,很明显,只有当某个可用项目在下一个位置有该符号时,我们才能处理它。
如果具有给定前瞻符号的给定状态既可以移动又可以减少,那么就会发生 shift-reduce 冲突;解析器不知道该怎么做。 (如果它既没有可用的移位也没有可用的归约,则表明输入有语法错误。这就是 LR 解析器识别语法错误的方式。)
LR 解析的一个重要方面是,如果要执行归约,则必须立即执行归约。也就是说,如果我们处于可能减少的状态,并且项目的前瞻集表明前瞻字符是可行的,我们必须执行减少。我们迫不及待地想看看以后是否有可能,因为没有更晚的时间可以减少。换句话说,项目中• 左侧的任何内容都已尽可能减少。 (这是LR
解析中的R
,表示每次归约都是"rightmost",如果使用"rightmost"没有意义,不用担心; 我只是在你想知道的情况下才提到这个事实。)
我不妨提一下的另一件事是,在 LALR 解析 ("Lookahead LR parsing") 中,状态是由项目集精确定义的。每个项目都有一个适用的前瞻集,但前瞻集不构成状态标识的一部分。如果解析器生成器最终生成两个具有相同项目但不同前瞻集的状态,则它必须将它们合并为一个状态,形成每个前瞻集的并集。对于完整的 LR 解析,这个限制不存在;对于给定的一组项目,您可以(并且确实)有多个状态,结果是解析 table 比 多 更大,功能更强大。
现在,如果可以进行换档操作,您可以机械地计算出换档后哪个状态将处于活动状态。例如,来自
(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
。大多数时候,移位后的下一个符号将是 non-terminal,在这种情况下,我们需要添加该 non-terminal 的所有产生式,开头为点。 (这就是状态最终有多个项目的方式。)因此,例如,给定具有一个项目的新状态和 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
等等,直到我们不再看到新的 non-terminals:
(297) identifier -> . simple_identifier
(298) identifier -> . escaped_identifier
(350) simple_identifier -> . ID
(279) escaped_identifier -> . ESCAPED_ID
好的,现在下一个标记必须是 ID
或 ESCAPED_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
但是解析器如何知道在每次归约时要返回到哪个状态?答案是解析器将每个符号 的当前状态推入解析堆栈 。当它进行归约时,它从 right-hand 侧弹出符号,丢弃每个关联的状态编号,直到它到达 right-hand 侧的开头,此时堆栈指示哪个状态right-hand方从。然后查看该状态,移动减少的 non-terminal,并将新的移动状态推入解析堆栈。
所以我认为这回答了问题 "What do the lines at the beginning of the state description mean?" 和 "What state does the parser go to after a reduction?" 另外两个问题很容易回答:"No, it doesn't compute all the possible predecessor states" 和 "Yes, it could (although it might end up adding predecessors which are actually not possible with any input) but it isn't useful for the parse." 但因为它们不是与解决 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
冲突的来源。在所有这些情况下,它后面都跟着一个 non-terminal,可能是:
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
现在,如果这些 non-terminal 中的任何一个可以以 LPAREN
开头,我们可能会发生 shift-reduce 冲突。还有几个罪魁祸首 spring 不在列表中:expression
和类似的。
所以,问题来了,总结一下:attribute_instance
可以以括号开头,但是attribute_instance_list
后面也可以加括号。所以当你在 attribute_instance_list 中间看到 (,你无法知道是移动还是减少。
我正在研究 SystemVerilog 解析器,我 运行 陷入许多层冲突(shift/reduce 和 reduce/reduce)。
我目前有 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 将继续 "reduce using rule 134"。我不明白的一件事是,那 ply 做了什么?我的意思是它是否保持相同的状态(24)?是否仅当 "attribute_instance" 正在等待移入时,当 ply 实际移动状态并进入状态 49 时?
另外一个问题,状态开头列出的解析"snapshots"是什么意思?
(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>
在LR解析中,我们经常说到"items":一个项目是一个带有进度标记的作品,通常用•写,但有时也用简单的.
。状态只是项目的集合;实际上,状态会告诉您解析可能位于其中的一组产生式。
有一种特别特殊的项目:末尾有一个点的项目:
(134) attribute_instance_optional_list -> attribute_instance_list .
这代表一个可以完成的作品,因为进度标记在最后。如果这是正确的产生式,那么解析器必须用 right-hand 端替换 left-hand 端:这就是被称为 "reducing" 的动作(因为它与 "producing",这就是 "production" 的作用)。
但是,仅仅处于可能减量的状态并不意味着减量是可能的。还需要下一个token与归约的结果一致。如果下一个标记不能跟在缩减后的 non-terminal 之后(在解析器状态的上下文中),则无法执行缩减,因此解析器将尝试移位(如果可能的话)。
轮班真的很简单。如果状态中的一个或多个项目在当前先行符号之前有点,则可以进行移位。在这里,没有关于额外前瞻的问题,因为 Ply(像许多 LALR 解析器生成器一样)只创建 LALR(1) 解析器,它在任何状态下都只有一个前瞻,所以我们唯一需要继续的就是我们当前的符号看着,很明显,只有当某个可用项目在下一个位置有该符号时,我们才能处理它。
如果具有给定前瞻符号的给定状态既可以移动又可以减少,那么就会发生 shift-reduce 冲突;解析器不知道该怎么做。 (如果它既没有可用的移位也没有可用的归约,则表明输入有语法错误。这就是 LR 解析器识别语法错误的方式。)
LR 解析的一个重要方面是,如果要执行归约,则必须立即执行归约。也就是说,如果我们处于可能减少的状态,并且项目的前瞻集表明前瞻字符是可行的,我们必须执行减少。我们迫不及待地想看看以后是否有可能,因为没有更晚的时间可以减少。换句话说,项目中• 左侧的任何内容都已尽可能减少。 (这是LR
解析中的R
,表示每次归约都是"rightmost",如果使用"rightmost"没有意义,不用担心; 我只是在你想知道的情况下才提到这个事实。)
我不妨提一下的另一件事是,在 LALR 解析 ("Lookahead LR parsing") 中,状态是由项目集精确定义的。每个项目都有一个适用的前瞻集,但前瞻集不构成状态标识的一部分。如果解析器生成器最终生成两个具有相同项目但不同前瞻集的状态,则它必须将它们合并为一个状态,形成每个前瞻集的并集。对于完整的 LR 解析,这个限制不存在;对于给定的一组项目,您可以(并且确实)有多个状态,结果是解析 table 比 多 更大,功能更强大。
现在,如果可以进行换档操作,您可以机械地计算出换档后哪个状态将处于活动状态。例如,来自
(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
。大多数时候,移位后的下一个符号将是 non-terminal,在这种情况下,我们需要添加该 non-terminal 的所有产生式,开头为点。 (这就是状态最终有多个项目的方式。)因此,例如,给定具有一个项目的新状态和 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
等等,直到我们不再看到新的 non-terminals:
(297) identifier -> . simple_identifier
(298) identifier -> . escaped_identifier
(350) simple_identifier -> . ID
(279) escaped_identifier -> . ESCAPED_ID
好的,现在下一个标记必须是 ID
或 ESCAPED_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
但是解析器如何知道在每次归约时要返回到哪个状态?答案是解析器将每个符号 的当前状态推入解析堆栈 。当它进行归约时,它从 right-hand 侧弹出符号,丢弃每个关联的状态编号,直到它到达 right-hand 侧的开头,此时堆栈指示哪个状态right-hand方从。然后查看该状态,移动减少的 non-terminal,并将新的移动状态推入解析堆栈。
所以我认为这回答了问题 "What do the lines at the beginning of the state description mean?" 和 "What state does the parser go to after a reduction?" 另外两个问题很容易回答:"No, it doesn't compute all the possible predecessor states" 和 "Yes, it could (although it might end up adding predecessors which are actually not possible with any input) but it isn't useful for the parse." 但因为它们不是与解决 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
冲突的来源。在所有这些情况下,它后面都跟着一个 non-terminal,可能是:
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
现在,如果这些 non-terminal 中的任何一个可以以 LPAREN
开头,我们可能会发生 shift-reduce 冲突。还有几个罪魁祸首 spring 不在列表中:expression
和类似的。
所以,问题来了,总结一下:attribute_instance
可以以括号开头,但是attribute_instance_list
后面也可以加括号。所以当你在 attribute_instance_list 中间看到 (,你无法知道是移动还是减少。