我重新表述了我之前提出的一个问题。目的是了解优先级在解析中的工作原理。
我想解析一个语句a(3).value = 100
。parser.mly
如下在读取后停止.
,并返回错误。
但是,如果我将专用于argument_list
(en-globed by begin
and end
) 的部分移动到文件的末尾(因此它位于 之后l_expression
),则解析效果很好。
在语句被解析的情况下,它被简化为 a let_statement
of data_manipulation_statement
; a(3).value
减少到member_access_expression
; a(3)
被简化为index_expression
; 并3
减少到argument_list
。
在无法解析语句的情况下,它似乎试图将语句的开头减少为 a call_statement
of control_statement
... 它以错误结束。
我一直认为,无论优先级是什么,解析总是拒绝那些不能以成功结束的归约。但那里似乎尝试过又失败了,拒绝尝试其他可能性……
谁能帮忙澄清一下?
statement:
| control_statement { $1 }
| data_manipulation_statement { BS_DMS $1 }
control_statement: | control_statement_except_multiline_if { BS_CSEMI $1 }
control_statement_except_multiline_if: | call_statement { $1 }
call_statement: | simple_name_expression argument_list { CSEMI_SNE_AL ($1, $2) }
data_manipulation_statement: | let_statement { $1 }
let_statement: | l_expression EQUAL expression { DMS_let (None, $1, $3) }
simple_name_expression: | name { $1 }
index_expression: | l_expression LPAREN argument_list RPAREN { IE_LE_AL ($1, $3) }
member_access_expression: | l_expression DOT unrestricted_name { MAE_LE_UN ($1, $3) }
literal_expression: | INTEGER { LIE_INT $1 }
unrestricted_name: | name { UN_N $1 }
name: | untyped_name { N_UN $1 }
untyped_name: | IDENTIFIER { UN_I $1 }
expression:
| l_expression { E_LE $1 }
| value_expression { E_VE $1 }
value_expression:
| literal_expression { VE_LIE $1 }
| parenthesized_expression { VE_PE $1 }
(***** begin argument_list *****)
argument_list: | positional_or_named_argument_list { AL_PONAL $1 }
positional_or_named_argument_list:
| positional_argument_COMMAs required_positional_argument { PONAL_PAs_RPA (List.rev $1, $2) }
positional_argument_COMMAs:
/* empty */ { [] }
| positional_argument_COMMAs positional_argument COMMA { $2 :: $1 }
positional_argument: | argument_expression { $1 }
required_positional_argument: | argument_expression { $1 }
argument_expression: | expression { AE_expression (None, $1) }
(***** end argument_list *****)
l_expression:
| simple_name_expression { LE_SNE $1 }
| index_expression { LE_IE $1 }
| member_access_expression { LE_MAE $1 }