私は以前に尋ねた質問を再定式化します。目的は、構文解析で優先順位がどのように機能するかを理解することです。
ステートメントを解析したいと思いa(3).value = 100
ます。parser.mly
次のようにすると、 の読み取り後に停止し.
、エラーが返されます。
ただし、専用の部分argument_list
( と で囲まれbegin
てend
いる) をファイルの最後 (つまり の後l_expression
) に移動すると、解析はうまく機能します。
ステートメントが解析される場合、それはlet_statement
of に縮小されdata_manipulation_statement
ます。a(3).value
に縮小されmember_access_expression
ます。a(3)
に縮小されindex_expression
ます。となり、3
に減少しargument_list
ます。
文が解析できない場合、文の先頭を of に縮めようとしているようでcall_statement
、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 }